2012-03-16 77 views
1

我的愛好是在個人wiki網站上寫下東西:http://comp-arch.net。 目前使用的是mediawiki(儘管我經常後悔選擇了它,因爲我需要每頁訪問控制。)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的插件,名字我不記得或谷歌了,包括您的當前opage中的某些子頁面的文本。然後,您可以一起編輯所有這些頁面,然後保存 - 並根據需要提取和分發文本。 (順便說一下,如果你還記得tghat包的名字,請提醒我一下,它存在一些問題,尤其是wrt文件鎖定(IIRC它只鎖定頂級文件進行編輯,將子主題加入,所以你可能會丟失東西))

但是,這最後,與參數化templtes,將幾乎所有我需要的。

問:mediawiki是否有類似的東西?我找不到它。


我想我可以/應該寫我自己的機器人來執行此類操作。

回答

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頁面,以便爲重定向編輯設置有意義的編輯摘要。

+0

非常感謝。 PHP不是我最喜歡的語言,但我可以破解它。 – 2012-03-18 03:10:01