新しいプリプロセッサへの移行

Other languages:
Shortcut:
NPP

Tim Starling氏(MediaWikiの開発者でありウィキメディアのシステム管理者)は、より堅実でflakyではなくなるようにパーサプリプロセッサを書き直しました。この文書では、ウィキメディア、とりわけウィキペディア英語版で行った、数千ものページのレンダリングの違いをランダムサンプリングすることによった新しいプリプロセッサの最小限ながら徹底的なテストとデバッグの第2段階について説明します。

新しいパーサでページをテストするには、パーサー比較テスト (Special:ParserDiffTest)が利用できます。現在のソースでページをテストするには、サブページの構文(例えばメインページをテストするにはSpecial:ParserDiffTest/Main Page)を使ってください。任意のソースによるページをテストするには、パーサー比較テストのページ内のフォームにソースを書いてください。その他については、Migration to the new preprocessor/how to testをご覧ください。

2008年1月25日に、英語版ウィキペディアとテストウィキは新しいプリプロセッサに切り替えられました。2008年2月22日には、すべてのウィキメディアのウィキで新しいプリプロセッサが施行されました。現在でも、プリプロセッサの変更によるバグ・問題の特定が求められています。

新旧どちらのプリプロセッサが有効になっているか確認するには、「{{#if:{{#if:x|{{{2}}}|}}|new pp|old pp}}」がソースである「new pp」←これがどう表示されるか見てください。プリプロセッサが変更されているならば、「new pp」が表示されます(キャッシュを無効にするために、最初に必ずページをpurgeしてください)。

意図された振る舞いの違い Expected differences

edit

これらは意図された振る舞いの違いです。これらは現在は修正されている以前のパーサのバグか、新しいパーサの「特徴」("features")のどちらかです。変更点は以前の動作へ戻すことがふさわしいものであれば、Tim Starling氏によって「検討の余地あり」とされています。

新しいパーサでより厳密に取り扱うものを古いパーサではやり過ごすことができたという点でこれらの多くは異なります。

テストケース 古いパーサとの違い 説明 例/修正 検討の余地は?
<h2>リンクの無い見出し (Unlinked header)</h2> XMLヘッダは編集リンクを作りません <h1><h2><h3>...などで作られたヘッダは編集可能なセクションを作りません。それらはセクションを編集しているときそれらはセクションのdivideを作りません。しかしながらそれらはリンクをするためにアンカーと同様にレベルを目次に追加します。これによって編集できないセクションをテンプレートに追加し、ページ上に編集可能なセクションを持ちます。これは__NOEDITSECTION__ではできません。 [1] 検討の余地あり
<noinclude>==リンクの無い見出し (Unlinked header)==</noinclude> noinclude/includeonlyタグ内に埋め込まれたヘッダはXMLヘッダとして振る舞います(下記を参照)。 新しいパーサはより厳密なヘッダ要件を持ちます。 [2] [3] Not really
<!-- </includeonly> --> includeonly/noincludeタグをコメントアウトできます。 新しいパーサはこれらのタグをコメント内で無効にできます。テンプレートデザインに考慮すべき変更です。 [4] [5] なし
編集可能なセクションのテンプレート トランスクルードされた編集セクションのリンクはT-接頭辞を持ちます。 これによってページ上の編集可能なセクションは少しは明確になります(T-(n-1)においてnは実際のセクション番号です). bugzilla:6563 Template:Infobox Election なし
{{template|{{#if:1|a=1}}}} 古いパーサ: {{{a}}} == "1"

新しいパーサ: {{{1}}} == "a=1"

parametervalue間の等号はテンプレートパラメータのデリミッタとして(トランスクルージョン、パラメータ、パーサー関数、など)生成されません。リテラルとして解釈されます。これによってジェネレータ外部の等号を移動させることが必要になります。 [6] [7][8] [9] [10][11] [12] [13] なし

{{#switch: {{#time:Y|blah}}
|Error: invalid time = Error
|{{#time:Y|blah}}
}}

古いパーサは#time error (a class="error") を #switch caseと見なします。 エラーをキャッチするために意図せずに活用された古いパーサの興味深いバグです。実装者はそれらが#timeのプレーンテキストエラーをキャッチしていると考えましたが、それらは実際には何も返さない新しい自己削除の#switchケースを作っていました。{{#time:Y|blah}}がエラーを生成したのであれば、それは等号をエラーの部分として生成し、#switchは最後のパラメータをデフォルトのパススルー(passthrough)としてではなくマッチケースとして見なします。これは次のようにも表現できます: {{#switch:1|{{#time:Y|Z}}}} ... 新しいパーサー関数がパーサー関数のエラーハンドリングのために作られました(すなわち、エラーを返すもの)。例です: {{#iferror:{{#time:Y|Z}}|error}} [14] なし
{{#if:1|{{template{{!}}parameter}} }} {{!}}はParserfunctionsでテンプレートデリミタとして動作しません これはbugzilla:5678に関連しておらず動作しません、また実際まったく必要ありません。w:Template:Selfの実装に見られるように、このバグによって最初のもの以外のパラメータがテンプレートパラメータを渡すことができるようになっていました。 [15] [16][17] [18][19] この構文については無し
{{#ifeq:1|1|[[Template:{{{1}}}|foo]]}} 新しいパーサで正しくレンダリングします。 bugzilla:5678 ~ なし
{{#switch:{{{g|}}}|g=|{{{g}}}}} 新しいパーサで正しくレンダリングします。 bugzilla:5678 ?? [20] [21] なし
{{#if:{{{2}}}|{{{2}}}|{{PAGENAME}}}} 新しいパーサで確実に失敗します。 古いパーサのバグです。nullであるテストケースの機会が存在しない場合#ifは決して使うべきではありません。{{{2|{{PAGENAME}}}}}のようなパラメータデフォルトを使うだけの場合、パーサー関数の使用は行き過ぎであることにも注意して下さい。bugzilla:5678?? [22][23][24][25][26][27][28][29][30][31] なし
Template:Loop/deloop -> {{Template:Loop/{{{1}}}}}
called with: {{Loop/deloop|deloop}}
新しいパーサではループを検知します。 ループの検知が新しいパーサでより厳密になります。特定の数字のループは同じページ上で免除されるので、noincudeセクションのドキュメントなどに例をインクルードできますが、例のように1つもしくは複数のレベルの潜在的なループはは可能ではありません(古いパーサにおいてそれらが幾分かバグのようであったとしても) [32] 検討の余地あり


x
<!-- 1 --><!-- 2 -->
y

古いパーサ: <p>x y</p>
新しいパーサ: <p>x</p><p>y</p>.
古いパーサにおいて、分離無しの、同じ行の複数のコメントは行が"食われる"現象(line-eating)を引き起こします。新しいパーサにおいて、引き起こされるline-eatingに対して1行上にコメントは1つのみでなければなりません。line-eating無しでは、プリプロセッサはxyの間の2つの改行をそのままにするので、メインのパスでパラグラフの中断を引き起こします。 [33] 検討の余地あり
<span title="{{#if:1|">x<span>}}">y</span> 間違って作られた (Badly formed) ウィキマークアップ (例えばhtml内部のパーサー関数) は異なるクリーンアップをされます。 古いパーサは最初にhtmlを解析し(replaceVariablesとエスケーピング)#ifを解析しません。結果としてリテラルのめちゃくちゃなものを表示しました。新しいパーサは#ifを最初に展開して(removeHTMLtagsを通して)<span title="">x<span>">y</span></span>をきれいにして<span title="">x<span>">y</span>を見ます。

カウンターの例は次のようになります: <span id="{{#expr:Z}}">z</span>。古いパーサはremoveHTMLtagsを最初に実行し<span>z</span>で終わります。一方で新しいパーサは#exprを最初に展開し、<strong class="error">Expression error: Unrecognised word "z"</strong>を生成し、結果として外部のspanをエスケープし<span id="<strong class="error">Expression error: Unrecognised word "z"</strong>">zを生成します。

[34] vs [35] なし
{{urlencode:<_&lt;_>_&gt;_}} {{urlencode}}{{anchorencode}}< and &lt;をパーサ間で異なるエスケープを行います。 新しいパーサはそれらのエンコード関数内部で< >&lt; &gt;の違いを伝えることができます。古いパーサはそれらを最初にエスケープして異なる結果を引き起こします。
old: %26lt%3B_%26lt%3B_%26gt%3B_%23gt%3B
new: %3C_%26lt%3B_%3E_%23gt%3B
[36].


= トップレベルの見出し =

新しいパーサでセクション編集リンクが見つからない {{foo | name = value}}のように、パーサがその値からテンプレートパラメータ名を分離する等号を求める場所において、見出しが表示される場合、ウィキテキストスタイルのレベル1の見出し(<h1>)はセクション編集リンクとしてマークされません。 名前付きのパラメータで passthru テンプレートを使って下さい。 検討の余地あり
<onlyinclude><span>テキスト</span> </onlyinclude> Onlyinclude改行記号の振る舞いは変更されました。 <onlyinclude>は完全に書き直されなければなりません。そして新しい振る舞いは改行に関して<includeonly>/<noinclude>のそれとマッチします。 ? なし
テンプレートの中の{{#expr:$1 + 1}} 展開される中の$1 ($1 in transclusion) からインターフェイスメッセージに。 MediaWiki:名前空間インターフェイスでトランスクルードされたテンプレートで動いている$1スタイルのメッセージ変数は、古いパーサの変わった振る舞い/バグでもはや動作しなくなります。 [37] なし

新しいパーサのバグ

edit

修正されたバグ

edit

デバッグの第2段階の間に発見された新しいプリプロセッサのバグで、修正されたもの。

注意:rev:リンクがついている修正はすぐに対処できそうなもの。
注意:これはもっといい表にできそうです。
Geography -
Cajetina -
Cajetina whitespaceに関連したリンクの問題
Tyler -
Kitchen header oddness -
x10 -
Jnlin -
#REDIRECT [[ページ#節]] 修正済み
例えばMorwen/13 -
==ほげほげ==<!--ふがふが--> 前もって〔予想された or 意図された〕違いで、now made the same in rev:30109
{{msgnw:}}の挙動 rev:30106
セクションの開始に使う「=」と名前 / 値のセパレータとの競合 新しいパーサでは条件文の中の最初のセクションは編集が不可能。高いレベルの見出しについては修正されたので、現在はレベル1の見出しでのみ発生する。
{{#if:1|
==== 編集不可能 ====
==== 編集可能 ====
}}
<!-- ~~~~ --> rev:30142で修正済み。
w:PlayStation 3 rev:30144で修正済み。
ぶかっこうな (malformed) ブレース(「{}」)の中の編集可能なセクション rev:30370
== セクション名 ==

{{

== [編集]のリンクが壊れている ==

}}

未解決のバグ

edit

これらはまだ未着手で修正されていない、新しいパーサで発見されたバグです。

Interesting bad input on a template (oldid if fixed). An apparent start of heading "\n==" breaks proper identification of template syntax on the same line, even if there is no valid end of heading.
|postcode_district = HD4
|postcode_area= HD   

==Sport|dial_code= 01484
|os_grid_reference=     
}}
$-style parameters in interface messages don't seem to work inside Parserfunctions unless escaped one level. (See e.g. the currently commented-out revert link on en:MediaWiki:Movepage-moved.)
{{urlencode:$1}}
{{((}}urlencode:$1{{))}}
$1 in w:MediaWiki:Readonlytext does not appear to resolve, during intermittent database lag. confirmation?
LabeledSectionTransclusion: Localized tags do not work with new parser, see Bugzilla:13024. On s:de:Seite:Carl Gottfried Neumann - Die elektrischen Kräfte 120.jpg and s:de:Seite:Carl Gottfried Neumann - Die elektrischen Kräfte 126.jpg the section are marked with <Abschnitt Anfang=§17 /> and <Abschnitt Ende=§17 /> Compare: s:de:Die elektrischen Kräfte/Zusammenstellung:§17 and http://de.wikisource.org/wiki/Die_elektrischen_Kr%C3%A4fte/Zusammenstellung:%C2%A717?timtest=oldpp
LabeledSectionTransclusion: sections nested in <poem> tags can no longer be transcluded. Compare S:ca:user:sanbeg and http://ca.wikisource.org/wiki/Usuari:Sanbeg?timtest=oldpp
Page-referencing magic word in a link, break with an asterisk, semicolon, or other line-start formatting character as the first character of the page name. (example)

Note that this is similar to the behavior of [[{{uc::}}foo]] [[{{uc:*}}foo]] [[{{uc:;}}foo]] (but this is consistent across parsers)

[[{{PAGENAME}}]]

on a page titled [[*]]

可能性のあるバグ

edit

事実だと確認されたバグがあれば、この前の節に付け加えてください。新しい可能性のあるバグについてはノートのこの節に書いてください。

よく確認されていないバグをここに書かないでください(ここに安易にバグを書かないでください、ということです)。この節には何も書かないでください。確認され、修正され、そしてexpectされたバグが上の節に書かれるべきで、可能性のあるバグはノートに書くべきです。

関連項目(すべきこと)

edit
新しいパーサに関連した片付けるべきことがらについては、Talk:Migration to the new preprocessorをご覧ください。