MediaWikiサイトにおけるテンプレートとは、他のページから読み込んで使える定型文のことである。
Wikipediaの記事では右側に情報ボックスが置いてあったり、記事最下部にナビゲーションボックスが置いてある記事をよく見かける。これらは大抵、テンプレートを読み込んで表示している。
ネット用語における「テンプレ」のように「ソースをコピーして書き換えて使ってください」というものではない。使用時にはテンプレートの中身を意識しなくても、記事中に「{{テンプレート名}}」のように記載するだけでよい。また、テンプレートの内容を更新すると、テンプレートを使っている各ページを書き換えなくても全てのページが自動的に新しい内容に更新される。
テンプレート内では条件分岐や計算が行え、スクリプト言語のLuaをモジュールとして組み込むこともできるので、「XXXX年XX月XX日(XX歳)」などの年齢計算をはじめとする豊富な表現力を持っている。(これらは厳密にはテンプレートとは別の拡張機能だが、条件文を記事に直書きする必要性はないので、実質的にテンプレートと不可分の存在である)
Wikiサイトでは記事執筆よりもテンプレート作成を主戦力とする利用者が一定数存在し、「テンプレート職人」などと持て囃されることが多い。
テンプレートの威力を示すために、ニコニコ大百科の複数記事に貼られている一覧表をMediaWikiに移植してみよう。
ここでは例として、単語記事「ニコニコ動画」および各バージョン記事にあるニコニコ動画の変遷一覧表をテンプレート化してみる。
長々としたHTMLをコピペする必要はなく、これだけの記載でよい。
{{ニコニコ変遷表}}
新バージョン追加時には呼び出し先のテンプレートのみ更新すれば、各記事を修正しに回る必要はない。
続いて呼び出し先のテンプレートを作ってみる。
<table class="wikitable" style="border: none; background: transparent; margin: 1em auto; text-align: center;> <!-- MediaWikiでは<col>要素が使えないため空のtdで代用 --> <tr> <td style="width: 10em; min-width: 80px; border: none;"> <td style="width: 45%; min-width: 6em; border: none;"> <td style="width: 12.5em; font-size: 0.8em; border: none;"> </tr> <tr> <th>- 第一弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(仮) | background-color: #ecec97;}}">[[ニコニコ動画(仮)]]</td> <td style="font-size: 0.8em; border: none;">06/12/12 - 07/01/15</td> </tr> <tr> <th>- 第二弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(β) | background-color: #ecec97;}}">[[ニコニコ動画(β)]]</td> <td style="font-size: 0.8em; border: none;">07/01/15 - 07/02/24</td> </tr> <tr> <th>- 第三弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(γ) | background-color: #ecec97;}}">[[ニコニコ動画(γ)]]</td> <td style="font-size: 0.8em; border: none;">07/03/06 - 07/06/18</td> </tr> <tr> <th>- 第四弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(RC) | background-color: #ecec97;}}">[[ニコニコ動画(RC)]]</td> <td style="font-size: 0.8em; border: none;">07/06/18 - 07/10/10</td> </tr> <tr> <th>- 第五弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(RC2) | background-color: #ecec97;}}">[[ニコニコ動画(RC2)]]</td> <td style="font-size: 0.8em; border: none;">07/10/10 - 08/03/05</td> </tr> <tr> {{#switch: {{PAGENAME}} | ニコニコ動画(SP1) | ニコニコ動画2.0(笑) = <tr> <th rowspan="3">- 第六弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(SP1) | background-color: #ecec97;}}">[[ニコニコ動画(SP1)]]</td> <td style="font-size: 0.8em; border: none;">08/03/05 - 08/03/31</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画2.0(笑) | background-color: #ecec97;}}">[[ニコニコ動画2.0(笑)]]</td> <td style="font-size: 0.8em; border: none;">(乱入)</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(SP1) | background-color: #ecec97;}}">[[ニコニコ動画(SP1)]]</td> <td style="font-size: 0.8em; border: none;">08/04/02 - 08/07/05</td> </tr> | #default = <tr> <th>- 第六弾 -</th> <td>[[ニコニコ動画(SP1)]]</td> <td style="font-size: 0.8em; border: none;">08/03/05 - 08/07/05</td> </tr> }} </tr> <tr> <th>- 第七弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(夏) | background-color: #ecec97;}}">[[ニコニコ動画(夏)]]</td> <td style="font-size: 0.8em; border: none;">08/07/05 - 08/10/01</td> </tr> <tr> <th>- 第八弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(秋) | background-color: #ecec97;}}">[[ニコニコ動画(秋)]]</td> <td style="font-size: 0.8em; border: none;">08/10/01 - 08/12/05</td> </tr> <tr> <th>- 第九弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(冬) | background-color: #ecec97;}}">[[ニコニコ動画(冬)]]</td> <td style="font-size: 0.8em; border: none;">08/12/05 - 08/12/12</td> </tr> <tr> {{#switch: {{PAGENAME}} | ニコニコ動画(ββ) | ニコニコ動画(βββ) = <tr> <th rowspan="3">- 第十弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(ββ) | background-color: #ecec97;}}">[[ニコニコ動画(ββ)]]</td> <td style="font-size: 0.8em; border: none;">08/12/12 - 09/03/31</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(βββ) | background-color: #ecec97;}}">[[ニコニコ動画(βββ)]]</td> <td style="font-size: 0.8em; border: none;">(乱入)</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(ββ) | background-color: #ecec97;}}">[[ニコニコ動画(ββ)]]</td> <td style="font-size: 0.8em; border: none;">09/04/02 - 09/10/29</td> </tr> | #default = <tr> <th>- 第十弾 -</th> <td>[[ニコニコ動画(ββ)]]</td> <td style="font-size: 0.8em; border: none;">08/12/12 - 09/10/29</td> </tr> }} </tr> {{#switch: {{PAGENAME}} | ニコニコ動画(9) | ニコニコ動画 祝黒字化 = <tr> <th rowspan="3">- 第十一弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(9) | background-color: #ecec97;}}">[[ニコニコ動画(9)]]</td> <td style="font-size: 0.8em; border: none;">09/10/29 - 10/03/31</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画 祝黒字化 | background-color: #ecec97;}}">[[ニコニコ動画 祝黒字化]]</td> <td style="font-size: 0.8em; border: none;">(乱入)</td> </tr> <tr> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(9) | background-color: #ecec97;}}">[[ニコニコ動画(9)]]</td> <td style="font-size: 0.8em; border: none;">10/04/02 - 10/10/29</td> </tr> | #default = <tr> <th>- 第十一弾 -</th> <td>[[ニコニコ動画(9)]]</td> <td style="font-size: 0.8em; border: none;">09/10/29 - 10/10/29</td> </tr> }} <tr> <th>- 第十二弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画(原宿) | background-color: #ecec97;}}">[[ニコニコ動画(原宿)]]</td> <td style="font-size: 0.8em; border: none;">10/10/29 - 12/04/30</td> </tr> <tr> <th>- 第十三弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画:Zero | background-color: #ecec97;}}">[[ニコニコ動画:Zero]]</td> <td style="font-size: 0.8em; border: none;">12/05/01 - 12/10/17</td> </tr> <tr> <th>- 第十四弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画:Q | background-color: #ecec97;}}">[[ニコニコ動画:Q]]</td> <td style="font-size: 0.8em; border: none;">12/10/18 - 13/10/07 </tr> <tr> <th>- 第十五弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ動画:GINZA | background-color: #ecec97;}}">[[ニコニコ動画:GINZA]]</td> <td style="font-size: 0.8em; border: none;">13/10/08 - 18/06/27 </tr> <tr> <th>- 第十六弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | niconico(く) | background-color: #ecec97;}}">[[niconico(く)]]</td> <td style="font-size: 0.8em; border: none;">18/06/28 - 20/08/09 </tr> <tr> <th>- 第十七弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ(Re) | background-color: #ecec97;}}">[[ニコニコ(Re)|ニコニコ動画(Re)]]</td> <td style="font-size: 0.8em; border: none;">20/08/09 - 22/12/12 </tr> <tr> <th>- 第十八弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ(eR) | background-color: #ecec97;}}">[[ニコニコ(eR)]]</td> <td style="font-size: 0.8em; border: none;">22/12/12 - 24/06/08 </tr> <tr> <th>- 第十九弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | ニコニコ(Re:仮) | background-color: #ecec97;}}">[[ニコニコ(Re:仮)]]</td> <td style="font-size: 0.8em; border: none;">24/06/14 - 24/08/05 </tr> <tr> <th>- 第二十弾 -</th> <td style="{{#ifeq: {{PAGENAME}} | 帰ってきたニコニコ | background-color: #ecec97;}}">[[帰ってきたニコニコ]]</td> <td style="font-size: 0.8em; border: none;">←24/08/05 - 24/09/17 </tr> <tr> <th>- 第二十一弾 -</th> <td style="background-color: #11ee9a;">[[ニコニコ(Re:turn)]]</td> <td style="font-size: 0.8em; border: none;">←今これ(24/09/17 -) </tr> </table>
繰り返しになるが、新バージョン追加時には呼び出し先のテンプレートのみ更新すれば、各記事を修正しに回る必要はない。
「テンプレートの内部でテンプレートを呼び出せる」という特徴を使って、上記テンプレートをブラッシュアップしてみよう。
{{ニコニコ変遷表}}
各記事からの呼び出し方は上記と変わらない。
「ニコニコ変遷表/row」という内部テンプレートを作り、面倒な条件分岐を共通化する。
<table class="wikitable" style="border: none; background: transparent; margin: 1em auto; text-align: center;> {{ニコニコ変遷表/row|2006/12/12|2007/01/15|第一弾|ニコニコ動画(仮)}} {{ニコニコ変遷表/row|2007/01/15|2007/02/24|第二弾|ニコニコ動画(β)}} {{ニコニコ変遷表/row|2007/03/06|2007/06/18|第三弾|ニコニコ動画(γ)}} {{ニコニコ変遷表/row|2007/06/18|2007/10/10|第四弾|ニコニコ動画(RC)}} {{ニコニコ変遷表/row|2007/10/10|2008/03/05|第五弾|ニコニコ動画(RC2)}} {{ニコニコ変遷表/row|2008/03/05|2008/07/05|第六弾|ニコニコ動画(SP1)|aprildate=2008/04/01|aprilname=ニコニコ動画2.0(笑)}} {{ニコニコ変遷表/row|2008/07/05|2008/10/01|第七弾|ニコニコ動画(夏)}} {{ニコニコ変遷表/row|2008/10/01|2008/12/05|第八弾|ニコニコ動画(秋)}} {{ニコニコ変遷表/row|2008/12/05|2008/12/12|第九弾|ニコニコ動画(冬)}} {{ニコニコ変遷表/row|2008/12/12|2009/10/29|第十弾|ニコニコ動画(ββ)|aprildate=2009/04/01|aprilname=ニコニコ動画(βββ)}} {{ニコニコ変遷表/row|2009/10/29|2010/10/29|第十一弾|ニコニコ動画(9)|aprildate=2010/04/01|aprilname=ニコニコ動画 祝黒字化}} {{ニコニコ変遷表/row|2010/10/29|2012/04/30|第十二弾|ニコニコ動画(原宿)}} {{ニコニコ変遷表/row|2012/05/01|2012/10/17|第十三弾|ニコニコ動画:Zero}} {{ニコニコ変遷表/row|2012/10/18|2013/10/07|第十四弾|ニコニコ動画:Q}} {{ニコニコ変遷表/row|2013/10/08|2018/06/27|第十五弾|ニコニコ動画:GINZA}} {{ニコニコ変遷表/row|2018/06/28|2020/08/09|第十六弾|niconico(く)}} {{ニコニコ変遷表/row|2020/08/09|2022/12/12|第十七弾|ニコニコ動画(Re)|link=ニコニコ(Re)}} {{ニコニコ変遷表/row|2022/12/12|2024/06/08|第十八弾|ニコニコ(eR)}} {{ニコニコ変遷表/row|2024/06/14|2024/08/05|第十九弾|ニコニコ(Re:仮)}} {{ニコニコ変遷表/row|2024/08/05|2024/09/17|第二十弾|帰ってきたニコニコ}} {{ニコニコ変遷表/row|2024/09/17||第二十一弾|ニコニコ(Re:turn)}} </table>
数百行や数千行単位になったときでもソースの見通しが立ちやすくなっただろう。
ここで各バージョンの行を生成する……と行きたいところだが、エイプリルフールまわりの分岐処理が面倒だったので「第○弾」の列のみ生成し、残り2列は内部テンプレートをもう1段階かませることにする。
現在のバージョンに「←今これ」を表示するための条件判定もここで行う。
{{#switch: {{#if: {{{aprilname|}}} | {{PAGENAME}} }} | {{{4}}} | {{{aprilname}}} = <tr> <th style="width: 10em; min-width: 80px;" rowspan="3">- {{{3}}} -</th> {{ニコニコ変遷表/cells | name = {{{4}}} | link = {{{link|{{{4}}}}}} | period = {{#timel:y/m/d|{{{1}}}}} - {{#timel:y/m/d|{{{aprildate}}} -1 day}} | current_flg = {{#ifexpr: ({{#timel:Ymd|{{{1}}}}} <= {{#timel:Ymd}}) and ({{#timel:Ymd}} < {{#timel:Ymd|{{{aprildate}}}}}) | true }} }} </tr> <tr> {{ニコニコ変遷表/cells | name = {{{aprilname}}} | link = {{{aprillink|{{{aprilname}}}}}} | period = (乱入) | current_flg = {{#ifexpr: {{#timel:Ymd}} = {{#timel:Ymd|{{{aprildate}}}}} | true }} }} </tr> <tr> {{ニコニコ変遷表/cells | name = {{{4}}} | link = {{{link|{{{4}}}}}} | period = {{#timel:y/m/d|{{{aprildate}}} +1 day}} - {{#if: {{{2|}}} | {{#timel:y/m/d|{{{2}}}}}}} | current_flg = {{#ifexpr: ({{#timel:Ymd|{{{aprildate}}}}} < {{#timel:Ymd}}) and ({{#timel:Ymd}} <= {{#timel:Ymd|{{{2|}}}}}) | true }} }} </tr> | #default = <tr> <th style="width: 10em; min-width: 80px;">- {{{3}}} -</th> {{ニコニコ変遷表/cells | name = {{{4}}} | link = {{{link|{{{4}}}}}} | period = {{#timel:y/m/d|{{{1}}}}} - {{#if: {{{2|}}} | {{#timel:y/m/d|{{{2}}}}}}} | current_flg = {{#ifexpr: ({{#timel:Ymd|{{{1}}}}} < {{#timel:Ymd}}) and ({{#timel:Ymd}} <= {{#timel:Ymd|{{{2|}}}}}) | true }} }} </tr> }}
最後に残った中列と右列を生成する。
<td style="width: 45%; min-width: 6em; {{ #if: {{{current_flg|}}} | background-color: #11ee9a; | {{ #ifeq: {{PAGENAME}} | {{{link}}} | background-color: #ecec97; }} }}">[[{{{link}}}|{{{name}}}]]</td> <td style="width: 12.5em; font-size: 0.8em; font-size: 0.8em; border: none;">{{ #if: {{{current_flg|}}} | ←今これ({{{period}}}) | {{{period}}} }}</td>
掲示板
急上昇ワード改
最終更新:2025/05/16(金) 10:00
最終更新:2025/05/16(金) 10:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。