Mediawiki 程式說明:修訂版本之間的差異

出自六年制學程
跳轉到: 導覽搜尋
includes/Title.php
includes/parser/Parser.php
第 12 行: 第 12 行:
 
==includes/parser/Parser.php==
 
==includes/parser/Parser.php==
 
本程式為 wiki 語法解析的核心。
 
本程式為 wiki 語法解析的核心。
 +
 +
負責取回跨 wiki 內容的方法發生問題,結果傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗]。將有問題段落列在後面:
 +
function fetchScaryTemplateMaybeFromCache( $url ) {
 +
global $wgTranscludeCacheExpiry;// 跨 wiki 快取生命週期,為 3600 秒,即一小時
 +
$dbr = wfGetDB( DB_SLAVE );
 +
// 暫存條件:目前時間減跨 wiki 快取生命週期
 +
$tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry );
 +
// 取transcache表tc_time及tc_contents欄,條件為tc_url為$url且tc_time長於暫存條件
 +
$obj = $dbr->selectRow( 'transcache', array( 'tc_time', 'tc_contents' ),
 +
array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) );
 +
// 如果找到快取內容,傳回
 +
if ( $obj ) {
 +
return $obj->tc_contents;
 +
}
 +
// 執行includes/HttpFunctions.php中MWHttpRequest類別的factory方法,以產生 HTTP 的請求物件
 +
$req = MWHttpRequest::factory( $url );
 +
// 執行請求,會得到結果狀態物件
 +
$status = $req->execute(); // Status object
 +
// 執行請求後取回的內容是空值
 +
$text = $req->getContent();
 +
// 執行請求後,結果狀態不是 OK,所以$text得到空值
 +
if ( $status->isOK() ) {
 +
$text = $req->getContent();
 +
// 執行請求後,getStatus()得 200 ,所以scarytranscludefailed-httpstatus錯誤提示不會執行
 +
} elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
 +
return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
 +
// 執行請求後,getStatus()得 200 ,所以傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗]
 +
} else {
 +
return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
 +
}
 +
// 以下更新跨 wiki 快取的欄值
 +
$dbw = wfGetDB( DB_MASTER );
 +
$dbw->replace( 'transcache', array( 'tc_url' ), array(
 +
'tc_url' => $url,
 +
'tc_time' => $dbw->timestamp( time() ),
 +
'tc_contents' => $text)
 +
);
 +
// 執行請求後,結果狀態如果是OK,傳回$text
 +
return $text;
 +
}

2013年10月27日 (日) 16:25的修訂版本

includes/Title.php

而Title類中 getLocalURL 方法中負責處理 interwiki 的部分有錯,因{{…}}的關係,造成 $namespace 變成 Template ,使URL插入多餘的「Template:」,需抑制修改:

#$namespace = $this->getNsText();
#if ( $namespace !=  ) {
	# Can this actually happen? Interwikis shouldn't be parsed.
	# Yes! It can in interwiki transclusion. But... it probably shouldn't.
#	$namespace .= ':';
#}
#$url = $interwiki->getURL( $namespace . $this->getDBkey() );// by jj

includes/parser/Parser.php

本程式為 wiki 語法解析的核心。

負責取回跨 wiki 內容的方法發生問題,結果傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗]。將有問題段落列在後面:

function fetchScaryTemplateMaybeFromCache( $url ) {
	global $wgTranscludeCacheExpiry;// 跨 wiki 快取生命週期,為 3600 秒,即一小時
	$dbr = wfGetDB( DB_SLAVE );
	// 暫存條件:目前時間減跨 wiki 快取生命週期
	$tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry );
	// 取transcache表tc_time及tc_contents欄,條件為tc_url為$url且tc_time長於暫存條件
	$obj = $dbr->selectRow( 'transcache', array( 'tc_time', 'tc_contents' ),
			array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) );
	// 如果找到快取內容,傳回
	if ( $obj ) {
		return $obj->tc_contents;
	}
	// 執行includes/HttpFunctions.php中MWHttpRequest類別的factory方法,以產生 HTTP 的請求物件
	$req = MWHttpRequest::factory( $url );
	// 執行請求,會得到結果狀態物件
	$status = $req->execute(); // Status object
	// 執行請求後取回的內容是空值
	$text = $req->getContent();
	// 執行請求後,結果狀態不是 OK,所以$text得到空值
	if ( $status->isOK() ) {
		$text = $req->getContent();
	// 執行請求後,getStatus()得 200 ,所以scarytranscludefailed-httpstatus錯誤提示不會執行
	} elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
		return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
	// 執行請求後,getStatus()得 200 ,所以傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗] 
	} else {
		return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
	}
	// 以下更新跨 wiki 快取的欄值
	$dbw = wfGetDB( DB_MASTER );
	$dbw->replace( 'transcache', array( 'tc_url' ), array(
		'tc_url' => $url,
		'tc_time' => $dbw->timestamp( time() ),
		'tc_contents' => $text)
	);
	// 執行請求後,結果狀態如果是OK,傳回$text
	return $text;
}