Mediawikiパヌサヌの仕組み



MediaWikiパヌサヌの翻蚳、公開されおいたす。



   2009   , , -,        ,  -,      ,     Mediawiki,      .
      
      







Mediawikiパヌサヌは、 Mediawiki゚ンゞンコヌドの基本的な郚分です。 これがないず、Wikipediaの蚘事にさたざたなタグセクション、リンク、写真を挿入できたせん。 他の蚘事のマヌクアップを衚瀺したり、すばやく倉曎するこずさえできたせんでした。 Wikiマヌクアップは、初心者でもHTMLの専門家でも簡単に曞くこずができるほど柔軟です。 このため、パヌサヌのコヌドはやや耇雑であり、長幎にわたっおそれを改善するための倚くの詊みが行われおきたした。 ただし、今日でも、䞖界最倧のりェブサむトの1぀であるりィキペディアにずっおは十分に高速です。 この貎重なしかし少し難解なコヌドの内郚を芋おみたしょう。





簡単な歎史


免責事項 私が理解しおいるように、この物語は䞻にりィキメディアのメヌリングリストに長幎参加しおきた議論や、りィキマニア䌚議2006の議論から集められたした。2008幎たで、Mediawikiパヌサヌは、 高速化のため1぀のパス内に維持するだけでなく、垞に新しいルヌルが既存のコヌドに远加されたずいう事実のためです。 時間が経぀に぀れお、パヌサヌコヌドは実際のスパゲッティコヌドになり、デバッグするのが非垞に難しく、改善するのがさらに難しくなりたした。 曞き換えるこずはほずんど䞍可胜でした。なぜなら ゚ンゞンのコアを指したす。 新しいコヌドのどこかで゚ラヌが発生した堎合、数癟䞇のりィキペディアペヌゞが䞀瞬で飛んできた可胜性がありたす。



どうする


この問題を解決する方法に぀いお倚くの議論が始たりたした。 誰かがパヌサヌをCで曞き盎すこずを提案したした。これにより、パヌサヌは高速になり、1぀のパスではなくルヌプでテキストを解析できるようになりたす。これは、Wikipediaペヌゞに含たれるテンプレヌトずサブパタヌンの数が増えるために必芁になりたした。 たた、Mediawikiの構文を倉曎しお、䞀郚の構造の分析のあいたいさを排陀する提案もありたしたたずえば、「」 ''倪字たたは斜䜓 ''倪字たたは斜䜓 '' ''たたはトリプルず䞭括匧の関係テンプレヌト。

最終的に、パヌサヌをPHPに残しCで曞き盎すずMediawiki開発者が2぀のクラスに分割されるため、パヌシングを前凊理ず解析の 2段階に分割するこずが決定されたした。 プリプロセッサの仕事は、wikitextをXML DOMずしお衚珟するこずでした。 解析の段階で、DOMツリヌは、有効な静的HTMLを取埗するために、必芁な数の反埩サむクルで凊理されたしたたずえば、テンプレヌトを眮き換えるため。 DOMのルヌプ凊理は非垞に高速で、XHTMLの芳点からも非垞に自然です。 PHPでは、このような凊理も非垞によくサポヌトされおいたす。



プリプロセッサ


Mediawiki゜ヌスフォルダヌには、2぀のバヌゞョンのプリプロセッサ、HashずDOMのバヌゞョンがあり、それぞれ/includes/parser/Preprocessor_Hash.phpず/includes/parser/Preprocessor_DOM.phpにありたす。

DOMバヌゞョンはHashバヌゞョンずほが同じであるため、DOMバヌゞョンに集䞭したすが、オプションのPHPコンポヌネントであるPHP XMLサポヌトを䜿甚するため、より高速に動䜜したす。 プリプロセッサクラスで最も重芁な関数はpreprocessToObjず呌ばれたす。 Preprocessor_DOM.phpファむル内には、プリプロセッサが䜿甚する他のいく぀かの重芁なクラスがありたすPPDStack、PPDStackElement、PPDPart、PPFrame_DOM、およびPPNode_DOM。



プリプロセッサはあなたが考えるよりも少ない


Mediawiki XMLはどのようなものですか 以䞋は、りィキテキスト「{{MySpattern}} this [[test]]」がXML衚珟でどのように芋えるかの䟋です。

 <root> <template> <title>mytemplate</title> </template> this is a [[test]] </root>
      
      







泚。 内郚リンクがたったく凊理されないこず。 プリプロセッサコヌドは、埌の段階で実行できる䜜業を回避したすそしお、これには理由がありたす。したがっお、プリプロセッサの唯䞀の実際の䜜業は、テンプレヌトおよび他のいく぀かのこずのためのXML芁玠を䜜成するこずです。 これらのこず、すなわち ベヌスノヌド完党なリストテンプレヌト、tplarg、コメント、ext、ignore、h



Wikitextを䜿甚したこずがある堎合は、これらの基本ノヌドに察応するマヌクアップが既にわかっおいたす。 念のため、ここにありたす







以䞊です。 それ以倖はすべお無芖され、元のりィキテキストずしおパヌサヌに返されたす。



プリプロセッサはどのように機胜したすか


ここでは特別なこずは䜕もありたせんが、いく぀かの蚀葉は蚀う䟡倀がありたす。 必芁なXML衚珟を取埗するために、プリプロセッサは、このテキストに含たれる文字数だけ、ルヌプ内でWikitextを通過したす。 構文のおかげで、テキスト内の䜕でも衚珟できる再垰パタヌンを正しく凊理する他の方法はありたせん。 したがっお、りィキペディアの蚘事に40,000文字が含たれおいる堎合、サむクルは40,000回の反埩で構成される可胜性がありたす。 これで、パヌサヌにずっお速床が非垞に重芁である理由が明らかになりたした。



自身の解析


XMLコヌドの生成に䜿甚される残りのプリプロセッサず远加のクラスをスキップしたす。 パヌサヌ自䜓に泚目し、Wikipediaの蚘事をクリックしたずきのパヌサヌの兞型的なケヌスを芋おみたしょう。 ただし、ここでは、りィキが可胜な手段でキャッシュされるこずを忘れおはなりたせん。したがっお、ペヌゞをクリックするたびにペヌゞの解析が発生するこずはほずんどありたせん。



Articleオブゞェクトから始たる、珟圚のバヌゞョンのペヌゞの兞型的なパヌサヌ呌び出しツリヌを次に瀺したす。

01.蚘事->ビュヌ
02.-蚘事-> getContent
03. ----蚘事-> loadContent
04. ------ Article-> fetchContent->デヌタベヌスから取埗したりィキテキストを返したす
05.-蚘事-> outputWikiText->解析の準備
06. ----パヌサヌ->解析
07. ------パヌサヌ-> internalParse
08. --------パヌサヌ-> replaceVariables
09. ----------パヌサヌ-> preprocessToDom
10. ------------プリプロセッサ-> preprocessToObj
11. ----------フレヌム->展開
12. --------パヌサヌ-> doTableStuff
13. --------パヌサヌ-> replaceInternalLinks
14. --------パヌサヌ-> replaceExternalLinks
15. ------パヌサヌ-> doBlockLevels
16. ------パヌサヌ-> replaceLinkHolders




これらの機胜を芋おみたしょう。 繰り返したすが、これらは䞻な関数であり、この䟋で呌び出されるすべおの関数ではありたせん。 項目2〜4は、デヌタベヌスから蚘事のりィキテキストを取埗しお返したす。 このテキストはoutputWikiTextオブゞェクトに枡され、Parser :: parse関数に枡すために準備されたす。

その埌、ポむント8〜11で再び興味深いものになりたす。 replaceVariables関数内で、テキストはDOM衚珟に倉わり、蚘事内の各文字のルヌプで、䞊蚘のテンプレヌト、サブパタヌン、および他のノヌドの開始ラベルず終了ラベルが怜玢されたす。



ポむント番号11は、Preprocessor_DOM.phpファむル䞊蚘の他のクラスの知識を必芁ずするため、ここでスキップする興味深いステップです。 ゚キスパンドは非垞に重芁な機胜であり、倚くのこず再垰呌び出しを含むを行いたすが、DOMノヌドからテキストを実際に抜出する仕事をするず蚀うだけで十分ですテンプレヌトはネストできるので、垞にフルテキストを取埗するわけではありたせん 3぀のタむプを陀いお、すべおのwikiタグを明らかにする反転された有効なHTMLテキスト含たれおいる各蚘事から、:テヌブル、リンク、およびリスト。 したがっお、䞊蚘の䟋では、「{{MyTemplate}} this [[test]]」expandはフォヌムのテキストを返したす。



「[[text]]をテンプレヌトからむンクルヌドしたした。これは[[test]]です」



この簡単な䟋からわかるように、テヌブル、リンク、リストを陀き、すべおがこの段階で敎理されおいたす。



リンクは特別な堎合です


はい、リンクには独自のセクションがありたす。 そしおおそらく、それらが線集に加えおwiki自䜓を䜜るものの最も重芁な郚分だからです。 ただし、パヌサヌコヌドの残りのマヌクアップから非垞に特別な方法で理解しおいるためです。 特別なのは、2぀の段階で凊理されるこずです。最初の段階では、各リンクに䞀意のIDが割り圓おられ、2番目の段階では、その有効なHTMLが「リンクホルダヌ」の堎所に挿入されたす。 この䟋では、最初の段階の埌に埗られた結果を以䞋に瀺したす。



「テンプレヌトに<-LINK 0->を含めたした。これは<-LINK 1->です。」



ご想像のずおり、リンクのテキストずフォヌムLINK #IDのIDを䞀臎させる配列もありたす。これはmLinkHoldersずいう名前のParserクラスの倉数です。 マッチングに加えお、この倉数は各リンクのTitleオブゞェクトも保存したす。



したがっお、リンクを解析する2番目のステップでは、この配列を䜿甚しお怜玢ず眮換を簡単にしたす。 今すべお 完成したテキストをドアの倖に送りたす



次のステヌゞ


次の投皿では、プリプロセッサずPreprocessor__DOM.phpファむルのクラスの詳现、぀たり初期DOM XMLツリヌを構築するためにどのように䜿甚されるかに集䞭したす。 Unbox拡匵機胜で情報ボックスをキャッシュするためにどのように䜿甚したかに぀いおも説明したす。



All Articles