1

我的爱好是在个人 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]] 在其他页面中。

目前,我知道创建此类页面的唯一方法是手动。很难跟上。

此外,在我创建这样一个页面时,我想提供一些页面文本 - 通常是一个类别。


这是另一个示例:变体页面名称。我经常发现我想创建一个页面名称的多个变体,所有这些变体都链接到同一个地方。例如[[多线程]]、[[多线程(MT)]]、[[MT(多线程)]]、[[MT]]

请不要告诉我使用管道链接。那不是我想要的!


TWiki 有插件,例如

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

不仅如此,我还记得一个 twiki 插件,我记不起它的名字,也记不起它的名字了,它包含了你当前页面中某些子页面的文本。然后,您可以一起编辑所有这些页面并保存 - 文本将根据需要被提取和分发。(顺便说一句,如果你记得 tghat 包的名称,请提醒我。它有一些问题,特别是 wrt 文件锁定(IIRC 它只锁定顶部文件进行编辑,bot 子主题,所以你可能会丢失东西.))

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

问:mediawiki 有类似的吗?我找不到它。


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

4

1 回答 1

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;
}

注意:此代码大部分基于来自 Title.php 的 pagemove 重定向创建代码双重重定向修复代码的点点滴滴,以及WikiPage::doEdit()的文档。 我还没有实际测试过这段代码,但我认为它至少有一个像样的工作机会。请注意,您需要MediaWiki:editsummary-auto-redir-to-section在 wiki 上创建页面,以便为重定向编辑设置有意义的编辑摘要。

于 2012-03-17T22:16:45.197 回答