これを行うには、個々のバイオグラフィーフィールドを選択できるようにデータをgranularにする必要があります。これを行うには、MediaWikiでいくつかの方法があります。
パーサ関数
はどの拡張を追加することなく、仕事をするテンプレートを作成する#switchステートメントを使用することができます。
{{#switch: {{{character|}}}
| Steven = {{#switch: {{{trait|}}}
| Personality = Outgoing
| Age = 25
}}
| Dennis = {{#switch: {{{trait|}}}
| Personality = Shy
| Age = 34
}}
}}
あなたは、このようなTemplate:Biography
からそれを呼び出すことができます:たとえば、あなたがTemplate:Biography/data
でデータモジュールを持つことができます
{{#if: {{{2|}}}
| {{Biography/data|character={{{1|}}}|trait={{{2|}}}}}
|
* Name: {{{1|}}}
* Age: {{Biography/data|character={{{1|}}}|trait=Age}}
* Personality: {{Biography/data|character={{{1|}}}|trait=Personality}}
}}
あなたは、いくつかの異なる方法でこの#switch命令文を整理することができます。たとえば、Template:Biography/data/Steven
,Template:Biography/data/Dennis
などの異なるサブテンプレートTemplate:Biography
に格納されている各文字のデータを持つことができます。
テンプレート:伝記:
{{#if: {{{2|}}}
| {{Biography/data|{{{1|}}}|{{{2|}}}}}
|
* Name: {{{1|}}}
* Age: {{Biography/data|{{{1|}}}|Age}}
* Personality: {{Biography/data|{{{1|}}}|Personality}}
}}
テンプレート:伝記/データ
{{Biography/data/{{{1|}}}|trait={{{2|}}}}}
テンプレート:伝記/データ/スティーブン:
{{#switch: {{{trait|}}}
| Personality = Outgoing
| Age = 25
}}
これが私たちの最初の試みよりも良くなります長いswitch文がMediaWikiでは非常に遅いことが知られています。しかし、それを動作させるには依然として2つのレベルのサブテンプレートが必要です。特性を指定しない場合は、サブテンプレートを複数回呼び出す必要があります。だからそれはまだ遅くなるだろう。
Scribunto
あなたはScribunto拡張を経て、Luaのでテンプレートを書き込むことによって物事をスピードアップすることができます。あなたはこのようなデータモジュールを書くことができます(のは、それがModule:Biography/data
と呼ばれているとしましょう):
return {
['Steven'] = {
Personality = 'Outgoing',
Age = 25,
},
['Dennis'] = {
Personality = 'Shy',
Age = 34,
},
}
が次にあなたの代わりにあなたが使用するたびの、ページごとに一度、テーブル全体をロードしますmw.loadDataを使用してデータをロードすることができます{{Biography}}
テンプレート。たとえば:
local data = mw.loadData('Module:Biography/data')
local p = {}
local BIO_TEMPLATE = [[
* Name: %s
* Age: %d
* Personality: %s]]
-- Trim whitespace from args, and treat blank args as nil
local function preprocessArg(s)
if not s then
return nil
end
s = s:match('^%s*(.-)%s*$') -- trim whitespace
if s == '' then
return nil
else
return s
end
end
function p.main(frame)
local args = frame.args
local character = preprocessArg(args[1])
local trait = preprocessArg(args[2])
-- Check for blank character arguments
if not character then
return ''
end
-- Get the data for the specified character
local characterData = data[character]
if not characterData then
return ''
end
if trait then
-- User specified a trait, so return it
return characterData[trait] or ''
else
-- Return the biography template with all the traits in it
return string.format(
BIO_TEMPLATE,
character,
characterData.Age,
characterData.Personality
)
end
end
return p
はまた、あなたが#switch命令でできる限り同じように、アップ文字によって、または形質によるデータページを分割することができます。
Luaを使用することの不利な点は、編集者がデータモジュールにエントリを追加するためにLua構文とwikitext構文を学習する必要があることです。 Luaの構文は一般的にwikitextよりも習得が難しいので、これは人々の貢献を断つかもしれません。
拡張
非構造化されたデータウィキテキストの問題は長年の一つですので、長年にわたってそれを修正しようとする試みの多くがありました。純粋なパーサ関数または純粋なScribuntoを解決する前に、この問題を解決しようとした拡張のいくつかを調べることをお勧めします。
たとえば、labeled section transclusionの拡張子を使用すると、キャラクターの通常の伝記を書いたり、別のセクションを区切りしたり、トランスコードすることができます(テンプレートを使用してこれらの拡張子にアクセスできます)それらのセクションを別のページに個別に
スイッチ機能やデータモジュールに行き詰まる取得することなく、よりきめ細かなテンプレートを作るためにあなたを助けることができるより多くのデータに焦点を合わせた拡張もあります。
これはデータフィールドをデータベース(通常はMediaWikiインストールと同じもの)に別々に保存するため、パフォーマンスの特性はページを生成するために必要なデータベースアクセスの数とキャッシングの設定方法によって異なります。
もし私があなただったら、利用可能な拡張機能を最初に見て、状況に適したものがあるかどうかを見て、テンプレートまたはScribuntoを使って細かく調整してください。
通常、「バイオグラフィー」テンプレートは同じページで複数回使用されますか?または、通常は1ページに1回だけ使用されますか? –
おそらく一度だけどおそらくもっと – o0o0o0o0o