置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

模組:Sandbox/C8H17OH/ParamGroup/doc

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋

此頁面為 Module:Sandbox/C8H17OH/ParamGroup 的說明文件

大萌字.svg
閱讀本用戶子頁面的任何人都可以參與編輯

本模塊用於將以一個參數的形式傳入的「參數組」解析成多個參數並傳給特定模板。

參數

本模塊的接口函數名為main,參數包括:

參數名 描述 默認值
templatetl、1 模板名 (必填)
args、2 「參數組」
delim 組內參數間分隔符 {{!}}
assign 鍵-值間賦值號 {{=}}
regex 是否使用正則表達式,非空為真

示例

以下各行

{{#invoke:Sandbox/C8H17OH|main|template=foo|args=arg1{{!}}arg2{{!}}key1{{=}}value1{{!}}key2{{=}}value2}}
{{#invoke:Sandbox/C8H17OH|main|template=foo|args=arg1; arg2; key1:value1; key2:value2|delim=;|assign=:}}
{{#invoke:Sandbox/C8H17OH|main|template=foo|args=arg1; arg2;key1:value1; key2:value2|delim=[;;]|assign=[::]|regex=on}}

結果都等同於

{{foo|arg1|arg2|key1=value1|key2=value2}}

用途

可以用於批量調用多參數模板。

詳解

需求:批處理模板

有時候我們會試圖利用解析器函數#fornumargs:或其他方法,在一個模板內多次調用另一個模板,將前者的每一個參數傳給後者,同時可以批量添加一些分隔符等,從而避免在最終代碼中多次調用後者和寫入分隔符,起到減少最終代碼的作用。這裡前者稱為「批處理模板」,後者稱為「核模板」。

例如,假設我們想在{{人物信息}}的【髮色】欄填寫7種髮色,那麼代碼一般為:

|发色={{发色|赤}}、{{发色|橙}}、{{发色|黄}}、{{发色|绿}}、{{发色|青}}、{{发色|蓝}}、{{发色|紫}}

假如我們有一個「批處理模板」{{多种发色}},那麼代碼就可以縮短為:

|发色={{多种发色|赤|橙|黄|绿|青|蓝|紫}}

對於熟練掌握fornumargs等解析器函數的資深編輯者,構造這樣一個批處理模板並不是特別困難:

{{#fornumargs:num|value|{{#ifexpr:{{#var:num}}>1|、}}{{发色|{{#var:value}}}}

上面的例子中「核模板」{{髮色}}有且只有一個參數。然而,我們的核模板常常是(或者需要是)具有多個參數的,參數的數量可能不固定,參數類型可能既有匿名又有實名,這時候構造一個批處理模板就很不簡單了,至少本模塊的創建者未能成功做到,直到創建並使用了本模塊。

解決方案:參數組

如果我們可以把意圖傳入核模板的多個參數打包成一個「參數組」,在批處理模板的每個參數中填入一個參數組,似乎就可以實現批處理功能了。為此,觀察模板使用的一般形式:

{{foo|arg1|arg2|key1=value1|key2=value2}}

{{foo|...}}中的...部分就是這裡所說的「參數組」,即:

arg1|arg2|key1=value1|key2=value2

其中管道符|是組內兩個參數之間的分隔符(delimiter),而等號是=連接每個實名參數的鍵(key,參數名)與值(value,參數值)的賦值號(assignment)。

為了將「參數組」打包在一個參數中,我們需要將管道符和等號替換成不會被直接解析的形式:

arg1{{!}}arg2{{!}}key1{{=}}value1{{!}}key2{{=}}value2

這樣在批處理模板中就可以這樣填寫:

{{foo batch
|case1_arg1{{!}}case1_arg2{{!}}key1{{=}}case1_value1{{!}}key2{{=}}case1_value2
|case2_arg1{{!}}case2_arg2{{!}}key1{{=}}case2_value1{{!}}key2{{=}}case2_value2
|case3_arg1{{!}}case3_arg2{{!}}key1{{=}}case3_value1{{!}}key2{{=}}case3_value2
}}

如果嫌{{!}}{{=}}看着眼花,也可以改用其他的分隔符和賦值號,比如模仿CSS的風格,分別用分號和冒號:

{{foo batch
|case1_arg1; case1_arg2; key1:case1_value1; key2:case1_value2
|case2_arg1; case2_arg2; key1:case2_value1; key2:case2_value2
|case3_arg1; case3_arg2; key1:case3_value1; key2:case3_value2
}}

從批處理模板的使用者的角度,這樣的代碼已經非常簡潔和清晰了。那麼,如何實現{{foo batch}}模板呢?

實現:使用本模塊

可以利用本模塊,構造{{foo batch}}如下:

{{#fornumargs:num|value|
{{#invoke:Sandbox/C8H17OH|main|template=foo|args={{#var:value}}}}
}}

如果替換了分隔符和賦值號,則為:

{{#fornumargs:num|value|
{{#invoke:Sandbox/C8H17OH|main|tl=foo|args={{#var:value}}|delim=;|assign=:}}
}}

還可以啟用正則表達式來實現更豐富的分隔符和賦值號,例如令二者都支持全角和半角:

{{#fornumargs:num|value|
{{#invoke:Sandbox/C8H17OH|main|foo|{{#var:value}}|delim=[;;]|assign=[::]|regex=on}}
}}

用例

其他用途

當然,本模塊也可以用於批處理模板以外的用途,雖然模塊創建者並未想到其他必須這樣構造「參數組」而不能直接給模板傳參的場景。

注意事項

根據已有測試經驗,與一般的模板使用類似:

  • 在分隔符、賦值號前後的空白字符不會影響正常使用。
  • 組內參數中不能出現分隔符,匿名參數的值中、實名參數的鍵中不能出現賦值號。
    • 對於這點,目前沒有像{{!}}{{=}}一樣的解決辦法,只能要求儘可能選用不會出現的符號。

參見

  • 模塊:Eval(調用本模塊(保持delimassign為默認值)與調用{{eval|template|...}}等價)