Mediawiki 程式說明/取段落

出自六年制學程
在2014年8月31日 (日) 20:49由丁志仁對話 | 貢獻所做的修訂版本

(差異) ←上個修訂 | 最新修訂 (差異) | 下一修訂→ (差異)
跳轉到: 導覽搜尋

Mediawiki 修改#除錯

由頁名/段名取段落wiki原文

步驟:

  1. 拆解頁名中的名字空間及純頁名
  2. $wgContLang->mNamespaceIds['名字空間']為該名字空間之id
  3. Title類別建構子為空方法,但Title::makeTitle(名字空間id,純頁名)可以得回Title物件
  4. new Article(Title物件)可以得回Article物件 $Article
  5. $Article->getContent()可以取回wiki原文
  6. 產生陣列 $Article->mParserOutput->mSections ,稱之為$sections
  7. $sections為註標索引陣列,每一元素為一段,元素值為段落描述陣列
  8. 查出某段名的段序號,即可代入 $wgParser->getSection($Article->getContent(),段序號)) 求該段的 wiki 原文

段落描述陣列

以「公共教育重設定」的第二段為例:

[toclevel] => 2,上一層level
[level] => 3,本段為第幾層
[line] => 時代的限制,段名
[number] => 1.1,幾之幾
[index] => 2,第幾段
[fromtitle] => 公共教育重設定,隸屬的頁名
[byteoffset] => 511,byte數
[anchor] => .E6.99.82.E4.BB.A3.E7.9A.84.E9.99.90.E5.88.B6,錨點
  1. line為段名
  2. index為段序號

從步驟3開始的程式說明

以「公共教育重設定」的第二段為例:

  • 步驟3,4,由頁名取文章
$Article=new Article(Title::makeTitle(0,'公共教育重設定'));
  • 步驟6,產生文章的段落描述,以下三行在Article類別,view()方法中
$parserOptions = $Article->getParserOptions();
$parserCache = ParserCache::singleton();
$Article->mParserOutput = $parserCache->get( $Article, $parserOptions );

不能用view()方法,不然會產生畫面中額外的bodytext輸出

  • 步驟7,由段名找段序號
$sectionLine='時代的限制';
$sectionIndex=0;
foreach($Article->mParserOutput->mSections as $v){
	if($v['line']==$sectionLine){$sectionIndex=$v['index'];break;}
}
  • 步驟8,傳回段落wiki原文
$wgParser->getSection($Article->getContent(),2);

相關方法屬性描述

  • 取回Title物件:Title::makeTitle(名字空間編碼,純名)
  • 取回Article物件:new Article(Title物件)
  • 取頁的wiki全文:Article物件getContent()方法
  • 產生文章的段落描述:Article物件view()方法
  • 各段描述陣列:Article物件->mParserOutput->mSections
  • 取段的wiki原文:$wgParser->getSection(全文,段序號)

其他說明

由請求的 URL 取段序號

$section=$wgRequest->getVal('section');

由Article透過RawPage求wiki全文

有Article其實可以直接用getContent()取回wiki原文,不必繞 RawPage 和 Revision

$rawPage=new RawPage($Article);	// 起RawPage須給入某Article
Revision::newFromTitle($rawPage->mTitle,$rawPage->mOldId)->getText();
  1. 給一個Article,用 RawPage 物件即可取得其頁名(title)及版本id(oldId)
  2. 用Revision類的newFromTitle方法套入版本id及頁名可以得到版本物件
  3. 用版本物件的getText()方法可以得到wiki原文