本模塊/模板提供了在幾乎任何地方解析幾乎所有的Wiki文本的可能。
[[模塊:Eval]]與[[模板:Eval]]的使用格式基本一致,不過有部分參數按照編輯者的使用習慣進行了各自不同的優化。
下面格式中Eval指:
#invoke:Eval;Eval。Template:命名空間前綴;參數名稱 = Wiki文本或Wiki文本;【參數名稱】=)時,參數值可以書寫多個要展開的模板的參數文本,如【模板參數1】{{!}}【模板參數2】{{!}}…。nowiki標籤套住希望保持原樣的Wiki文本,例如<nowiki>|</nowiki>和{{!}}是相同的,但不同於<nowiki>{{!}}</nowiki>。Module:Eval;
wikitext(純文本)時,本模塊/模板才會工作。否則將不會嵌入內容模型為CSS、JSON、JavaScript、Scribunto(Lua)等的頁面。在上述格式中,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|標題=標題|內容=內容}}
效果:
#{{#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