コンテンツにスキップ

利用者:わたあめひみつ/条件文

この文書は、テンプレート等における条件文についてのMediaWiki拡張機能を説明する文書です。条件文はすべて次のような文法を持っています。

{{#機能名: 引数 1 | 引数 2 | 引数 3...}}

各機能[編集]

このモジュールには現在、exprififeqifexistifexprswitchtimerel2absの8つの機能が定義されています。

文法の説明は、

{{ #expr: <数式> }}

と書き、<>内にはそこに書くべき内容を記しています。

使用例として

{{ #expr: 1 + 2 }} = 3(1足す2は3だから)

と書き、使用例 = 出力 (理由)と記しています。

expr[編集]

expr機能は、数式の演算を行います。文法は、

{{ #expr: <数式> }}

サポートしている演算子の概ねの優先順位は、

演算子 演算
( ) 優先 {{#expr: (30 + 7) * 7 }} = 259
+ 正符号 {{#expr: 30 * +7 }} = 210
- 負符号 {{#expr: 30 * -7 }} = -210
not 論理否定 {{#expr: not 0 * 7 }} = 7
{{#expr: not 30 * 7 }} = 0
* 乗算 {{#expr: 30 * 7}} = 210
/ 除算(divと全く同じ) {{#expr: 30 / 7}} = 4.2857142857143
div 除算(/と全く同じ) {{#expr: 30 div 7}} = 4.2857142857143
mod 乗除、除算の「あまり」 {{#expr: 30 mod 7}} = 2
+ 加算 {{#expr: 30 + 7}} = 37
- 減算 {{#expr: 30 - 7}} = 23
round 四捨五入
roundの右に小数点以下の桁数を入れる
{{#expr: 30 / 7 round 7}} = 4.2857143
= 等号、左右は等しい {{#expr: 30 = 7}} = 0
<> 不等号、左右は等しくない {{#expr: 30 <> 7}} = 1
!= 不等号、左右は等しくない、排他的論理和 {{#expr: 30 != 7}} = 1
< 小なり、左は右未満 {{#expr: 30 < 7}} = 0
> 大なり、左は右以上 {{#expr: 30 > 7}} = 1
<= 左は右以下 {{#expr: 30 <= 7}} = 0
>= 左は右以上 {{#expr: 30 >= 7}} = 1
and 論理積 {{#expr: 30 and 7}} = 1
or 論理和 {{#expr: 30 or 7}} = 1

真偽を求める演算子は、偽の時に0を、真の時に1を返します。十進法で計算され、小数点は、"." です。FORTRANスタイルの科学技術計算はサポートされていません。計算できる桁数には限りがあり、また、指数方式で計算結果を返すことがあります。

使用例として、

{{ #expr: (100 - 32) / 9 * 5 round 0 }} = 38

これは、華氏温度を摂氏温度に変換し、整数に四捨五入します。

if[編集]

ifは、「もし〜ならば〜さもなくば〜」の構文です。文法は、

{{ #if: <もし文> | <ならば文> | <さもなくば文> }}
{{ #if: <もし文> | <ならば文> }}

<もし文> が、空文字列ではなくホワイトスペースのみでもない場合は、<ならば文> が返されます。<もし文>空文字列もしくはホワイトスペースのみであったならば、<さもなくば文> が返されます。<さもなくば文> は省略できます。省略された場合には、<さもなくば文> の代わりに空文字列が返されます。

テンプレートの引数が定義されている場合とされていない場合で処理を分けることができます。例えば、引数が定義されていればそれを、されていなければ0を返したい場合は、

{{#if: {{{引数|}}} | {{{引数}}} | 0 }}

とすれば、テンプレート呼び出しの際に、「{{テンプレート|引数=なにがし}}」とあれば「なにがし」を返し、「{{テンプレート}}」もしくは「{{テンプレート|引数=}}」とあれば0を返します。

定義されていない場合に、何も返さない(空文字列を返す)としたければ、

{{#if: {{{引数|}}} | {{{引数}}} }}

とします。定義されている場合に1、そうでない場合に0を返したければ、

{{#if: {{{引数|}}} | 1 | 0 }}

とします。

ifでは、等号その他の数学的な演算は一切サポートされていないことに注意してください。例えば、

{{#if: 1 = 2 |はい|いいえ}} = はい (1 = 2は空文字列でないから)

となります。if文は「もし定義されていたら」という条件が意図されています。もし、文字列を比較するのならば、ifeqを使ってください。また、数を比較するのなら、ifexprを使ってください。

ifeq[編集]

ifeqは2つの文字列を比較し、比較の結果に応じて異なる文字列を返します。文法は、

{{ #ifeq: <文字列1> | <文字列2> | <等しいときに返す文> | <等しくないときに返す文> }}

数字と見なされる文字列は、数に変換して判断されます。

{{ #ifeq: 007 | 7 | 同じ | 違う }} = 同じ
{{ #ifeq: +007 | 7 | 同じ | 違う }} = 同じ

ダブルコーテーション(")で囲まれると、数に変換されません。

{{ #ifeq: "007" | "7" | 同じ | 違う }} = 違う
{{ #ifeq: "+007" | "7" | 同じ | 違う }} = 違う

大文字と小文字は区別されます。

{{ #ifeq: A | a | 同じ | 違う }} = 違う

ifexist[編集]

ifexistは、指定された記事が存在するかどうかによって、2つのうちの1つの結果を返します。

{{ #ifexist: <記事名> | <あるときに返す文> | <ないときに返す文> }} 

1つ目のパラメータは、調べたい記事名です。2つ目は存在している場合に返す文、3つ目は存在しない場合に返す文です。調べたい記事名が有効なタイトルでなければ、存在しない場合の文が返されます。例えば、

{{#ifexist:Foo|Bar|RFC 3092}} = Bar(Fooは存在するので)
{{#ifexist:Wikipedia:条件文|はい|いいえ}} = はい (Wikipedia:条件文は存在するので)
{{#ifexist:m:Help:Calculation|はい|おっと}} = おっと (m:Help:Calculationは存在しますが、これは接頭辞がinterwikiです)

となります。

Template:ExistsMeta) は、Interwikiリンクでも「存在する」文を返すこと以外は、同じ結果を返します。Template:if interwiki linkMeta)は、この違いを利用しています。

ifexpr[編集]

ifexprは、数式を評価(計算)し、その結果に従って2つの文字列からひとつを返します。

{{ #ifexpr: <数式> | <0以外の場合に返す文> | <0の場合に返す文> }}

数式の結果が0であった場合には <0の場合に返す文> が返され、そのほかの場合には <0以外の場合に返す文> が返されます。数式の文法はexprと同じです。

計算結果が空文字列の場合は、<0以外の場合に返す文> が返されます。

{{#ifexpr|{{ns:0}}|Toast|'''or else'''}} = or else ({{ns:0}}は空文字列だから)

計算が行えない場合や不正な計算の場合はエラー文字列を返します。

{{#ifexpr:1/0|0以外|0である}} = 0 で除算しました。
{{#ifexpr:1/n|0以外|0である}} = 構文エラー:「n」を認識できません。

<0以外の場合に返す文><0の場合に返す文>も省略すると、何も返しません(空文字列を返します。)

{{#ifexpr:1/2}} =

省略した場合でも数式の評価は行います。

{{#ifexpr:1/0}} = 0 で除算しました。
{{#ifexpr:1/n}} = 構文エラー:「n」を認識できません。

評価結果を更に評価させる場合は結果に注意してください。

{{#if: {{#ifexpr:1/0}} |やっぱり|あれれ}} = やっぱり
{{#if: {{#ifexpr:1/n}} |やっぱり|あれれ}} = やっぱり
{{#if: {{#ifexpr:1E4}} |やっぱり|あれれ}} = あれれ
{{#if: {{#ifexpr:a=b}} |やっぱり|あれれ}} = やっぱり
{{#if: {{#ifexpr:1=2}} |やっぱり|あれれ}} = あれれ

switch[編集]

switchは、ひとつの値(基準値)を他の複数の値と比較し、一致するものが見つかったら該当の値を返します。文法は基本的に、

{{ #switch: <基準値>
| <値1> = <返す文1>
| <値2> = <返す文2>
| ...
| <値n> = <返す文n>
| <その他の時に返す文>
}}

switchはそれぞれの値を、基準値と一致するものがみつかるまでそれぞれの値をずっと探そうとします。もし見つかったら、値に相当する文(等号のあとにある文)を返します。もし見つからなかったら、最後の等号のない項を返します。もし、この項にどうしても等号を含めて書く必要がある場合には、#defaultを用います。

{{ #switch: <基準値>
| <値> = <返す文>
| #default = <その他の時に返す文>
}}

同じ返す文を何度も書くのを省略するため、値が「通り抜ける」構造になっていることに気をつけてください。たとえば、

{{ #switch: <基準値>
| <値1>
| <値2>
| <値3> = <返す文3>
| ...
| <値n> = <返す文n>
| <その他の時に返す文>
}}

この例では、値1と値2に等号が付いていません。もしそれらに一致したら、返す文3が返されます。つまり、等号を省略した場合には、次の最初の等号の後の文が返されるのです。

switchifeq と同様、数字と見なされる文字列は数として判断されます。次の結果に注意してください。

{{#switch: 007 | 7=7にマッチ | 007=007にマッチ }} = 7にマッチ
{{#switch: "007" | 7=7にマッチ | 007=007にマッチ }} =
{{#switch: "007" | 7=7にマッチ | "007"=007にマッチ }} = 007にマッチ

大文字小文字を無視するためには、基準値と値に必要に応じて{{lc:}}または{{uc:}}を使い、小文字または大文字にそろえます。

{{#switch: A | a=小文字 | A=大文字 }} = 大文字
{{#switch: A | a=小文字 | 大文字 }} = 大文字
{{#switch: a | a=小文字 | 大文字 }} = 小文字
{{#switch: {{uc:a}} | a=小文字 | 大文字 }} = 大文字
{{#switch: {{lc:A}} | a=小文字 | 大文字 }} = 小文字

time[編集]

timeは、日付や時間の書式を指定して出力する機能です。文法は

{{ #time: <書式> }}
{{ #time: <書式> | <日付/時間> }}

のどちらかです。

<日付/時間>が指定されていない場合には、コードがHTMLに変換された時刻が用いられます。ページのキャッシュに注意してください。記事が閲覧される時間と1週間以上の誤差が出る場合もあるでしょう。最新にするには、その都度更新する必要があるかもしれません。なにも変更しないで投稿し直す(いわゆるゼロ編集)、action=purge をURLのオプションに付ける、閲覧者のオプションで「ページをキャッシュしない」にする、などで更新できます。

引数 <書式> は、PHPの date() に使われるのと同様です。

以下の <書式> の指定文字は、PHPの指定文字と同じ意味を持っています。国際化(言語と地域による異なった出力)を別にすれば、PHPの動作との重要な相違点は、エラーの考え方と出力です。すべての書式の指定文字は言語に従って文字列を返します。もし、そうしたくないときには、指定文字 xn を前に付けてください。

1970年1月1日00時00分01秒 (UTC) から2038年1月19日03時14分07秒までの時刻に限り、計算ができます(2038年問題参照)。

コード 説明 出力例 現在の出力
Y 4桁の西暦年。 2006 2024
y 2桁の西暦年 06 24
L 閏年かどうかの判定。 閏年なら 1 、そうでなければ 0 1
n 月の数字。ひと桁の時も0が前に付かない。 1 から 12 6
m 月の数字。ひと桁の時は0が前に付く。 01 から 12 06
M 月の短縮形。たいていは国際化されている。 1月 6月
F 月。たいていは国際化されている。 1月 6月
t 月の日数。 28 から 31 30
j 日。ひと桁の時も0が前に付かない。 3 26
d 日。ひと桁の時は0が前に付く。 04 26
z 0から数えたその年の通算日数。 0 から 365 177
D 曜日の短縮形。まれに国際化されている。
l 曜日。まれに国際化されている。 月曜日 水曜日
w 曜日の数値。 0(日曜日) から 6(土曜日) 3
N ISO 8601形式の曜日。 1(月曜日) から 7(日曜日) 3
W ISO 8601形式の週の数。 26
a 午前、午後を am/pm で。 pm
A 午前、午後を AM/PM で。 PM
g 12時間制の時刻。ひと桁の時は0が前に付かない。 1 から 12 3
h 12時間制の時刻。ひと桁の時は0が前に付く。 01 から 12 03
G 24時間制の時刻。ひと桁の時は0が前に付かない。 0 から 23 15
H 24時間制の時刻。ひと桁の時は0が前に付く。 00 から 23 15
i 分。ひと桁の時は0が前に付く。 00 から 59 20
s 秒。ひと桁の時は0が前に付く。 00 から 59 27
U 1970年1月1日 00:00:00 (GMT) からの秒数 1719415227
c ISO 8601形式の日付。 2024-06-26T15:20:27+00:00
r RFC 2822形式の日付。 Wed, 26 Jun 2024 15:20:27 +0000

以下の <書式> の指定文字は、PHPの文法にはない拡張された文字です。

コード 説明
xn 数字を返すコードの前に置いて、それが半角数字となるようにする。例えば、ヒンディー語において、{{ #time:H, xnH | 06:00}} はヒンディー語式の ०६ ではなく 06 を返す。
xN これが書かれてより後のコードが半角数字となるようにする。 xn と似ているが、こちらはもう一度 xN が現れるまでの全てのコードに作用する。
xr 数字を返すコードの前に置いて、それがローマ数字となるようにする。{{ #time:xrH | 06:30}} は VI を返す。
xg 月の名前を返すコードの前に置いて、主格と所有格に違いのある言語においては、それが所有格となるようにする。
xx 文字の「x」そのもの。

上記以外の文字は、そのまま出力されます。また、上記の文字をそのまま文字として出力する2つの方法があります。

  1. ダブルクオート ( " ) に囲まれた文字は、そのまま出力されます。このとき、ダブルクオートそのものは出力されません。ダブルクオートが奇数の時、最後のダブルクオートはそのまま出力されます。
    {{ #time: Fには雪が"1m積もった。" |2006-02-12}} = 2月には雪が1m積もった。
    {{ #time:i's" |0:20:11}} = 20'11"
  2. PHPのdate()同様、エスケープ文字 "\"(円コード、バックスラッシュともいいます)は次の文字をエスケープします。\H は文字 H を出力し、\" は文字 " を出力し、\\ は文字 \ を出力します。
    {{ #time: "The month is" F}} = The month is 6月
    {{ #time:i's"}} = 20'27"
    {{ #time:\\123}} = \123

この機能の利用者からの希望により、<書式> の指定文字は今後追加される可能性があります。PHPの書式の指定文字のより完全な実装と、拡張された x コードの両方です。

引数 日時/時間 は、PHPの strtotime() で使われている文字列と全く同じです。それは December 112006-12-11 のような絶対的な日付や時刻と、時差やタイムゾーンの計算に便利な +10 hours (本当は +1000 という書き方ができるはずですが、2006年9月8日現在、プラスとマイナスが逆になってしまいます)のような相対的な日数、時間の両方をサポートしています。より詳しくはthe GNU tar manualをご覧ください。

{{#time:Y年Fj日|-14 days}} = 2024年6月12日(14日前)
{{#time:H:i|+9 hours}} = 00:20 (日本時間)
{{#time:H:i|8:15 +6 hours}} = 14:15 (6時間後)

rel2abs[編集]

rel2absは、ページ名の相対パスを絶対パスに変換します。

{{ #rel2abs : パス }}
{{ #rel2abs : パス | 基準パス }}

相対パスは、/./../のいずれかではじまるか、/..//.のいずれかを含んでいるか、...だけであるかのどれかです。基準パスが与える場合には、絶対パスで与えなければなりません。

例:

  • Help:Foo/barを基準に、{{ #rel2abs : ../baz }}とするならば、Help:Foo/bazが返されます。
  • Help:Fooを基準に、{{ #rel2abs : ../baz }}とするならば、bazが返されます。
  • Help:Fooを基準に、{{ #rel2abs : ../../baz }}とすると、Error: Invalid depth in path: "Help:Foo/../../baz" (tried to access a node above the root node)"となります。
  • {{ #rel2abs : ../baz | Help:Bar/foo }}とすると、Help:Bar/bazが返されます。
  • {{ #rel2abs : Help:Foo/bar/../baz }}とすると、Help:Foo/bazが返されます。

そのパスが実際に存在するかどうかは確認しません。そのためには、{{ #ifexist }}と併用してください。

例:

{{ #ifexist: {{ #rel2abs: .. }} | '..' が存在します。 | '..' は存在しません。}}


subst[編集]

substを条件文で用いたい場合には、"subst:"と"#"の間に空白を入れないでください。m:ヘルプ:テンプレート#substも参照してください。

[編集]

現在のところ、wikiのパイプを使った表の文法は、条件文の内部では使えません。次善策としては、

  • 「{{!}}」を使って、条件文からパイプを隠す。
  • htmlタグスタイルの文法を代わりに使う。

インストール[編集]

自分のメディアウィキにこの条件文をインストールするには、次の両方のファイルをダウンロードし、extensionsの中に ParserFunctions というディレクトリを作って、おいてください。

次に、LocalSettings.phpの最後に次の行を足します。

require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );

コードツリーを次の場所で見ることができます。

使用例[編集]

関連項目[編集]

外部リンク[編集]

<!--[[Category:MediaWiki extensions]]--> [[Category:ウィキペディアのテンプレート|*しようけんふん]] [[Category:条件文|*]] [[de:Hilfe:Vorlagenprogrammierung]] [[en:m:ParserFunctions]] [[fr:Aide:Fonctions parseur]] [[it:Aiuto:ParserFunctions]] [[nl:Help:ParsFuncties]] [[pl:Wikipedia:Funkcje parsera]] [[ru:Википедия:Функции парсера]] [[vi:Trợ giúp:Tính toán]] [[zh:help:模板扩展语法]] <!--{{edi|{{PAGENAME}}}}-->