ヘルプ:テンプレート
Wikiのヘルプ |
---|
![]() |
Wiki構文 |
記事の編集 |
Wiki運営 |
MediaWikiの基本構文である、テンプレートの解説。
テンプレート
テンプレートは{{abc|xxxx}}
のような記述で、煩雑なコードやHTMLタグの記述を減らすことが可能な代替コードです。
もともと、{{:<ページ名>}}
の形の構文はインクルード用の構文であり、別ページを挿入するだけという使用方法が主でしたが、パラメーターを利用できるようにしたものがMediaWikiのテンプレートとなっています。
テンプレートの呼出と引数の指定方法
テンプレートはExcel関数のように引数(パラメーター)を指定して呼び出すことができます。
以下のように「|(パイプ)」で区切ることで複数の引数を指定できます。
{{テンプレート名| 引数1 | 引数2 | 引数3...}} |
引数は名前無し引数と名前有り引数があります。
- 名前無し引数は、1番目、2番目といった番号で管理され、指定する順序が正しくなければなりません。
- 名前有り引数は、<引数名>=<値>といったラベル付きで管理され、指定する順序を問いません。
{{テンプレート名| <値> }} |
{{テンプレート名| <引数名>=<値> }} |
名前無し引数 | 名前有り引数 |
---|
- 名前無し引数は、番号を指定することで名前付き引数と同じように指定することもできます。
次の2つの例の結果は同じになります。
{{テンプレート名| <値> }} |
最初の引数の番号は「0」ではなく「1」なので注意。
- 名前無し引数と名前付き引数が混在する場合、名前付き引数には番号は付与されません。
したがって、以下のような場合、引数1の内容はVar3
となります。
{{Test| Var1=Var1 | Var2=Var2 | Var3 }} |
テンプレートの作成
テンプレートのページ名は「Template:abc
」「テンプレート:abc
」となっており、管理者でなくとも作成が可能です。
また、単に別ページをインクルードしたいだけの場合は、「{{:別ページ名}}
」と書くことができます。
引数の受け取り
受け渡された引数を利用したい場合は次のように大かっこを3つ重ねて記述します。
{{{番号または引数名}}} |
ただしこの場合、引数が省略されていた場合に{{{番号または引数名}}}
といった値[1]が返されてしまいます。
次のように記述することで引数が省略された場合のデフォルト値を用意することができます。
{{{番号または引数名 | <デフォルト値> }}} |
パーサー関数
引数を利用して条件分岐や文字列の変換などを行うためにはどうすればいいでしょう?
それらの基本的な命令はパーサー関数と呼ばれる記述方法で行うことができます。
以下は代表的なパーサー関数の一部です。他のパーサー関数はこちらを参照して下さい。→ Help:Extension:ParserFunctions
#if
第一引数に与えられた値を評価して条件分岐を行います。
値が有効ならば <正>、無効ならば <否>を返します。
{{#if: <評価値> | <正> | <否> }} |
値の評価は 空文字、または数値として扱う場合に0
である場合に<否>を返し、基本的にはすべて<正>を返します。
注意:次のように記述した場合、引数{{{var}}}
は省略されている場合、文字列でそのまま{{{var}}}
を返し常に有効
を返します。
{{#if: {{{var}}} | 有効 | 無効 }}
引数が省略されているかをチェックしたい場合は{{{引数名 | }}}のように記述する必要があります。
{{#if: {{{var|}}} | 有効 | 無効 }}
#ifeq
第一、第二引数に与えられた値を比較して条件分岐を行います。
値が同じならば <正>、異なる場合 <否>を返します。
{{#ifeq: <評価値A> | <評価値B> | <正> | <否> }} |
#ifexist
第一引数に与えられたページ名の存在チェックを行い条件分岐を行います。
ページが存在するならば <正>、存在しない場合 <否>を返します。
{{#ifexist: <ページ名> | <正> | <否> }} |
#switch
第一引数に与えられた文字列から条件分岐を行います。
{{#switch: <評価文字列> |
Luaスクリプト(モジュール)の利用
Luaスクリプト(モジュール)はMediaWikiの拡張機能Extension:Scribuntoによって提供されます。
デフォルトでは無効となっています。MirahezeではWikiの拡張機能の管理(Special:ManageWiki/extensions
)で有効にすることができます。
Wiki構文のみで複雑なテンプレートを記述すると非常に読み難く、{{{{{....}}}}}
と大かっこだらけでデバッグも困難です。
そこで一部のテンプレートはModule(モジュール)とよばれるLuaというスクリプト言語を呼出して、テンプレートへ渡された複雑な引数の分解や解析、ループ処理などを行っています。
モジュールのページ名は「Module:abc
」「モジュール:abc
」となっています。
Luaモジュールの呼出
Luaモジュールは以下のようにパーサー関数#invokeで呼び出します。
{{#invoke: <モジュール名> | <function名> | <引数> }} |
通常のページからも呼び出せますが、他のテンプレート同様に呼び出せるように、ダミーのテンプレートページを作成してそこに記述することをおすすめします。
サンプルスクリプト
local p = {}
function p.base( f )
-- 引数の分解 -----------------------------------
local args = f
if f == mw.getCurrentFrame() then
args = require( 'Module:ProcessArgs' ).merge( true )
else
f = mw.getCurrentFrame()
end
-- ローカル変数の宣言 -----------------------------------
local message
-- 引数 var の値で分岐 -----------------------------------
if args[ 'var' ] == 'hello' then
-- 引数 var が 「hello」ならば 「Hello world !!」を返す
message = "Hello world !!"
elseif arg[ 'var' ] == 'apple' then
-- 引数 var が 「apple」ならば {{InvSprite| apple }} を返す
message = f:expandTemplate{ title = 'InvSprite', args = { 'apple' } }
else
-- 引数 var が省略されている場合
message = "デフォルト文字列"
end
-- 結果の文字列を返して終わる -----------------------------------
return tostring( message )
end
return p
テンプレートを作ってみたい!という方はこちらを参考してください。
<noinclude> と <includeonly>
テンプレートを呼び出したときに、テンプレートページそのものを表示した場合と、他のページからインクルードした場合に表示を切り替えることができます。
<includeonly>インクルード時だけ表示させたい文字列<br></includeonly>
どちらの場合にも表示させたい文字列<br>
<noinclude>インクルードさせたくない文字列</noinclude>
|
インクルード時だけ表示させたい文字列 |
どちらの場合にも表示させたい文字列 |
wiki構文 | 別ページからインクルードした場合 | テンプレートページを表示した場合 |
---|
<templatestyles>について
MediaWikiでは基本的にMediaWiki:Common.cssなどのMediaWiki名前空間は管理者権限でなければcssの編集はできません。
Extension:CSSによって追加されたパーサー関数の{{#css:}}を使用すればcss構文を利用することはできますが{{#css:}}で記述されたcssは別ページへはインクルードされません。
テンプレート内でcssを利用したい場合は、以下のように拡張HTMLタグを記述します。
テンプレート:ABCD/スタイルシート.css
を読み込ませる。
<templatestyles src="テンプレート:ABCD/スタイルシート.css" /> |
※この構文はExtension:TemplateStylesが導入されているWikiのみ利用可能です。
<templatestyles> はそのテンプレートをそのまま使用する場合には適していますが、infoboxなど基幹部品として再利用する場合には向いていません。
なぜならば再利用する側にも<templatestyles>を定義しなければcssが適用されないからです。
もし<templatestyles>を使用した基幹テンプレートを作成する場合は、<templatestyles>の追加方法を記載する必要があります。
OGPを意識したHTMLエレメント作り
OGPとは記事の内容を「画像」「タイトル」「説明文」などでカタログ表示する仕組みのことです。
SNSなどのWebサービスでユーザーがURLを貼り付けると自動的にそのURL先サイトのヘッダーからカタログが作成されるようになります。
この仕組はFacebookが提唱した独自プロトコルでしたが、現在ではあらゆるWebサイトで使用されています。
![]() |
当WikiメインページのOGPパラメータ部分 |
MediaWikiでは ページの先頭から最初に見つかった画像 と 見出しの前に存在するTable以外の文字列 を抽出し、それらをOGPのパラメータに割り当てます。
であれば、ページの先頭に貼り付けた情報用テンプレートの画像や文章も抽出されるはずですが、そうなっていません。なぜでしょうか?
それは使用されるHTMLエレメントに役割(role)を与えて抽出されないようにコントロールしているせいです。
- OGP抽出を回避するrole属性
参照:WAI-ARIA Roles - MDN
以下のようなrole属性のエレメントはOGP抽出が行われないことが分かっています。
- alert
- banner
- navigation
- tooltip
- roleの設定方法
以下のようにHTMLエレメントにrole属性を記述すると、その範囲はOGP抽出の対象から除外されます。
<div role="alert" >このページは書きかけです!ちょっとまってね!</div> |
このように、テンプレート製作者は、出力するHTMLにその役割によってrole属性をつけるように心がけるようにしましょう。
テンプレートの制約
テンプレートは一見万能のようですがそうではありません。
直接表組みを入れてはならない
たとえば表組みは、表組みの中に制約なく入れることができますが、テンプレートに表組みの構文を記述することはできないようです。
(書くとテンプレートとみなされなくなったり、テーブルが崩れてしまう)
その場合、別ページにテーブルのみを書いて保存し、{{:<テーブルのページ名>}}
と書いてインクルードしなければなりません。
同じ名前のパラメーターを複数回使ってはならない
テンプレートのパラメーターには同じ名前は使用できません。 通常はそれに不便はありませんが、たとえば以下のようなテンプレートを作りたい場合、不便です。
{{Test |style = center |ないよう1 |style = right |ないよう2 }}
この場合、styleは2回目の値しか適用されません。
ドキュメントページ
テンプレート自体の解説をテンプレート:ExampleTemplate/doc
のようなサブページに記載することができます。
ここで書いたドキュメントは、<noinclude> {{documentation}} </noinclude>
と記載すると、呼び出すことができます。
テンプレートデータ
<templatedata>
と</templatedata>
で囲われた部分にJSON形式のテンプレートデータを記載することができます。
これは自動的にテーブルに変換されて明示されます。
また、ビジュアルエディタでテンプレートを呼び出す際に、引数の解説や初期値などを表示することができます。
このテンプレートデータは、ソースエディタに表示される「テンプレートデータを管理」ボタンから、GUIを使用して追加することができます。
なお、このテンプレートデータはドキュメントページにも記載することが可能です。
テンプレートの一覧
- テンプレート/スプライト
- テンプレート/編集補助
- その他:テンプレートのカテゴリの一覧 を参照してみてください。
スプライトテンプレートのしくみ
スプライトは図のような仕組みでHTMLタグを出力しており、背景にスプライトシート画像を読み込み、画像の座標をずらすことで表現されています。
ただし魔改造されたGamepediaのMediaWikiでは上記のような方法でスプライト表示が行なえますが、Mirahezeの場合url(...)
が含まれるHTMLをテンプレートで出力するとセキュリティワーニングになり無視されます。
そのため、background-image: url(...);
の情報は予めクラス名を付けてMediaWiki:Common.cssに記載しておかなくてはなりません。
スプライトデータベース
各アイコンの座標はJSONやLuaテーブルというデータベースにアイコン名と関連づけて設定されており、座標情報を引数のキーワードから取得できるようになっています。
Luaモジュールで動作するGamepedia方式のスプライトはLuaテーブルからデータを取得します。
Javascriptで動作する当WikiのJSpriteモジュールはJSONからデータを取得します。
- LuaテーブルおよびJSONデータベース作成に利用できるツール
Javascriptの利用
テンプレートやモジュールでは実現できない機能はJavascriptで解決できることがあります。
MediaWikiではJQueryが有効となっているのでHTMLエレメントの操作なども手軽に利用できるようになっています。
テンプレートで特定のクラス名やIDなどを付与したHTMLエレメントを出力すれば、Javascipritのロード時にそのエレメントを操作することができます。
しかしながら現在のMediaWikiのバージョンではJavascript(ECMAScript)のES6(2015)までしか利用できないという制約があります。
MediaWikiでJavascriptを利用するには
MediaWikiではいくつかの方法でJavascriptを利用できます。以下は一般的な利用方法です。
Common.jsを利用
MediaWiki:Common.jsに直接Javascriptを記述する。
ここで別ページのJavascriptを複数読み込ませることもできますが、ページ数が多いとHTTP429エラーとなるので基本的にはすべて1個にページに記述しなければなりません。
スクリプトを個別に管理したい場合は後述のガジェットを利用するといいでしょう。
ガジェットを利用
Extension:Gadgetsを使用して個別にJavascriptを読み込ませる。
MediaWiki:Gadget-<ガジェット名>.js
というページを作成して、MediaWiki:Gadgets-definitionに設定を記述すると有効になります。
MediaWiki:Gadget-<ガジェット名>.css
というページを作成するとcssとセットで利用する事ができます。
個人スクリプトを利用する
当Wikiでは利用できませんが、$wgAllowUserJs
が有効の場合に利用できます。
User:<ユーザー名>/<スクリプト名>.js
というページを作成すると所有者のみに有効になります。
ユーザーグループスクリプトを利用する
MediaWiki:Group-<グループ名>.js
というページを作成すると、特定のユーザーグループのみにスクリプトが有効になります。
MediaWiki API
MediaWikiではWikiの操作に不可欠な機能を備えたAPIが提供されています。
- MediaWikiの設定の読み込み ->
mw.config
- ページ読み込み時やVisualエディタの読み込み完了時のイベントハンドラ ->
mw.hook
- ページの読み込み ->
mw.loader
- ページの存在確認、ページ名文字列の分解 ->
mw.Title