Mediawiki 擴展標籤

出自六年制學程
在2022年6月5日 (日) 21:04由丁志仁對話 | 貢獻所做的修訂版本

跳轉到: 導覽搜尋

原理解說

一、撰寫

(一)新版

於 extension.json 中設定要載入的 php 以及執行的勾子(hooks):
{
...
	"AutoloadClasses": {"擴展名": "php 檔相對路徑"},
	"Hooks": {"勾點": ["類別名::入口函式名"]}
...
}
如:
{
	"AutoloadClasses": {"Details": "includes/details.php"},
	"Hooks": {"ParserFirstCallInit": ["Details::init"]}
}
載入的 php 程式,如:
<?php
class Details {
	public static function init( Parser $parser ) {
		$parser->setHook( 'mwdetails', [ self::class, 'renderTagDetails' ] );
		// 當解析器看到 <mwdetails> 標籤時,就執行 renderTagDetails (見下文)
	}
	public static function renderTagDetails( $input, array $args, Parser $parser, PPFrame $frame ) {
		// 在本例中這個函數只是將 <mwdetails> 換成 <details> 再輸出它
		return "<details>".$input."</details>";
	}
}
?>

(二)舊版

<?php
$wgExtensionFunctions[] = 'wfDetails';
function wfDetails() {
        global $wgParser;
        $wgParser->setHook('mwdetails', 'renderDetails');
}
function renderDetails($input,$args) {
	return "<details>".$input."</details>";
}	
?>

二、使用

當用戶將標籤:<擴展標籤 arg1='xxx' arg2='xxx'>...input...</擴展標籤>添加到頁面時,解析器將調用實體化函式,傳入四個參數:

  1. $input:<擴展標籤>和</擴展標籤>標籤之間的輸入。如果是「開始與結束合體的標籤」,即<擴展標籤 />, $input 則輸入'null'
  2. $args:標籤屬性,像 HTML 標籤屬性一樣輸入;這是一個以屬性名稱作鍵的陣列(鍵-值對)。
  3. $parser:父解析器(一個解析器物件);更上級的外掛,使用它來獲取上下文標題,解析維基文字、大括號,註冊鏈接關係和依賴關係等。
  4. $frame:父框架(PPFrame物件)。它與$parser一起使用,為解析器提供有關調用外掛的上下文的更完整資訊。

三、設定

(一)新版

在 LocalSettings.php 中加
wfLoadExtension( '擴展資料夾' );

(二)舊版

MediaWiki 1.25 之前外掛名和外觀的配置是在 PHP 檔名或外觀名稱一致的,如 MyExtension.php 或 MySkin.php。
require_once "$IP/extensions/Hello/Hello.php";
require_once "$IP/extensions/FooBar/FooBar.php";
$wgFooBarEnable = true;
require_once "$IP/skins/Baz/Baz.php";
也可以寫成:
wfLoadExtensions( array( 'Hello', 'FooBar' ) );
$wgFooBarEnable = true;
wfLoadSkin( 'Baz' );
如果您將外掛放在 $IP/extensions 以外的位置,您需要重設 $wgExtensionDirectory 。如果您的皮膚未在 $IP/skins 中,您需要重設 $wgStyleDirectory 。重設必須在您載入任何外掛或皮膚前完成。
$wgExtensionDirectory = '/some/path';
wfLoadExtension('FooBar'); // 參看 /some/path/FooBar/extension.json
$wgStyleDirectory = '/my/skins';
wfLoadSkins(array('BarBaz','BazBar')); // 參看 /my/skins/BarBaz/skin.json 及 /my/skins/BazBar/skin.json

四、勾子

  • ParserFirstCallInit:語法解析一開始的時候
    1. Details ,HTML5 的展開收起標籤
  • BeforePageDisplay:顯示之前
    1. BoilerPlate 鍋爐板,用來示範的空擴展

參考資料

  1. 鉤子說明手冊
  2. 開發擴展手冊
  3. 外掛標籤手冊
  4. 外掛如何註冊
  5. 各類外掛手冊
  6. 穩定擴展說明
    1. poem的用法
    2. BoilerPlate
    3. Examples 一些用來擴展 BoilerPlate 的小擴展的集合

自行撰寫的外掛標籤

一、LinkedImages.php(已被封存)

原用於讓圖產生連結,是非常好的撰寫範例。

(一)已被封存

  1. MediaWiki 1.14 版之後支援語法 [[Image:圖名|寬px|link=目的頁]],如

    Go top.gif

    上述語法中,若 link= 留空,則該圖像將不再可點擊。
  2. 也可以使用 CSS ,請參考:https://www.mediawiki.org/wiki/Manual:Linked_images/zh#Site_CSS
  3. 有伺服器權限時,去啟用 $wgAllowExternalImages(允許來自任何域的外部圖像)或 $wgAllowExternalImagesFrom(限制域的列表),然後創建到「外部」圖像的「外部」鏈接。要使用完整 URL 而不是本地鏈接。
    也可以用 CSS plainlinks 類別來消除圖像,只留下該圖像的「外部鏈接」,如:
    http://jendo.org/wiki1231/images/4/49/Go_top.gif
  4. 使用 Raw HTML,請參考:https://www.mediawiki.org/wiki/Manual:Linked_images/zh#Raw_HTML
  5. 使用 Via extensions,請參考:https://www.mediawiki.org/wiki/Manual:Linked_images/zh#Via_extensions
  6. 您可以做一些更麻煩的事情,例如修改 /includes/Sanitizer.php (HTML標籤白名單在其中),然後將添加到允許的標籤列表中。

(二)舊外掛標籤的說明

(三)使用範例

「跳至頁首」內容為:
<p align='right'><linkedimage>
wikipage=#top
img_src=Go_top.gif
tooltip=跳頁首
img_alt=跳頁首
</linkedimage></p>

二、videoflash.php(已被封存)

在 videoflash.php 最前面的多行註解中,有使用範例。

適應 HTML4 和 5 ,是解析標籤所夾內容與標籤屬性的參考範例。

(一)為 EmbedVideo 所取代

(二)舊外掛標籤的說明

三、details.php(丁丁所寫)

用來使 HTML5 的 details、summary 兩標籤生效,會將 wiki 頁中的 mwdetails 標籤換成 details 標籤。

(一)在 mwdetails 標籤內部

  1. 所有的 HTML 標籤不會再被過濾掉,如: summary 標籤
  2. 可以在內部再放入巢狀的 details 標籤。如果外掛標籤名選用 details 而非 mwdetails 就無法在內部使用巢狀功能,因為外掛標籤結束和內層的 details 標籤結束,兩者會相混肴。
  3. 列點 wiki 語法,「#,*,:」均會被解譯
  4. 其他 wiki 語法:中括號、等號、單引號均不會被解譯

(二) details 標籤參考資料

四、test.php(丁丁所寫)

  1. 用來研究新舊版本 mediawiki 的全域變數與相關物件之用。
  2. 把要研究的東西賽進 renderTest 函式中
  3. 不錯學群/01/晨課/週三頁面觀察結果。
  4. 須要登入後,重按「編輯」與「儲存變更」,才會顯示新的結果。

五、sqlTbl.php(丁丁所寫)

  1. 把資料表以 select 指令,輸出為 wiki 表格
  2. 將參考 平台化討論.html 中 CSS .wikiInCell 類別的運用,改善表格內解析
  3. 參考 home.jendo.org 中 ET 類別 wiki 資料夾中 wikiInCell.php ,將表格內的列點 doBlockLevels 解析,並將#,*解析成對 .wikiInCell 適應的形式。
  4. 平台化/簡表當作開發測試對象

六、projectSchedule.php(丁丁所寫)

  1. 外觀請參考 討論:「推動我國跨校選修平台」計畫書之「projectSchedule」段。
撰寫格式:
<projectSchedule>
年=第一年;第二年
第一年=幾月;幾月
第二年=幾月;幾月;幾月;幾月;幾月
項目=第一個工作項目;第二個工作項目;第三個工作項目;…
第一個工作項目=第幾年/幾月;第幾年/幾月;第幾年/幾月
第二個工作項目=第幾年/幾月;第幾年/幾月;第幾年/幾月
第三個工作項目=第幾年/幾月;第幾年/幾月;第幾年/幾月
列高=…(預設25)
項目寬=…(預設130)
月份寬=…(預設42)
…
</projectSchedule>

可用屬性:

  1. font-family=字體(預設標楷體)
  2. font-size=字體大小(預設10pt)
  3. background=著色的色碼或顏色名稱(預設#aaccf2)

七、projectBudget.php(丁丁所寫)

  1. 外觀請參參考 討論:「推動我國跨校選修平台」計畫書之「projectBudget」段。
  2. 使用 DS218+ 上面 wiki 資料庫的「計畫經費」表,由「專案名稱」欄控制。
撰寫格式:
<projectBudget>
專案名稱=○○○○○○○○○○
計畫期程=□□□年□□月□□日至□□□年□□月□□日
列高=…(預設20)
</projectBudget>

可用屬性:

  1. tWidth=預算表寬度(預設510pt,印出為 18cm )
  2. font-family=字體(預設標楷體)
  3. font-size=字體大小(預設10pt)
  4. background=著色的色碼或顏色名稱(預設#f2f0aa)