mediawiki:有没有办法自动创建重定向到当前页面的重定向页面?

时间:2012-03-16 02:10:09

标签: wiki mediawiki twiki

我的爱好是在个人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有插件,如

  • TOPICCREATE会在主题保存时自动创建主题或附加文件

更重要的是,我记得一个twiki插件,其名称我记不住或谷歌了,其中包括当前opage中某些子页面的文本。然后,您可以一起编辑所有这些页面并保存 - 并根据需要提取和分发文本。 (顺便说一下,如果你能记住tghat包的名字,请提醒我。它有一些问题,特别是文件锁定(IIRC它只锁定了顶层文件进行编辑,机器人子主题,所以你可能丢失的东西) 。))

但最后,结合参数化的templtes,几乎就是我需要的一切。

问:mediawiki有类似的东西吗?我找不到了。


我想我可以/可以编写自己的机器人来执行此类操作。

1 个答案:

答案 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.phpdouble redirect fixer code的各个部分,以及WikiPage::doEdit()的文档。 我实际上没有测试过这段代码,但我认为它至少有一个很好的工作机会。请注意,您需要在Wiki上创建MediaWiki:editsummary-auto-redir-to-section页面,以便为重定向编辑设置有意义的编辑摘要。