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 の定義のみが提供されます。または、少なくとも、これまでに執筆に取り掛かった唯一の定義です。
同じページで 2 つ以上のトピックを定義することもあります。

このような「A vs B」または複数の定義 D1、D2、... DN を含むその他のページングを作成する場合、[[A]] または [[B]] と言えるようにリダイレクト ページを自動的に作成したいと考えています。または [[D1]] .. [[DN]] 他のページで。

現時点では、そのようなページを作成する唯一の方法は手動です。追いつくのは難しい。

さらに、そのようなページを作成するときに、いくつかのページ テキスト (通常はカテゴリ) を提供したいと考えています。


別の例を次に示します: バリアント ページ名。同じ場所にリンクするページ名のいくつかのバリエーションを作成したいことがよくあります。例: [[マルチスレッド]]、[[マルチスレッド (MT)]]、[[MT (マルチスレッド)]]、[[MT]]

パイプリンクを使用するように言わないでください。それは私が欲しいものではありません!


TWiki には次のようなプラグインがあります。

  • TOPICCREATE は、トピックの保存時に自動的にトピックを作成するか、ファイルを添付します

それ以上に、あなたの現在の操作内の特定のサブページのテキストを含む twiki プラグインの名前を思い出したり、Google で検索したりできません。次に、これらすべてのページをまとめて編集して保存すると、必要に応じてテキストが抽出されて配布されます。(ちなみに、tghat パッケージの名前を覚えている場合は、思い出してください。特定の問題、特に wrt ファイルのロックがありました (IIRC は、編集のためにトップ ファイルのみをロックし、サブトピックをボットにロックしたため、内容を失う可能性がありました.))

しかし、この最後のものは、パラメーター化されたテンプレートと組み合わせることで、私が必要とするほとんどすべてのものになります。

Q: 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 に答える