2017-06-18 9 views
2

テキスト、マークアップ、画像からなる文字のための何百もの伝記があります。パラメータに応じて異なるコンテンツを表示するMediawikiテンプレートを作成する最良の方法は?

私はあなたが書くことができるテンプレートを持っていたいと思います。 {{バイオグラフィー|スティーブン}}、それは各バイオグラフィーのページからそのバイオグラフィーを取得し、それぞれがパラメータにリンクされます。さらに、バイオの一部のみを表示するという選択肢、例えば、 {{伝記|スティーブン|人格}}

私は各伝記のテンプレートを作ることができますが、編集者が見つけなければならないテンプレートが何百もあると思います。大丈夫?)

私は依然として、バイオの一部に条件付きで表示するためにテンプレートを設定する方法を知りませんでした。

私はおそらくいくつかのデータストレージエクステンションを持っている必要があるのだろうかと思いますが、どうやらそれがおそらくどのようにページのテキストよりも速いのか分かりません。

ParserFunctionsまたは私の設定Luaを使用して条件付きコードが必要ですか?its many possible versions of a switch statementを使用してください。

このテンプレートは、人が1ページに1つのバイオを編集できるだけでなく、文字分類ごとに1ページだけ編集できるため、同じコンテンツを書き込むのではなく、時間を無駄にするのではなく、

このテンプレートは非常に使い勝手が良いので、編集者にとって使いやすく、使いやすく重要です。

私は誰かにそれを書いてもらうつもりはありません、それについてどうやって行くのかアドバイスしてください。

+0

通常、「バイオグラフィー」テンプレートは同じページで複数回使用されますか?または、通常は1ページに1回だけ使用されますか? –

+0

おそらく一度だけどおそらくもっと – o0o0o0o0o

答えて

1

これを行うには、個々のバイオグラフィーフィールドを選択できるようにデータを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を使って細かく調整してください。

+0

WOWはそのような詳細な回答をありがとうございます。私はそれを通して私の道を噛んでいる、私はそれを得ると思う。私はバスに乗った後、さらにテストしてそれらのエクステンションを試してみるつもりです。私の評判はまだ+15ではないので、それはちょうど表示されません。ありがとう、私はあなたのアイデアとコードが本当に好きです。 – o0o0o0o0o

関連する問題