Mediawiki 程式說明
出自六年制學程
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; }