MediaWiki コンテンツビュー出力の最後を追いかけて

提供:yonewiki

MediaWikiへ戻る。

概要

 MediaWikiの記事を表示する部分がどこなのかを追いかける作業を少ししたので、記録


(WikiRoot)\include\OutputPage.php addHTML($text)


 このファイルのaddHTMLという関数に記事は一度、投げられるので、ここで記事を文字列形式で取得できる。ここでは、エスケープされるべきタグとかは<とか、>で格納されているっぽいな。ここで引数の$textの置換とかをするとMediaWikiが禁止しているタグとかを直接、有効にすることはできるっぽい。自分以外が編集する場合にはやってはいけない処理ともいえる。


addHTML関数は[ソースの編集]をして[変更を保存]したときはたくさんの関数から呼ばれますが、ページを閲覧(記事の読込み)をしたときは一度だけしか呼び出されません。呼び出され元は


(WikiRoot)\include\OutputPage.php addParserOutputText( ParserOutput $parserOutput, $poOptions = [] )


 この中にある$this->addHTML( $text );という部分が呼び出しています。ここで重要なのは$parserOutputを使って、$text = $parserOutput->getText( $poOptions );のようにして$textを取得してaddHTMLにその記事情報を渡しているということです。つまり、$parserOutputはgetTextメソッドによって文字列を取得できる状態になっているということです。このメソッドを使わないと、文字列が取り出せないかもです。


 そして、このaddParserOutputText関数を呼び出しているのが、


(WikiRoot)\include\OutputPage.php addParserOutput( ParserOutput $parserOutput, $poOptions = [] )


 の中にある$this->addParserOutputText( $parserOutput, $poOptions );という部分です。この関数を呼び出すのが、


(WikiRoot)\includes\page\Article.php doOutputFromParserCache(ParserOutput $pOutput, OutputPage $outputPage, array $textOptions)


 の中にある$outputPage->addParserOutput( $pOutput, $textOptions );という部分です。ここで使われる引数$pOutputはparserOutputの意味でpOutputなのかもしれませんね。さらに、この関数を呼び出しているのが


(WikiRoot)\includes\page\Article.php generateContentOutput(Authority $performer, ParserOptions $parserOptions, int $oldid, OutputPage $outputPage, array $textOptions): bool


 で正常な場合は関数の中の上側の方の$this->doOutputFromParserCache( $pOutput, $outputPage, $textOptions );で呼び出しています。下の方ではありません。2箇所呼び出しがあるのでちょっと注意が必要です。上ですよ。上。そして、この関数を呼び出しているのが、


(WikiRoot)\includes\page\Article.php view()


 の中にある$continue = $this->generateContentOutput( $user, $parserOptions, $oldid, $outputPage, $poOptions );です。view関数は引数をとりません。$pOutputはどこかで、クラスのメンバ変数なんかに保存されて処理が戻るという感じです。そこで、少しさかのぼって、この間の処理を調べてみると


(WikiRoot)\includes\page\Article.php generateContentOutput(Authority $performer, ParserOptions $parserOptions, int $oldid, OutputPage $outputPage, array $textOptions): bool


 の関数の中の$this->doOutputFromParserCache( $pOutput, $outputPage, $textOptions );と関数の終了を告げる2行あとにreturn true;の間の$this->doOutputMetaData( $pOutput, $outputPage );で$pOutputをメンバに保存しているようです。おいかけると


(WikiRoot)\includes\page\Article.php doOutputMetaData( ?ParserOutput $pOutput, OutputPage $outputPage )


 の中に$this->mParserOutput = $pOutput;としてclass Article implements Pageとして宣言された、mParserOutputメンバ変数に保存していました。この内容をまたどこかで、内容の変換処理などをしてから出力するのでしょう。


(WikiRoot)\includes\page\Article.php view()


 の関数に話を戻すと


(WikiRoot)\includes\actions\ViewAction.php show()


 の中の$this->getArticle()->view();で呼び出されていて、この関数を呼び出しているのが


(WikiRoot)\includes\MediaWiki.php performAction( Article $article, Title $requestTitle )


 の中の$action->show();で呼ばれています。今のところはここまでです。もうちょっと調べないと、どこでArticle::mParserOutputがindex.phpに向けて出力するのかはわからないです。また時間があるときに調べてみようと思います。


 これは、以下から呼び出されています。


(WikiRoot)\includes\MediaWiki.php performRequest()


 の中の$this->performAction( $article, $requestTitle );で呼ばれています。これは


(WikiRoot)\includes\MediaWiki.php main()


 の中の$this->performRequest();で呼ばれています。ここまでさかのぼってきたけど、出力されそうな命令はみかけなかったけどな。見落としたか。見落とす構造なのか。ムズイ。echoとかprintとかされるはずなんだけどな。なかなか出力を見つけられない。エラー用のechoはみかけたけどな。やっぱprintなのかな。printに出会えない。あ。main関数の最後にoutputResponsePayload( $content )ってある。めちゃくちゃあやしい。// If no exceptions occurred then send the output since it is safe nowっていうコメントもある。日本語だと//例外が発生しなかった場合は、安全なので出力を送信します。って書いてある。$this->outputResponsePayload( $outputWork() );引数は$outputWork()なんだな。


(WikiRoot)\includes\MediaWiki.php outputResponsePayload( $content )


 おー見つけた。これだ。print $content;あったね。MediaWiki.phpの中にあるやんか。


 サニタイズ処理とかの仕組みを知るためもう少し解読処理をすすめるつもりです。どうなっているのかは知っておいてもいいかなと思っています。情報処理のプレースホルダ知らなかったからな。戒めですよ。自分が使ってる巨大システムの中身がどうなっているか知りたいと思うのは変態なのかもしれません。せっかくオープンになってるのだし、知っていくのもいいよね。

 

MediaWikiへ戻る。