Help:条件文

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Wikipedia:条件文 から転送)
ようこそ - ガイドブック - チュートリアル - 早見表 - FAQ - ヘルプ - 用語集 - 利用案内 - 質問

このページはメタウィキメディアヘルプ文書のコピーを(一部)もとにしています。


編集の基本
ページの編集
新規ページの作成
記事名チェック
文書の体裁
セクションと目次
箇条書き   表の作り方
脚注 | ISBNのリンク
特殊文字
HTMLタグの使用
画像などの利用
画像の表示
画像ページ
数式の書き方
リンクする
リンク | URL
パイプ付きリンク
言語間リンク
カテゴリ
リダイレクトソフト
ページの位置づけ
名前空間
サブページ
ミスなどの修正
新規ページのパトロール
以前の版にページを戻す方法
ページの移動
作業の効率化
マジックワード
テンプレート早わかり
テンプレートの制限
条件文 | テンプレートの説明文
ナビゲーションボックス
コミュニケーション
要約欄
細部の編集
ノートページ | 過去ログ
ウィキメール
その他
編集の競合
ページ名の働き
記事の定義
ページサイズ
音声・動画の作成と利用
棒グラフの書き方
サンドボックス
ヘルプの目次へ

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

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

目次

[編集] 各機能

このモジュールには現在、expr, if, ifeq, ifexist, ifexpr, switch, time, rel2abs の 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.28571428571
div 除算(/ と全く同じ) {{#expr: 30 div 7}} = 4.28571428571
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 です)

となります。

{{Exists}} (Meta) は、Interwiki リンクでも「存在する」文を返すこと以外は、同じ結果を返します。Interwiki リンクとそれ以外を区別するには {{If interwiki link}} (Meta) も使えます。

[編集] 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 2008
y 2桁の西暦年 06 08
L 閏年かどうかの判定。 閏年なら 1 、そうでなければ 0 1
n 月の数字。ひと桁の時も0が前に付かない。 1 から 12 5
m 月の数字。ひと桁の時は0が前に付く。 01 から 12 05
M 月の短縮形。たいていは国際化されている。 1月 5月
F 月。たいていは国際化されている。 1月 5月
t 月の日数。 28 から 31 31
j 日。ひと桁の時も0が前に付かない。 3 13
d 日。ひと桁の時は0が前に付く。 04 13
z 0から数えたその年の通算日数。 0 から 365 133
D 曜日の短縮形。まれに国際化されている。
l 曜日。まれに国際化されている。 月曜日 火曜日
w 曜日の数値。 0(日曜日) から 6(土曜日) 2
N ISO 8601形式の曜日。 1(月曜日) から 7(日曜日) 2
W ISO 8601形式の週の数。 20
a 午前、午後を am/pm で。 pm
A 午前、午後を AM/PM で。 PM
g 12時間制の時刻。ひと桁の時は0が前に付かない。 1 から 12 7
h 12時間制の時刻。ひと桁の時は0が前に付く。 01 から 12 07
G 24時間制の時刻。ひと桁の時は0が前に付かない。 0 から 23 19
H 24時間制の時刻。ひと桁の時は0が前に付く。 00 から 23 19
i 分。ひと桁の時は0が前に付く。 00 から 59 01
s 秒。ひと桁の時は0が前に付く。 00 から 59 50
U 1970年1月1日 00:00:00 (GMT) からの秒数 1210705310
c ISO 8601形式の日付。 2008-05-13T19:01:50+00:00
r RFC 2822形式の日付。 Tue, 13 May 2008 19:01:50 +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 5月
    {{#time:i's"}} = 01'50"
    {{#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}} = 2008年4月29日(14日前)
{{#time:H:i|+9 hours}} = 04:01 (日本時間)
{{#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 も参照してください。

[編集]

条件文の中にパイプ構文の表を直接埋め込むことはできません。パイプ構文で用いる | が条件文やテンプレートの引数の区切りと見なされてしまうためです。これを避けるには、{{!}}, {{!!}}, {{!-}} を用いてください。それぞれ |, ||, |- に変換されます。{{{!}} と {{!}}} はそれぞれ表の開始と終了を示す {||} になります。

HTML のタグで表を作ることもできます。

[編集] インストール

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

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

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

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

[編集] 使用例

[編集] 関連項目

[編集] 外部リンク