Module:Eval
跳到导航
跳到搜索
本模块/模板提供了在几乎任何地方解析几乎所有的Wiki文本的可能。
使用
[[模块:Eval]]与[[模板:Eval]]的使用格式基本一致,不过有部分参数按照编辑者的使用习惯进行了各自不同的优化。
下面格式中Eval
指:
- 使用模块时书写
#invoke:Eval
; - 使用模板时书写
Eval
。
展开模板
{{ Eval | template | 模板名称 | 参数列表... }}
- 参数
- 模板名称:要展开的模板的名称,不需要添加
Template:
名字空间前缀; - 参数列表:模板的所有参数。格式为:
参数名称 = Wiki文本
或Wiki文本
;- 参数名称为数字(或者不显示书写
【参数名称】=
)时,参数值可以书写多个要展开的模板的参数文本,如【模板参数1】{{!}}【模板参数2】{{!}}…
。
最终这些名称为数字的参数会按照顺序连接,成为要展开的模板的匿名参数列表; - 参数名称不为数字时,将等同于书写要展开的模板的同名参数。这些参数将会被连接在匿名参数列表之后。
解析Wiki文本
{{ Eval | wikitext | Wiki文本 }}
- 参数
- Wiki文本:任何Wiki文本都可以写入;
- 使用
nowiki
标签套住希望保持原样的Wiki文本,例如<nowiki>|</nowiki>
和{{!}}
是相同的,但不同于<nowiki>{{!}}</nowiki>
。
- 使用
嵌入页面
{{ Eval | page | 页面的完整标题 }}
- 参数
- 页面的完整标题:要嵌入的页面的带名字空间的标题。例如,本页面的完整标题为
Module:Eval
;- 需要注意的是,仅当这个页面的内容模型为
wikitext
(纯文本)时,本模块/模板才会工作。否则将不会嵌入内容模型为CSS
、JSON
、JavaScript
、Scribunto
(Lua)等的页面。
- 需要注意的是,仅当这个页面的内容模型为
nowiki标签的转义
在上述格式中,Wiki文本中的nowiki
标签都将被剥离,因此有必要规定一种格式用于不得不在Wiki文本中使用nowiki
标签的情况。
- 格式
$NOWIKI_S
:转义<nowiki>
;$NOWIKI_E
:转义</nowiki>
;$$
:转义$
。生效范围仅限于紧跟在$NOWIKI_S
和$NOWIKI_E
前方的连续的$
构成的字符串,其他地方将不会进行转义;- 优先进行
$$
→$
的转义,若破坏了$NOWIKI_S
和$NOWIKI_E
的结构,那么后两者将会输出NOWIKI_S
和NOWIKI_E
。$$$$NOWIKI_S
→$$NOWIKI_S
;$$$$$NOWIKI_E
→$$</nowiki>
。
示例
- 展开模板
{{#invoke:Eval|template|Ruby|<nowiki>1={{pgref|模块|Eval}}|2=<code>$NOWIKI_S{{pgref|模块|Eval}}$NOWIKI_E</code></nowiki>}} {{Eval|template|Ruby|{<nowiki>{tl|Eval}</nowiki>}|<code>$NOWIKI_S<nowiki>{{tl|Eval}}$NOWIKI_E</nowiki></code>}} {{Eval|template|Hide|标题=标题|内容=内容}}
效果:
- 解析Wiki文本
#{{#invoke:Eval|wikitext|<nowiki>{{</nowiki>tl<nowiki>|</nowiki>Eval<nowiki>}}</nowiki>}} #{{#invoke:Eval|wikitext|<nowiki>{{</nowiki>tl{{!}}Eval<nowiki>}}</nowiki>}} #{{Eval|wikitext|<nowiki>{{</nowiki>tl<nowiki>|</nowiki>Eval<nowiki>}}</nowiki>}} #{{Eval|wikitext|<nowiki>{{</nowiki>tl{{!}}Eval<nowiki>}}</nowiki>}} #{{Eval|wikitext|<nowiki>这里有一个Ruby→{{Ruby|下方文字|上方文字}}←。</nowiki>}}
效果:
- 嵌入页面
{{Eval|page|Template:辅助模板}}
效果:
|
local module = {} local getArgs = require("Module:Arguments").getArgs local preprocessNoWiki = function(wiki) wiki = mw.ustring.gsub(wiki, "(%$+)NOWIKI_([ES])", function(prefix, postfix) local length, tag = math.modf(mw.ustring.len(prefix) / 2) local escape = "" for i = 1, length do escape = escape .. "$" end if tag == 0 then tag = "NOWIKI_" .. postfix elseif postfix == "S" then tag = "<nowiki>" else tag = "</nowiki>" end return escape .. tag end) return wiki end function module.template(frame, args) args = args or getArgs(frame, { wrappers = "Template:Eval" }) local parentTitle = tostring((frame:getParent() or frame):getTitle()) local offset if parentTitle == "Template:Eval" then offset = 1 else offset = 0 end local tTitle = mw.text.trim(args[1 + offset] or "") if tTitle == "" then return nil end local tArgs = {} local indexes = {} for k, _ in pairs(args) do if type(k) == "number" then if k > 1 + offset then table.insert(indexes, k) end end end table.sort(indexes) for _, index in ipairs(indexes) do local wiki = args[index] wiki = mw.text.unstripNoWiki(wiki) wiki = mw.text.decode(wiki) table.insert(tArgs, preprocessNoWiki(wiki)) end for k, v in pairs(args) do if type(k) ~= "number" then local wiki = v wiki = mw.text.unstripNoWiki(wiki) wiki = mw.text.decode(wiki) table.insert(tArgs, mw.ustring.format("%s=%s", k, preprocessNoWiki(wiki))) end end tArgs = table.concat(tArgs, "|") if mw.ustring.len(tArgs) > 0 then tArgs = "|" .. tArgs end return frame:preprocess(mw.ustring.format("{{ %s %s}}", tTitle, tArgs)) end function module.wikitext(frame, args) args = args or frame.args local wiki = args[1] or "" wiki = mw.text.unstripNoWiki(wiki) wiki = mw.text.decode(wiki) return frame:preprocess(preprocessNoWiki(wiki)) end function module.page(frame, args) args = args or frame.args local title = mw.title.new(mw.text.trim(args[1] or "")) if title ~= nil and title.exists and title.contentModel == "wikitext" then local content = title:getContent() return frame:preprocess(content) end end return module