我的爱好是在个人wiki网站上撰写内容:http://comp-arch.net。 目前正在使用mediawiki(虽然我经常后悔选择了它,因为我需要每页访问控制。)
我经常创建在同一页面上定义多个术语或概念的页面。例如。 http://semipublic.comp-arch.net/wiki/Invalidate_before_writing_versus_write_through_is_the_invalidate
这样的“A对B”页面通常只提供A和B的唯一定义。或者至少我到目前为止所写的唯一定义。
有时我会在同一页面上定义更多这两个主题。
如果我创建了这样一个“A vs B”或其他包含多个定义D1,D2,... DN的分页,我想自动创建重定向页面,这样我就可以说[其他页面中有[A]]或[[B]]或[[D1]] .. [[DN]]。
目前,我知道创建此类页面的唯一方法是手动完成。很难跟上。
此外,在我创建这样一个页面时,我想提供一些页面文本 - 通常是一个类别。
这里;另一个例子:变体页面名称。我经常发现我想创建一个页面名称的几个变体,所有变体都链接到同一个地方。例如 [多线程]] [[multithreading(MT)]], [[MT(多线程)]], [[MT]]
请不要告诉我使用管道链接。那不是我想要的!
TWiki有插件,如
更重要的是,我记得一个twiki插件,其名称我记不住或谷歌了,其中包括当前opage中某些子页面的文本。然后,您可以一起编辑所有这些页面并保存 - 并根据需要提取和分发文本。 (顺便说一下,如果你能记住tghat包的名字,请提醒我。它有一些问题,特别是文件锁定(IIRC它只锁定了顶层文件进行编辑,机器人子主题,所以你可能丢失的东西) 。))
但最后,结合参数化的templtes,几乎就是我需要的一切。
问:mediawiki有类似的东西吗?我找不到了。我想我可以/可以编写自己的机器人来执行此类操作。
答案 0 :(得分:1)
可以这样做,虽然我不知道这些扩展是否已经存在。如果您不反对PHP编码,可以使用ArticleSave和/或ArticleSaveComplete挂钩编写自己的编码。
这是一个ArticleSaveComplete钩子的示例,它将为页面上所有部分标题保存的页面创建重定向:
$wgHooks['ArticleSaveComplete'][] = 'createRedirectsFromSectionTitles';
function createRedirectsFromSectionTitles( &$page, &$user, $text ) {
// do nothing for pages outside the main namespace:
$title = $page->getTitle();
if ( $title->getNamespace() != 0 ) return true;
// extract section titles:
// XXX: this is a very quick and dirty implementation;
// it would be better to call the parser
preg_match_all( '/^(=+)\s*(.*?)\s*\1\s*$/m', $text, $matches );
// create a redirect for each title, unless they exist already:
// (invalid titles and titles outside ns 0 are also skipped)
foreach ( $matches[2] as $section ) {
$nt = Title::newFromText( $section );
if ( !$nt || $nt->getNamespace() != 0 || $nt->exists() ) continue;
$redirPage = WikiPage::factory( $nt );
if ( !$redirPage ) continue; // can't happen; check anyway
// initialize some variables that we can reuse:
if ( !isset( $redirPrefix ) ) {
$redirPrefix = MagicWord::get( 'redirect' )->getSynonym( 0 );
$redirPrefix .= '[[' . $title->getPrefixedText() . '#';
}
if ( !isset( $reason ) ) {
$reason = wfMsgForContent( 'editsummary-auto-redir-to-section' );
}
// create the page (if we can; errors are ignored):
$redirText = $redirPrefix . $section . "]]\n";
$flags = EDIT_NEW | EDIT_MINOR | EDIT_DEFER_UPDATES;
$redirPage->doEdit( $redirText, $reason, $flags, false, $user );
}
return true;
}
注意:此代码大部分基于pagemove redirect creating code from Title.php和double redirect fixer code的各个部分,以及WikiPage::doEdit()的文档。 我实际上没有测试过这段代码,但我认为它至少有一个很好的工作机会。请注意,您需要在Wiki上创建MediaWiki:editsummary-auto-redir-to-section
页面,以便为重定向编辑设置有意义的编辑摘要。