Jump to content

Help:Extension:ParserFunctions

From mediawiki.org
This page is a translated version of the page Help:Extension:ParserFunctions and the translation is 100% complete.

ParserFunctions 拡張機能は MediaWiki の既存の「マジックワード 」を補完する11のパーサ関数を提供します。 (文字列処理のために追加のパーサー関数を提供するように設定できるかもしれません。ここでいう文字列関数の説明文書はこちら を参照してください。) この拡張機能が提供するすべてのパーサー関数は以下の形式です:

{{#関数名: 引数 1 | 引数 2 | 引数 3 ... }}
PD 注意: このページを編集すると、編集内容が CC0 のもとで公開されることに同意したと見なされます。詳細はパブリック・ドメインのヘルプ ページを参照してください。 PD

#expr

a more in-depth manual on the finer points of how the expression evaluator works, including some additional operators not covered hereについては、Manual:Expr parser function syntax を参照してください。
種類 演算子
グループ化 (括弧) ( )
数値 1234.5   e (2.718)   pi (3.142)
二項演算子 e   単項 +,-
単項 not ceil trunc floor abs exp ln sin cos tan acos asin atan sqrt
二項 ^
* / div mod fmod
+ -
四捨五入 round
論理 = != <> > < >= <=
and
or

この関数は、数式を計算してその計算結果を返します。 この関数はmw.ext.ParserFunctions.expr 関数を介して Scribunto でも使えます。

{{#expr: 数式 }}

Basic example

{{#expr: 1 + 1 }}2

表の右欄は使用できる演算子で、上ほど優先順位が高いものです。各演算子の機能の詳細は計算のヘルプ ヘルプ:Calculation を参照してください。出力結果の精度と形式には幅があり、ウィキを実行するサーバーのOSバージョン、サイト表示言語の数値形式の影響を受けます。

ブール代数を使用して評価する際、値がゼロなら false、非ゼロなら正の数でも負の数でも true と評価されます:

{{#expr: 1 and -1 }}1
{{#expr: 1 and 0 }}0
{{#expr: 1 or -1 }}1
{{#expr: -1 or 0 }}1
{{#expr: 0 or 0 }}0

空の入力式は空の文字列を返します。無効な式はいくつかのエラー メッセージのうちのいずれかを返します。このエラーは #iferror 関数を使用して捕捉できます:

{{#expr: }}
{{#expr: 1+ }}Expression error: Missing operand for +.
{{#expr: 1 = }}Expression error: Missing operand for =.
{{#expr: 1 foo 2 }}Expression error: Unrecognized word "foo".

数値の前後の加算および減算オペランドの順序は意味があり、誤った入力を持つオペランドとしてではなく、正または負の値として扱われる場合があります。

{{#expr: +1 }}1
{{#expr: -1 }}-1
{{#expr: + 1 }}1
{{#expr: - 1 }}-1

メモ: マジックワードの出力を使用する場合は、コンマを削除して数字を翻訳するために、それらをraw形式にする必要があることに注意してください。 たとえば、{{NUMBEROFUSERS}} は 17,958,309 になりますが、17958309 が必要です。これは {{formatnum :{{NUMBEROFUSERS}}|R}} を使用して取得できます。 これは、数字が翻訳される一部の言語では特に重要です。 たとえば、ベンガル語では、{{NUMBEROFUSERS}} は ৩০,০৬১ を生成します。

{{#expr:{{NUMBEROFUSERS}}+100}} Expression error: Unrecognized punctuation character ",".
{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}17958409
警告 警告: 演算子 mod は、第 2 引数の値によっては誤った結果を返す場合があります:
{{#expr: 123 mod (2^64-1)}}Division by zero. (空の文字列を返しますが、123 を返すべきです)
日付に基づいて計算を行う場合(たとえば、現在の日付と時刻が他の日付と時刻より後かどうかをテストする場合)、最初に{{#time: xNU }}を使用して時刻を1970年1月1日(UTC)以降の秒数に変換し、次に単純に加算して日付を数値として減算します。

四捨五入機能

左側の数字を四捨五入して 1/10 の倍数に切り上げ、べき指数は右側に与えられた数の小数点2ケタ目以下を切り上げた値に等しくなります。

切り上げや切り捨てを行うには、それぞれ単項のceilfloorを使用してください。

テスト ケース 結果 四捨五入の手法
{{#expr: 1/3 round 5 }} 0.33333 最終桁が 5 未満であるため、切り上げはされません (0.333333… → 0.33333)
{{#expr: 1/6 round 5 }} 0.16667 最終桁が 5 以上であるため、切り上げされます (0.166666… → 0.16667)
{{#expr: 8.99999/9 round 5 }} 1 この場合も、結果は最後の桁で切り上げられ、追加の切り上げが行われます。 (0.999998… → 1.00000 → 1)
{{#expr: 1234.5678 round -2 }} 1200 負の値は小数点の左側に丸められるため、100に最も近い値に丸められます。
{{#expr: 1234.5678 round 2 }} 1234.57 正の値は小数点の右側に丸められるため、最も近い100番目に丸められます
{{#expr: 1234.5678 round 2.3 }} 1234.57 round の右の値の小数点以下は、丸めの結果には影響しません
{{#expr: trunc 1234.5678 }} 1234 小数点以下の切り捨て
最も近い整数への丸め
{{#expr: 1/3 round 0 }} 0 最も近い整数への切り捨てで 0
{{#expr: 1/2 round 0 }} 1 最も近い整数への切り上げで 1
{{#expr: 3/4 round 0 }} 1 最も近い整数への切り上げで 1
{{#expr: -1/3 round 0 }} -0 最も近い整数への切り上げで 0
{{#expr: -1/2 round 0 }} -1 最も近い整数への切り捨てで -1
{{#expr: -3/4 round 0 }} -1 最も近い整数への切り捨てで -1
ceillfloor による切り上げや切り捨て
{{#expr: ceil(1/3) }} 1 次に大きい整数まで
{{#expr: floor(1/3) }} 0 次の「小さい」整数、つまりゼロまで
{{#expr: ceil(-1/3) }} -0 最も近い整数への切り上げで 0
{{#expr: floor(-1/3) }} -1 負の整数である次の小さい整数まで
{{#expr: ceil 1/3 }} 0.33333333333333 1が既に整数であるため、丸めは行なわれません
警告 警告: あなたの予想とは異なり、ceil(1/3)ではなく(ceil 1)/3と解釈される
Rounding large numbers
{{#expr: 1e-92 round 400 }} 1.0E-92 Rounding to a very large number leads to infinity. Hence, the original value without the infinity is given as the answer.
{{#expr: 1e108 round 200 }} 1.0E+108 Same as above.


文字列

式は数値のような値でのみ機能し、文字列や文字を比較することはできません。代わりに#ifeqを使用できます。

{{#expr: "a" = "a" }}Expression error: Unrecognized punctuation character """.
{{#expr: a = a }}Expression error: Unrecognized word "a".
{{#ifeq: a | a | 1 | 0 }}1

#if

この関数はテスト文字列を評価し、それが空であるかどうかを判定します。空白のみを含むテスト文字列は空であると見做されます。

{{#if: テスト文字列 | テスト文字列が空ではない場合の値 | テスト文字列が空 (または空白のみ) の場合の値}}
{{#if: パラメーター 1 | パラメーター 2 | パラメーター 3 }}

この関数は、初めに最初の引数が空でないか確かめます。最初の引数が空でない場合、2 番目の引数を表示します。最初の引数が空または空白文字(空白、改行等)のみを含む場合、3 番目の引数を表示します。

{{#if: | yes | no}}no
{{#if: string | yes | no}}yes
{{#if: &nbsp;&nbsp;&nbsp;&nbsp; | yes | no}}no
{{#if: | yes | no}}no

テスト文字列は常に純粋なテキストとして評価されます。そのため数式は評価されません (#ifexpr を参照):

{{#if: 1==2 | yes | no }}yes
{{#if: 0 | yes | no }}yes

最後の引数 (false) は省略可能です:

{{#if: foo | yes }} yes
{{#if: | yes }}
{{#if: foo | | no}}

関数はネストできます。これを行うには、囲んでいる #if 関数のパラメーターの代わりに、内部の #if 関数を完全な形式でネストします。ウィキやメモリ制限によって異なりますが、最大7レベルのネストが可能です。

{{#if:テスト文字列
|テスト文字列が空ではない場合の値
|{{#if:テスト文字列
  |テスト文字列が空ではない場合の値
  |テスト文字列が空 (または空白のみ) の場合の値
  }}
}}

テスト文字列が空ではない場合の値

#if 文において引数をテスト文字列として用いることも可能です。変数名の後には |(パイプ記号)を追加する必要があります。 (そのため、パラメーターに値がない場合は、文字列 "{{{1}}}"ではなく空の文字列に評価されます。)

{{#if:{{{1|}}}|変数1にテキストを入力しました|変数1にテキストがありません}}

このパーサー関数の他の例については Help:テンプレート内でのパーサー関数 を参照してください。

#ifeq

このパーサー関数は、2つの入力文字列を比較し、それらが同一であるかどうかを判断し、結果に基づいて2つの文字列のうちの1つを返します。 さらに比較と出力文字列が必要な場合は、#switchの使用を検討してください。

{{#ifeq: string 1 | string 2 | value if identical | value if different }}

両方の文字列が有効な数値である場合、文字列は数値的に比較されます。

{{#ifeq: 01 | 1 | equal | not equal}}equal
{{#ifeq: 0 | -0 | equal | not equal}}equal
{{#ifeq: 1e3 | 1000 | equal | not equal}}equal
{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}equal

それ以外は文字列として比較します。その場合は大文字小文字を識別します。

{{#ifeq: foo | bar | equal | not equal}}not equal
{{#ifeq: foo | Foo | equal | not equal}}not equal
{{#ifeq: "01" | "1" | equal | not equal}}not equal  (引用符なしで、上記の同様の例と比較してください)
{{#ifeq: 10^3 | 1000 | equal | not equal}}not equal  (前述した同様の例と対比してみるには、#expr は有効な特定の数値を先に返します)

実用的な例として、既存のテンプレート Template:Timer をパーサーを使用して、短い時間と長い時間の2つの標準時間から選択するとします。 文字列「short」と比較する最初の入力としてパラメータを取ります–順序の規則はありませんが、パラメーターが最初にある方が読みやすくなります。 テンプレートコードは次のように定義されています:

{{#ifeq: {{{1|}}} | short | 20 | 40 }}

次のようになります:

{{timer|short}}20
{{timer|20}}40
{{timer}}40
警告 警告: パーサー関数内で使用する場合、パーサータグおよびその他のパーサー関数は一時的に一意のコード に置き換える必要があります。 これは比較に影響します:
{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | equal | not equal}}not equal
{{#ifeq: <math>foo</math> | <math>foo</math> | equal | not equal}}not equal
{{#ifeq: {{#tag:math|foo}} | {{#tag:math|foo}} | equal | not equal}}not equal
{{#ifeq: [[foo]] | [[foo]] | equal | not equal}}equal
比較するどの文字列も、そのタグを含む同じテンプレート を呼び出す場合は真、そのタグを含み内容が同じだが別々のテンプレートを呼び出す場合は偽。
警告 警告: PAGENAMEマジックワード との文字通りの比較は、サイトの構成によっては失敗する場合があります。 たとえば、ウィキによっては、{{FULLPAGENAME}}が最初の文字を大文字にし、すべてのアンダースコアをスペースに置き換える場合があります。

これを回避するには、両方のパラメーターにマジックワードを適用します。

{{#ifeq: {{FULLPAGENAME: L'Aquila}} | {{FULLPAGENAME}} | equal | not equal}}equal

#iferror

この関数は入力文字列を取り、2つの結果から1つを返します。この関数は、 #expr#time#rel2abs のような他のパーサー関数、ループや再帰のようなテンプレートエラー、その他の「フェースソフト」なパーサーエラーによって作られた class="error" を含む HTML オブジェクトが入力文字列に含まれていた場合に true と評価します。

{{#iferror: test string | value if error | value if correct }}

返値の文字列の一方または両方が省略できます。もし correct の文字列が省略されていた場合、エラーがないのであれば test string が返されます。 error の文字列も省略されていた場合は、エラー時にから文字列が返されます。

{{#iferror: {{#expr: 1 + 2 }} | error | correct }}correct
{{#iferror: {{#expr: 1 + X }} | error | correct }}error
{{#iferror: {{#expr: 1 + 2 }} | error }}3
{{#iferror: {{#expr: 1 + X }} | error }}error
{{#iferror: {{#expr: 1 + 2 }} }}3
{{#iferror: {{#expr: 1 + X }} }}
{{#iferror: {{#expr: . }} | error | correct }}correct
{{#iferror: <strong class="error">a</strong> | error | correct }}error

エラーによっては追跡カテゴリを生じさせ、{{#iferror:}} を当てても同カテゴリの追加を回避できません。

#ifexpr

この関数は数式を評価し、結果の真偽値に応じて2つの文字列のいずれかを返します:

{{#ifexpr: expression | value if true | value if false }}

expression 入力は、上記の#exprとまったく同じように評価され、同じ演算子を使用できます。次に、出力は真偽値の式として評価されます。

空の入力式はfalseと評価されます:

{{#ifexpr: | yes | no}}no

上記のように、ゼロはfalseと評価され、ゼロ以外の値はtrueと評価されるため、この関数は#ifeq#exprのみを使用する関数と同等です:

{{#ifeq: {{#expr: expression }} | 0 | value if false | value if true }}

空の入力式または間違った入力式を除きます(エラーメッセージは空の文字列として扱われます。ゼロに等しくないため、value if true を取得します)。

{{#ifexpr: = | yes | no }} Expression error: Unexpected = operator.

比較

{{#ifeq: {{#expr: = }} | 0 | no | yes }} yes

戻り値のいずれかまたは両方を省略できます。適切なブランチが空のままの場合、出力は提供されません。

{{#ifexpr: 1 > 0 | yes }}yes
{{#ifexpr: 1 < 0 | yes }}
{{#ifexpr: 0 = 0 | yes }} yes
{{#ifexpr: 1 > 0 | | no}}
{{#ifexpr: 1 < 0 | | no}} no
{{#ifexpr: 1 > 0 }}

等号または不等号のブール演算子に対応します。

{{#ifexpr: 0 = 0 or 1 = 0 | yes}}yes
{{#ifexpr: 0 = 0 and 1 = 0 | | no}}no
{{#ifexpr: 2 > 0 or 1 < 0 | yes}}yes
{{#ifexpr: 2 > 0 and 1 > 0 | yes | no}}yes
警告 警告: #ifexprによる数値比較の結果は、#ifeq#switchの結果と必ずしも一致しません。 これらの後者の2つは、#ifexprよりも正確であり、同等の結果を返しません。

変更された最後の桁とのこれらの比較を検討してください:

{{#ifeq: 12345678901234567 | 12345678901234568 | equal | not equal}}not equal
{{#switch: 12345678901234567 | 12345678901234568 = equal | not equal}}not equal

#ifeq#switchで使用されるPHPは、整数型の2つの数値を比較するため、期待される結果を正しく返します。 一方、#ifexprと同じ番号の場合:

{{#ifexpr: 12345678901234567 = 12345678901234568 | equal | not equal}}equal

数字が異なると、equalの結果は実際には正しくありません。

#ifexprでのこの動作は、MediaWikiが式のリテラル数をfloat(フロート)型に変換するために発生します。これは、このような大きな整数の場合、丸めを伴います。

#ifexist

この関数は入力文字列を受け取り、それをページタイトルとして解釈し、そのページがローカルウィキに存在するかどうかに応じて、2つの値のいずれかを返します。

{{#ifexist: page title | value if exists | value if doesn't exist }}

ページが存在する場合、コンテンツが含まれているかどうかにかかわらず、関数はtrue(真)と評価されます(カテゴリリンクやマジックワード などのメタデータが含まれていますが、表示されていません)。 コンテンツ、空白、またはリダイレクト です。存在していないページのみがfalse(偽)と評価されます。これには、ページが以前は存在していたが削除された場合も含まれます。

{{#ifexist: Help:Extension:ParserFunctions/ja | exists | doesn't exist }}exists
{{#ifexist: XXHelp:Extension:ParserFunctions/jaXX | exists | doesn't exist }}doesn't exist

この関数は、カスタマイズされたシステムメッセージ と、ソフトウェアによって定義された特別ページ に対してtrue(真)と評価されます。

{{#ifexist: Special:Watchlist | exists | doesn't exist }}exists
{{#ifexist: Special:CheckUser | exists | doesn't exist }}exists (Checkuser 拡張機能がこのウィキにインストールされているため)
{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}exists (MediaWiki:Copyrightがカスタマイズされているため)

ページが#ifexist:を使用してターゲットをチェックする場合、そのページはターゲットページのSpecial:WhatLinksHereリストに表示されます。したがって、コード{{#ifexist:Foo }}がこのページ(Help:Extension:ParserFunctions/ja)にライブで含まれている場合、Special:WhatLinksHere/FooはHelp:Extension:ParserFunctions/jaをリストします。

共有メディアリポジトリを使用するWikiでは、#ifexist:を使用して、ファイルがリポジトリにアップロードされているかどうかを確認できますが、Wiki自体にはアップロードされていません。

{{#ifexist: File:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Image:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Media:Example.png | exists | doesn't exist }}exists

ファイルのローカル説明ページが作成されている場合、結果は上記のすべてに対して existsになります。

#ifexist:インターウィキリンクでは機能しません。

ifexistの制限

#ifexist: は、「高負荷なパーサー関数」と見なされます。 1つのページに含めることができるのは限られた数だけです(参照読み込みされたテンプレート内の関数を含む)。 この制限を超えると、参照読み込み先ページが存在するかどうかに関係なく、それ以降の #ifexist: 関数は自動的にfalseを返し、ページは Category:Pages with too many expensive parser function calls に分類されます。 tracking category の名前は、ウィキのコンテンツ言語によって異なる場合があります。

使用事例によっては、a.new (存在しないページへのリンクを選択) または a:not(.new) (存在するページへのリンクを選択) を使用して ifexist 効果を css で代用できます。 さらに、単一ページで使用するメモリ消耗の激しいパーサ関数の件数の上限は $wgExpensiveParserFunctionLimit で制御され、必要な場合は上限値を LocalSettings.php で変更できます。

存在し、必要なページ

存在せず、#ifexistを使っているかどうかテスト済みのページは、募集ページに分類されます。 根拠は タスク T14019 に記述があり、 回避策の詳細は Template:Linkless を参照してください。(訳注:リンク元は削除済み)

#rel2abs

この関数は相対ファイル パスを絶対ファイル パスに変換します。

{{#rel2abs: path }}
{{#rel2abs: path | base path }}

path 部分では、以下の構文を使用できます:

  • . → 現在の階層
  • .. → 1 つ上の階層に移動
  • /foo → 下位ディレクトリ /foo に 1 階層移動

base path を指定していない場合は、ページの完全なページ名が代わりに使用されます:

{{#rel2abs: /quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ./quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ../quok | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../. | Help:Foo/bar/baz }}Help:Foo/bar

/././ のような無効な構文は無視されます。 連続する終止符は2つまでしか許可されていないため、次のようなシーケンスを使用して、連続するステートメントを区切ることができます。

{{#rel2abs: ../quok/. | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../../quok | Help:Foo/bar/baz }}Help:Foo/quok
{{#rel2abs: ../../../quok | Help:Foo/bar/baz }}quok
{{#rel2abs: ../../../../quok | Help:Foo/bar/baz }}Error: Invalid depth in path: "Help:Foo/bar/baz/../../../../quok" (tried to access a node above the root node).

同様の関数のグループについては、ヘルプ:マジックワード#URL データ も参照してください。 組み込みパーサー関数には 'localurl:', 'fullurl:', 'anchorencode:' などがあります。

#switch

関連項目: w:Help:Switch parser function

この関数は入力値1件を複数のテストケースと比較し、ヒットした場合は当該の文字列を返します。

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | default result
}}

例:

{{#switch: baz | foo = Foo | baz = Baz | Bar }} Baz
{{#switch: foo | foo = Foo | baz = Baz | Bar }} Foo
{{#switch: zzz | foo = Foo | baz = Baz | Bar }} Bar

部分的なトランスクルージョン タグを含む #switch は、テンプレート コーディングに慣れていない編集者が構成可能な要素を表示および編集できるようにする構成ファイルに影響を与える可能性があります。

既定

case文字列に対応するcomparison stringがヒットしない場合、default resultを返します。

{{#switch: test | foo = Foo | baz = Baz | Bar }} Bar

この構文では、デフォルトの結果は最後のパラメーターである必要があり、生の等号({{}}のない等号)を含めることはできません。 一致する場合は、ケース比較として扱われ、一致するケースがない場合はテキストは表示されません。 これは、既定値が定義されていない (空である) ためです。 ただし、大文字と小文字が一致する場合は、関連する文字列が返されます。

{{#switch: test | Bar | foo = Foo | baz = Baz }} →
{{#switch: test | foo = Foo | baz = Baz | B=ar }} →
{{#switch: test | test = Foo | baz = Baz | B=ar }} → Foo

代替方法として、既定の結果を "#default" のcase文字列で明示的に宣言することもできます。

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | #default = default result
}}

この方法で宣言されたデフォルトの結果は、関数内のどこにでも配置できます。

{{#switch: test | foo = Foo | #default = Bar | baz = Baz }} Bar

defaultパラメータが省略され、一致が行われない場合、result(結果)は返されません。

{{#switch: test | foo = Foo | baz = Baz }}

グループ化の結果

いくつかの case 文字列に同じ result 文字列を返す「フォールスルー」値を持たせることができます。これにより重複を最小限に抑えることができます。

{{#switch: comparison string
 | case1 = result1
 | case2 
 | case3 
 | case4 = result234
 | case5 = result5
 | case6 
 | case7 = result67
 | #default = default result
}}

ここではケース2と3、4とも出力はresult234です。ケース6と7の出力は両方ともresult67です 上記の場合、最後のパラメータの「#default = 」は省略できます。

パラメータとともに使用

この関数は、テスト文字列としてパラメータとともに使用できます。 この場合、大文字と小文字を文字列 「{{{parameter name}}}」に設定する可能性は非常に低いため、パラメータ名の後にパイプを配置する必要はありません。 (これは、パイプが存在せず、パラメーターが存在しないか、値がある場合にパラメーターがデフォルトで設定する値です。 Help:テンプレート内でのパーサー関数 を参照してください。)

{{#switch: {{{1}}} | foo = Foo | baz = Baz | Bar }}

上記の場合、{{{1}}}fooに等しい場合、関数はFooを返します。 bazに等しい場合、関数はBazを返します。 パラメータが空であるか存在しない場合、関数はBarを返します。

上記のセクションのように、ケースを組み合わせて単一の結果を得ることができます。

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | Bar }}

ここで、{{{1}}}foozoo、またはrooに等しい場合、関数はFooを返します。 bazに等しい場合、関数はBazを返します。 パラメータが空であるか存在しない場合、関数はBarを返します。

さらに、テストパラメータ値がいずれの場合にも一致しない場合に何も返したくない場合は、デフォルトの結果を省略できます。

{{#switch: {{{1}}} | foo = Foo | bar = Bar }}

この場合、{{{1}}}が存在してfooまたはbarに等しい場合を除き、関数は空の文字列を返します。この場合、関数はそれぞれFooまたはBarを返します。

これは、デフォルトの結果を空として宣言するのと同じ効果があります。

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | }}

何らかの理由でケースを「{{{parameter name}}}」に設定すると、パラメーターが存在しないか値がない場合に、関数はそのケースの結果を返します。 関数のデフォルトの結果を返すには、パラメーターが存在し、文字列「{{{parameter name}}}」以外の値を持っている必要があります。

({{{1}}}が存在しないか、空の場合):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo
({{{1}}}の値が「test」の場合):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Bar
({{{1}}}の値が「{{{1}}}」の場合):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo


この架空のケースでは、パイプをパラメーター({{{1|}}})に追加する必要があります。

比較の挙動

#ifeq 同様、比較は比較する文字列と対象の格文字列が数値である場合、数値として処理されます。あるいは大文字小文字を識別する文字列として処理されます。

{{#switch: 0 + 1 | 1 = one | 2 = two | three}} → three
{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}} → one
{{#switch: 02 | +1 = one | +2 = two | three}} → two
{{#switch: 100 | 1e1 = ten | 1e2 = hundred | other}} → hundred
{{#switch: a | a = A | b = B | C}} → A
{{#switch: A | a = A | b = B | C}} → C

case文字列は空白の場合があります。

{{#switch: | = Nothing | foo = Foo | Something }}Nothing

一致が見つかると、それ以降のcasesは無視されます。

{{#switch: b | f = Foo | b = Bar | b = Baz | }}Bar
警告 警告: #switchおよび#ifeqを使用した数値比較は、式の比較と同等ではありません(上記も参照)。
{{#switch: 12345678901234567 | 12345678901234568 = A | B}} → B
{{#ifexpr: 12345678901234567 = 12345678901234568 | A | B}} → A

生の等号

"Case" 文字列には生の等号を含めることができません。これを回避するには、{{=}} マジックワードを使用して、等号記号を HTML コード &#61; に置き換えます。

例:

入力 出力
{{#switch: 1=2
 | 1=2 = raw
 | 1<nowiki>=</nowiki>2 = nowiki
 | 1{{=}}2 = template
 | default
}}
template
{{#switch: 1=2
 | 1&#61;2 = html
 | default
}}
html
この関数を実社会で使う易しい例としてNBATemplate:NBA color (訳注:バスケットボールチームの配色用テンプレート) を参照してください。複雑なサンプルは Template:Extension (テンプレート:拡張機能) と w:Template:BOTREQ (訳注:Bot作業依頼のコメント用テンプレート) の2件を参照してください。

#ifeqの置換

拡張深度を減らすには #switch を使用。

例えば:

  • {{#switch:{{{1}}} |condition1=branch1 |condition2=branch2 |condition3=branch3 |branch4}}

は、以下と同等です

  • {{#ifeq:{{{1}}}|condition1 |branch1 |{{#ifeq:{{{1}}}|condition2 |branch2 |{{#ifeq:{{{1}}}|condition3 |branch3 |branch4}}}}}}

つまり、深い入れ子、線形:

{{#ifeq:{{{1}}}|condition1
  |<!--then-->branch1
  |<!--else-->{{#ifeq:{{{1}}}|condition2
                |<!--then-->branch2
                |<!--else-->{{#ifeq:{{{1}}}|condition3
                              |<!--then-->branch3
                              |<!--else-->branch4}}}}}}

一方、switchの交換は、両方のブランチにネストされたIF(インデントの代替で示され、両側にインデントされている)の場合、複雑/非実用的であり、完全に対称的なツリーになります。

{{#ifeq:{{{1}}}|condition1
 |<!--then-->branch1t{{
  #ifeq:{{{1}}}|condition2
   |<!--then-->branch1t2t{{#ifeq:{{{1}}}|condition4|<!--then-->branch1t2t4t|<!--else-->branch1t2t4e}}
   |<!--else-->branch1t2e{{#ifeq:{{{1}}}|condition5|<!--then-->branch1t2e5t|<!--else-->branch1t2e5e}}
  }}
 |<!--else-->branch1e{{#ifeq:{{{1}}}|condition3
   |<!--then-->branch1e3t{{#ifeq:{{{1}}}|condition6|branch1e3t6t|branch1e3t6e}}
   |<!--else-->branch1e3e{{
    #ifeq:{{{1}}}|condition7
     |branch1e3e7t
     |branch1e3e7t
    }}
  }}
}}

#time

このパーサ関数は日付あるいは時間 (グレゴリア暦) を取って指定の文法どおりにフォーマットします。日・時間のオブジェクトを特定する方法; 既定値は マジックワード {{CURRENTTIMESTAMP}} – つまりページが最近 HTML 形式で表示された日時。

{{#time: format string }}
{{#time: format string | date/time object }}
{{#time: format string | date/time object | language code }}
{{#time: format string | date/time object | language code | local }}

右の図には利用できる書式コードをまとめてあります。 書式文字列内にこれら以外の文字が含まれると、未処理で出力します。空白類も扱いは同様です (コードの解析に不要なため)。 書式文字列で文字が認識されず、日付/時刻オブジェクトにエラーがない場合、書式文字列が出力として返されます。 また書式文字列内の文字をエスケープする方法が 2 つあります。

  1. バックスラッシュに続けて書式指定文字列を記述すると、ひとまとまりのリテラル文字として解釈
  2. 文字列を二重引用符で囲むと、リテラル文字として扱い引用符を除去。

またさらに、有向グラフ xx の場合、ひとまとまりのリテラル文字「x」と解釈します。

書式設定コードのリストは進化し続けているため (新しいカレンダーのサポートや、異なる方法で計算および書式設定された新しい日付フィールドのサポートなど)、変更せずに渡す必要があるすべてのリテラル文字 (書式設定コードで現在使用されている ASCII 文字だけでなく) をエスケープする必要があります。

残念ながら、現時点では、ASCII 一重引用符は、現在サポートされている ASCII 二重引用符(たとえば、JSON、C、C++ での文字列値の区切りなどの他の用途では二重引用符が必須です)とバックスラッシュ(JSON、C、C++、PHP、JavaScript、Lua など多くの言語で使用される文字列定数でもエスケープする必要があります)に代わるリテラル テキストをマークするための単純な代替手段としてはまだ認識されていません。 したがって、バックスラッシュでエスケープせずにリテラルの二重引用符を埋め込むことはできません (または、代わりに他の波型、角型、四角型の引用符を使用することもできます)。

{{#time: Y-m-d }}2024-06-30
{{#time: [[Y]] m d }}2024 06 30
{{#time: [[Y (year)]] }}2024 (24UTCamSun, 30 Jun 2024 04:54:49 +0000)
{{#time: [[Y "(year)"]] }}2024 (year)
{{#time: i's" }}54'49"

PHPはdate/time objectを受け取ると、どの書式でも strtotime() 関数で処理します (訳注:英文形式の日付を Unix タイムスタンプに変換)。 絶対時間 (例: 20 December 2000)、相対時間 (例: +20 hours)、および組み合わせ時間 (例: 30 July +1 year) が受け入れられます。

{{#time: r|now}}Sun, 30 Jun 2024 04:54:50 +0000
{{#time: r|+2 hours}}Sun, 30 Jun 2024 06:54:50 +0000
{{#time: r|now + 2 hours}}Sun, 30 Jun 2024 06:54:50 +0000
{{#time: r|20 December 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|December 20, 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000-12-20}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000 December 20}}Error: Invalid time.

ISO 639-3 (?) の言語コードにより、文字列を選択した言語で表示します。

{{#time:d F Y|1988-02-28|nl}}28 februari 1988
{{#time:l|now|uk}}неділя
{{#time:d xg Y|20 June 2010|pl}}20 czerwca 2010

localパラメーターは、「日付/時刻オブジェクト」がローカルタイムゾーンを参照するかUTCを参照するかを指定します。

これは真偽値のパラメーターです。その値は、引数の値をキャストすることによって決定されます(文字列を真偽値にキャストする方法の詳細については、公式PHPドキュメントを参照してください)。

変数$wgLocaltimezoneUTCに設定されている場合、localtrueまたはfalseに設定されていても、出力に違いはないことに注意してください。

詳細については、次の例を参照してください:

{{#time: Y F d H:i:s|now|it|0}}2024 giugno 30 04:54:50
{{#time: Y F d H:i:s|now|it|1}}2024 giugno 30 04:54:50
{{#time: Y F d H:i:s|+2 hours||0}}2024 6月 30 06:54:50
{{#time: Y F d H:i:s|+2 hours||1}}2024 6月 30 06:54:50
{{#time:c|2019-05-16T17:05:43+02:00|it}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|0}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|true}}2019-05-16T15:05:43+00:00

Unix タイムスタンプを計算する場合は、文字列の先頭に @ 記号を付けると日付計算に使えます。

{{#time: U | now }}1719723290
{{#time: r | @1719723289 }}Sun, 30 Jun 2024 04:54:49 +0000
警告 警告: もしタイムスタンプの数値の先頭に @ を付けないと、ほぼ毎回、エラーか想定外の値を返します。
{{#time: r | 1970-01-01 00:16:39 }}Thu, 01 Jan 1970 00:16:39 +0000
{{#time: U | 1970-01-01 00:16:39 }}999
{{#time: r | @999 }}Thu, 01 Jan 1970 00:16:39 +0000 (正しい)
{{#time: r | 999 }}Error: Invalid time. (年の書式が想定外)
{{#time: r | 1970-01-01 00:16:40 }}Thu, 01 Jan 1970 00:16:40 +0000
{{#time: U | 1970-01-01 00:16:40 }}1000
{{#time: r | @1000 }}Thu, 01 Jan 1970 00:16:40 +0000 (正しい)
{{#time: r | 1000 }}Mon, 30 Jun 1000 00:00:00 +0000 (年を想定、今日の月日を添える)
{{#time: r | 1970-01-01 02:46:39 }}Thu, 01 Jan 1970 02:46:39 +0000
{{#time: U | 1970-01-01 02:46:39 }}9999
{{#time: r | @9999 }}Thu, 01 Jan 1970 02:46:39 +0000 (正しい)
{{#time: r | 9999 }}Wed, 30 Jun 9999 00:00:00 +0000 (年を想定、今日の月日を添える)
{{#time: r | 1970-01-01 02:46:40 }}Thu, 01 Jan 1970 02:46:40 +0000
{{#time: U | 1970-01-01 02:46:40 }}10000
{{#time: r | @10000 }}Thu, 01 Jan 1970 02:46:40 +0000 (正しい)
{{#time: r | 10000 }}Error: Invalid time. (年の書式が想定外)
警告 警告: 許容できる入力値は「1 January 0111 → 31 December 9999」の範囲です。年は100から110までが不定形です。Y (年) とうるう年はその 100-110 と同様に不定形、r (RFC 5322 形式)、D (曜日略号)、l (曜日)、U (Unix日時) を記述すると年を 2000-2010 の範囲として解釈します。
{{#time: d F Y | 29 Feb 0100 }}01 3月 0100
(これはうるう年ではないから出力は正しい)、ただし
{{#time: r | 29 Feb 0100 }}Mon, 01 Mar 0100 00:00:00 +0000 (こちらは間違い。100 を2000と解釈できたのに、うるう年だったため。)
{{#time: d F Y | 15 April 10000 }}Error: Invalid time.
{{#time: r | 10000-4-15 }}Sat, 15 Apr 2000 10:00:00 +0000

先頭に 0 を付けて 4 桁の書式にした場合を除いて、年の値 0-99 は 2000-2069 年および 1970-1999 年と解釈されます:

{{#time: d F Y | 1 Jan 6 }}01 1月 2006
{{#time: d F Y | 1 Jan 06 }}01 1月 2006
{{#time: d F Y | 1 Jan 006 }}01 1月 2006
{{#time: d F Y | 1 Jan 0006 }}01 1月 0006 (4-digit format)
日は年が 100-110 の範囲か、1753以上で与えられ、原因は 111-1752 の範囲では r-出力が「不明」、l-出力が「<>」となってしまうからです。結果として、r-出力はこれらの範囲の年の入力値として許容されません。

完全または部分的な絶対日付を指定できます。この関数は current 値を使用して、指定されていない日付の部分を「補完」します。

{{#time: Y | January 1 }}2024
警告 警告: 補完の関数は不定形です。特定の部分は現在の値で補完され、別の部分はエラーになります。
{{#time: Y m d H:i:s | June }}2024 06 30 00:00:00 この例は日のゼロ時ゼロ分、現在の日、数式に記述した月 (June=6月) と年を表示。
{{#time: Y m d H:i:s | 2003 }}2003 06 30 00:00:00 この例はゼロ時ゼロ分、現在の月日、数式に記述した年を表示。

満員の日の例外ケースがあります:

{{#time: Y m d H:i:s | June 2003 }}2003 06 01 00:00:00 1日の始まりと月の始まりを示します。

4桁の数字は常に年として解釈され、時間や分としては解釈されません。[1]

{{#time: Y m d H:i:s | 1959 }}1959 06 30 00:00:00

6桁の数字は時間と解釈、できるかぎり分と秒まで出力しようとしますが、それ以外の場合はエラーになります (たとえば年月日とは解釈しません)。

{{#time: Y m d H:i:s | 195909 }}2024 06 30 19:59:09 記述したコードは年とゼロ補完の月と日を要求したのに、出力は時間として解釈。
{{#time: Y m d H:i:s | 196009 }}Error: Invalid time. 19:60:09 は有効な時刻ではないにもかかわらず、196009 は1960年9月とは解釈されません。

関数は日付計算をこなそうとします。(訳注:Fは「サイトの言語での完全な月名」、dはゼロ補完の日を求め、入力値の不備で出力結果が不定形。)

{{#time: d F Y | January 0 2008 }}31 12月 2007
{{#time: d F | January 32 }}Error: Invalid time.
{{#time: d F | February 29 2008 }}29 2月
{{#time: d F | February 29 2007 }}01 3月
{{#time:Y-F|now -1 months}}2024-5月

#timeに対する書式文字列の総文字数(すべての呼び出しでの総和)は半角6000文字に制限されています[2]

タイムゾーンの問題点

この#timeパーサ関数(より具体的にはPHP DateTime )には相対的なタイムゾーンオフセットとして整数以外 は渡せないというバグがあります。EDT (東部夏時間) など時間通りのタイムゾーンを使用する場合、この問題は発生しません。例をあげます。:

  • {{#time:g:i A | -4 hours }} → 12:54 AM

ところがインドは UTC (協定世界時) との時差が +5.5 時間のため、タイムゾーンを適用すると通常なら正しいオフセットの計算に失敗するはずです。実例はこちら:

  • {{#time:g:i A | +5.5 hours }} → 4:54 AM

そこで回避策として、単純に時間を分か秒 (minutes か seconds) に換算して、次の例のように与えます。

  • {{#time:g:i A | +330 minutes }} → 10:24 AM
  • {{#time:g:i A | +19800 seconds }} → 10:24 AM

(関数の開発者 Tim Starling がこれを解決する構文を書いてくれました。)

#time format like in signatures

Sometimes it is useful to construct a timestamp, which looks like the automatic timestamp generated by signatures in discussions on talk pages. On an English-language wiki, it can be created with:

  • {{#timel:H:i, j xg Y (e)|+330 minutes}} → 10:24, 30 6月 2024 (UTC)

#timel

この関数は構文のショートカットで local パラメータに true を設定すると挙動は {{#time: ... }} と同一、常に利用者が設定した標準時またはウィキが設定した時間帯を使用 (タイムゾーンの設定は $wgLocaltimezone に従う)

関数の構文は次のとおりです:

{{#timel: format string }}
{{#timel: format string | date/time object }}
{{#timel: format string | date/time object | language code }}
変数$wgLocaltimezoneUTCに設定されている場合、localtrueまたはfalseに設定されていても、出力に違いはないことに注意してください。
タイムゾーンがUTCではないサーバーからの#timeおよび#timelパーサー関数の使用例

例えば、以下の例を参照してください:

{{#time:c|now|it}}2024-06-30T04:54:50+00:00
{{#time:c|now|it|0}}2024-06-30T04:54:50+00:00
{{#time:c|now|it|1}}2024-06-30T04:54:50+00:00
{{#timel:c|now|it}}2024-06-30T04:54:50+00:00
https://no.wikipedia.org/wiki/Maldiskusjon:Sommertidからの警告例
警告 警告: UTC(旧称GMT)とは異なるタイムゾーンのウィキペディアでは、1970-01-01 00:00:00 UTC以降、時間と時間の両方のUが同じ秒数を返すことに注意してください。
U Unix時間。 1970年1月1日00:00:00 GMTからの秒数。
Z タイムゾーンのオフセット (秒)
{{#time: U}}1719723289
{{#timel: U}}1719723289
{{#time: Z}}0
{{#timel: Z}}0

#titleparts

この関数は、ページのタイトルをスラッシュに基づいてセグメントに分離し、それらのセグメントの一部を出力します。

{{#titleparts: ページ名 | 返すセグメント数 | 最初に返すセグメント }}

「返されるセグメントの数」パラメータが指定されていない場合、デフォルトで「0」になり、「最初に返されるセグメント」(含まれている)からすべてのセグメントが返されます。 「最初に返すセグメント」パラメータが指定されていないか「0」の場合、デフォルトで「1」になります。

{{#titleparts: Talk:Foo/bar/baz/quok }}Talk:Foo/bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 1 }}Talk:Foo {{ROOTPAGENAME }} も参照してください。
{{#titleparts: Talk:Foo/bar/baz/quok | 2 }}Talk:Foo/bar
{{#titleparts: Talk:Foo/bar/baz/quok | 2 | 2 }}bar/baz
{{#titleparts: Talk:Foo/bar/baz/quok | 2 | 3 }}baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 3 | 2 }}bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | | 2 }}bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | | 5 }}

両方の値に負の値が受け入れられます。返されるセグメントの数パラメータの負の値は、文字列の末尾からセグメントを効果的に「ストリップ」します。 「最初に返されるセグメント」の負の値は、「このセグメントを右から数えて開始する」という意味になります。

{{#titleparts: Talk:Foo/bar/baz/quok | -1 }}Talk:Foo/bar/baz 文字列の最後から数えてはじめのセグメントを削除します。 {{BASEPAGENAME}} も参照してください。
{{#titleparts: Talk:Foo/bar/baz/quok | -4 }} 文字列の末尾から4つのセグメントすべてを削除します
{{#titleparts: Talk:Foo/bar/baz/quok | -5 }} 文字列の末尾から5つのセグメントを削除します(存在する以上)
{{#titleparts: Talk:Foo/bar/baz/quok | | -1 }} quok 最後のセグメントを返します。 {{SUBPAGENAME}} も参照してください。
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | 2 }} bar/baz 文字列の末尾から1つのセグメントを削除してから、2番目以降のセグメントを返します
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | -2 }} baz 最後から2番目の要素からコピーを開始します。文字列の末尾から1つのセグメントを削除します

処理する前に、「pagename」パラメータはHTMLでデコードされます。標準のHTML文字エンティティが含まれている場合、それらはプレーン文字に変換されます(UTF-8で内部的にエンコードされます。つまり、MediaWikiソースページで使用するのと同じエンコードです。このパーサー関数)。

たとえば、pagename&quot;&#34;、または&#x22;が含まれている場合は、"に置き換えられます。
HTMLからプレーンテキストへの他の変換は実行されないため、HTMLタグは、ページタイトルで無効であっても、この最初のステップではそのまま残ります。
MediaWiki の一部のマジックキーワードやパーサー関数 ({{PAGENAME }} など) は、入力パラメータが HTML エンコードされていない場合でも、不必要に HTML エンコードされた文字列を返すことが知られています。

titleparts パーサー関数を回避策として使用して、これらの返された文字列を変換できます。これにより、パラメータにページ名を受け取るがHTMLエンコードされた入力文字列では依然として正しく動作しない他のパーサー関数 ({{PAGESINCAT: }} など) によっても正しく処理できるようになります。

たとえば、現在のページが Category:Côte-d'Or の場合、次のようになります。

  • {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d'Or | 1 | 0 }}{{#ifeq: {{FULLPAGENAME}} | Category:Côte-d&apos;Or | 1 | 0 }} は両方とも 1 を返します (#ifeq パーサー関数は入力パラメータの HTML デコードを実行します)。
  • {{#switch: {{FULLPAGENAME}} | Category:Côte-d'Or = 1 | #default = 0 }}{{#switch: {{FULLPAGENAME}} | Category:Côte-d&apos;Or = 1 | #default = 0 }} は両方とも 1 を返します (#switch パーサー関数は入力パラメータの HTML デコードを実行します)。
  • $code 0、$code 1、または {{#ifexist: Category:Côte-d&apos;Or | 1 | 0 }} はすべて、そのカテゴリ ページが存在する場合は 1 を返します (#ifexist パーサー関数は入力パラメータの HTML デコードを実行します)。
  • カテゴリにページまたはサブカテゴリが含まれている場合、{{PAGESINCAT: Côte-d'Or }} はゼロ以外の数値を返します、:
  • {{PAGESINCAT: {{CURRENTPAGENAME}} }} は、次のように 無条件に 0 を返す場合があります:
  • {{PAGESINCAT: {{PAGENAME:Category:Côte-d'Or}} }}
  • {{PAGESINCAT: {{PAGENAME:Category:Côte-d&apos;Or}} }}

この予期しない動作の理由は、MediaWiki の現在のバージョンには 2 つの注意事項があるためです。

  • {{FULLPAGENAME}}、または {{FULLPAGENAME:Côte-d'Or}} は、期待される Category:Côte-d'Or ではなく、実際に HTML エンコードされた文字列 Category:Côte-d&apos;Or を返す場合があります。
  • {{PAGESINCAT: Côte-d&apos;Or }}無条件に 0 を返します (PAGESINCAT マジック キーワードは入力パラメータの HTML デコードを実行しません)。

titleparts を使用した簡単な解決策 (両方の注意点が MediaWiki の新しいバージョンで修正されれば引き続き機能します) は次のとおりです。

  • {{PAGESINCAT: {{#titleparts: {{CURRENTPAGENAME}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d'Or}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME:Category:Côte-d&apos;Or}} }} }}、これらはすべて同じカテゴリ内の実際のページ数を返します。

次に、デコードされたページ名は、可能な限り MediaWiki でサポートされている標準のページ タイトルに正規化されます。

  1. すべてのアンダースコアは自動的にスペースに置き換えられます。
    {{#titleparts: Talk:Foo/bah_boo|1|2}}bah boo 原文では下線が付いていますが、bah_booではありません。
  2. 文字列は最大 25 回分割され、それ以降のスラッシュは無視され、25 番目の要素に文字列の残りが含まれます。 文字列は ページタイトル として扱われるため、255 文字に制限されます。
    {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee | 1 | 25 }}y/z/aa/bb/cc/dd/ee
    何らかの理由でこの関数を限界まで押し上げる必要が生じた場合、可能性は低いですが、関数呼び出しをネストすることで最大 25 回の分割制限を回避することができます。
    {{#titleparts: {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee| 1 | 25 }} | 1 | 2}}z
  3. 最後に、最初の部分文字列は、ローカル Wiki の大文字化設定に従って大文字化されます (その部分文字列もローカル名前空間名で始まる場合は、その名前空間名も正規化されます)。
    {{#titleparts: talk:a/b/c }}Talk:A/b/c
#titleparts を小さな「文字列パーサーおよびコンバーター」として使用できますが、大文字の最初の部分文字列を返すことに注意してください。
{{#titleparts: one/two/three/four|1|1 }}One
{{#titleparts: one/two/three/four|1|2 }}two

小文字を求めるには lc: 関数を使い出力をコントロールします。

{{lc: {{#titleparts: one/two/three/four|1|1 }} }}one

文字列の先頭に「ダミー」のスラッシュを追加して、最初の部分文字列の大文字化 (大文字または小文字) を正しく行うことができます。返される最初のセグメント には、1 ではなく 2 を使用します。

{{#titleparts: /one/two/three/four|1|2 }}one
{{#titleparts: /One/two/three/four|1|2 }}One
警告 警告: ページ タイトルに使用できない特定の文字があると、#titleparts は文字列を解析しません。
{{#titleparts: {one/two} | 1 | 1 }}{one/two}. 以下の値にはなりません: {one
{{#titleparts: [[page]]/123 | 1 | 2 }}page/123. ページ タイトルでは括弧は無効であり、このパーサー関数は、MediaWiki 構文やその他の HTML または MediaWiki タグが使用されている場合でも、入力 pagename パラメータに埋め込まれたリンクを処理しないため、機能しません。
{{#titleparts: red/#00FF00/blue | 1 | 3 }} → "". 「#」もページタイトルでは不正なので機能しません。
警告 警告: タイトルの一部が「.」または「..」だけの場合、#titleparts は文字列を解析しません。
{{#titleparts: one/./three | 1 | 1 }}one/./three. 文字列全体が返されます。期待どおりの結果は生成されません。 one
警告 警告: この関数は、入力が UTF-8 で 255 バイトを超える場合、入力文字列を適切に劣化させません。入力文字列が 256 バイト以上の場合は、文字列全体が返されます。


文字列関数

ParserFunctions 拡張機能は、$wgPFEnableStringFunctions true に設定されている場合、オプションでさまざまな文字列関数 (#len, #pos, #rpos, #sub, #count, #replace, #explode, #urldecode) を定義します。

警告 警告: 2013 年に、これらの機能は大規模に使用すると非効率であるため、Wikimedia Wiki では 決して 有効にしないこと が決定されました (履歴については phab:T8455 を参照してください)。 これらの機能はWikimedia wikiでは動作しません。

Wikimedia プロジェクトについて何かを書くためにここに来ているのであれば、何か他のものを探していることになります。ホーム Wiki に文字列関数がある場合は、おそらく Lua が使用されています。 たとえば、英語版 Wikipedia では Module:String が使用されていますが、これは構文が大きく異なりますが、同じことの一部を実行します。 個別の文字列処理テンプレートもあります。

例については、こちらをご覧ください。

Module:String 関数の簡単な概要は次のとおりです。

  • #len (文字列の長さ): {{#invoke:String|len|target_string}}
  • #sub (部分文字列): {{#invoke:String|sub|target_string|start_index|end_index}}
  • #match: {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
  • #pos (ターゲットの位置): {{#invoke:String|pos|target_string|index_value}}
  • #find: {{#invoke:String|find|source_string|target_string|start_index|plain_flag}}
  • #replace: {{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
  • #rep (繰り返し): {{#invoke:String|rep|source|count}}
  • #escapePattern: {{#invoke:String|escapePattern|pattern_string}}
  • #count: {{#invoke:String|count|source_str|pattern_string|plain_flag}}
  • #join: {{#invoke:String|join|separator|string1|string2|...}}

See also Manual:Performing string operations with parser functions for a different set of hacks used to perform string functions when these are disabled, which were used on Wikimedia wikis before the Scribunto was developed.

全般的な情報

subst展開

パーサー関数の subst展開は、ハッシュ記号の前にsubst:を足します。

{{subst:#ifexist: Help:Extension:ParserFunctions/ja | [[Help:Extension:ParserFunctions/ja]] | Help:Extension:ParserFunctions/ja }}[[Help:Extension:ParserFunctions/ja]] というページが存在するため、コード Help:Extension:ParserFunctions/ja がウィキテキストに挿入されます。
警告 警告: 式に変数 や他のパーサー関数などの「置換されていない」揮発性コードが含まれている場合、置換されたパーサー関数の結果は未定義になります。一貫した結果を得るには、評価される式内のすべての揮発性コードを置換する必要があります。Help:Substitution を参照してください。

Subst展開は ‎<ref>‎</ref> ; では機能しないので、予測する結果を得るには{{subst:#tag:ref|}} を使ってください。

リダイレクト

中でも{{#time:…|now-…}} は文中に日付を含むページのリダイレクト で特に利便性が高そうに見えても、実用上は機能しません。

表内でのパイプ記号のエスケープ

パーサー関数はウィキ記述の表 wikitable の構文を断ち切りパイプ記号 (|) に与える役目を変質させ、生のパイプ記号は単に変数の区切り子として扱います。 回避策として過去にはほとんどのウィキで Template:! テンプレートを使い生のパイプ記号 (|) 単体のみ記していたところ、MW 1.24 以降はこの苦しい方法に代わって {{!}} マジックワード が使えます。 これは見た目にパイプ記号を MediaWiki 関数に対して〈不可視化〉することで、特定のページ内のテンプレート類や変数がすべて展開するまで、処理の対象として保留されます。 そして表の列や行の区切り子として解釈されます。 代案として生の HTML 形式の関数の表を使う方法もあり、ただし直感的に記述しにくくエラー発生の確率も高めです。

パイプ記号は、平文 (解釈されない) 文字としてエスケープすることもできます。これには HTML エンティティ &#124; を使用します。

説明 入力内容 結果
パイプ記号を表の行/列区切りとしてエスケープ
{{!}}
|
パイプ記号をプレーンな文字としてエスケープ
&#124;
|

空白類の除去

空白 (改行、タブ、空白アキ) はパーサ関数の全パラメータの開始から終了まで除去します。これを回避するには、引用符で囲んでから文字列を比較します。

{{#ifeq: foo           |           foo | equal | not equal }}equal
{{#ifeq: "foo          " | "          foo" | equal | not equal }}not equal

then 部分および else 部分での空白の除去を回避する方法は m:Template:If を参照してください。空白の代わりに <nowiki > </nowiki> を使用することもできます。

foo{{#if:|| bar }}foofoobarfoo
foo{{#if:||<nowiki /> bar <nowiki />}}foofoo bar foo

ただし連続する複数の空白文字はパーサにより1文字に圧縮されるため、この方法により処理できるのは1文字の空白文字に限定されます。

<span style="white-space: pre;">foo{{#if:||<nowiki/>      bar      <nowiki/>}}foo</span>
foo bar foo

このサンプルでは white-space: pre 書式を採用してブラウザ上で非表示でも、空白スペースが保持されるように強制します。ソフトウェアにより、ブラウザに渡す前に空白文字が除去されるため発生します。

この挙動を回避するには、ソフトウェアによって置換されないように空白類を &#32; (改行可能空白) または &nbsp; (改行不可空白、nbsp) に置換します。

<span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span>foo bar foo
foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foofoo   bar   foo

パラメータ同士の重みづけは同等でない点にご注意ください。 パーサ関数 ParserFunctions では、冒頭と末尾の空白スペースは常に除去されます。 テンプレート では冒頭と末尾の空白スペースは名前付きパラメータと名前をつけた名無しパラメータに関しては除去、ただし名無しのままのパラメータからは除去しません :

foo{{1x|content= bar}}foofoobarfoo
foo{{1x|1= bar}}foofoobarfoo
foo{{1x| bar }}foofoo bar foo

関連項目

脚注

  1. 2011年のr86805以前とは扱いが変わりました。
  2. phabricator.wikimedia.orgのExtParserFunctions.php を参照してください。