Module:Arguments:修订间差异
解析参数字符串 |
小 受到保护的"模块:Arguments": 高流量页面: 包含代码 ([edit=sysop] (无限期) [move=sysop] (无限期)) [连锁] |
||
(未显示同一用户的9个中间版本) | |||
第5行: | 第5行: | ||
end | end | ||
function p.parse_template(str, start) | |||
local i=start | |||
local template={} | |||
template["type"]="template" | |||
local len=mw.ustring.len(str) | |||
local ch=mw.ustring.sub(str, i, i) | |||
local a | |||
a, i=p.parse_value(str, i+1) | |||
table.insert(template, a) | |||
a, i=p.parse_args(str, i+1) | |||
table.insert(template, a) | |||
return template, i+1 | |||
end | |||
p. | function p.parse_value(str, start) | ||
local | local i=start | ||
local escape=false | |||
local val={} | |||
val["type"]="value" | |||
local len=mw.ustring.len(str) | |||
while i and i<=len do | |||
local ch=mw.ustring.sub(str, i, i) | |||
if escape then | |||
table.insert(val, ch) | |||
local | |||
i=i+1 | i=i+1 | ||
if i | escape=false | ||
else | |||
if ch=="\\" then | |||
i=i+1 | |||
escape=true | |||
elseif ch==")" or ch=="," or ch==":" then | |||
return val, i | |||
elseif ch=="(" then | |||
local t | |||
t, i=p.parse_template(str, i) | |||
table.insert(val, t) | |||
else | |||
table.insert(val, ch) | |||
i=i+1 | |||
end | |||
end | end | ||
end | |||
return val | |||
end | |||
function p.parse_arg(str, start) | |||
local i=start | |||
local arg={} | |||
arg["type"]="arg" | |||
local len=mw.ustring.len(str) | |||
local v | |||
v, i=p.parse_value(str, i) | |||
if mw.ustring.sub(str, i, i)==":" then | |||
arg[2]=v | |||
v, i=p.parse_value(str, i+1) | |||
end | |||
arg[1]=v | |||
return arg, i | |||
end | |||
function p.parse_args(str, start) | |||
local i=start | |||
local args={} | |||
args["type"]="list" | |||
local len=mw.ustring.len(str) | |||
while i and i<=len do | |||
local a | local a | ||
a, i=p.parse_arg(str, i) | |||
table.insert(args, a) | |||
--mw.log(i, mw.ustring.sub(str, i, i)) | |||
if mw.ustring.sub(str, i, i)~="," then | |||
return args, i | |||
end | end | ||
i=i+1 | |||
end | end | ||
return args | |||
end | |||
function p.merge(frame, obj) | |||
if type(obj)~="table" then return obj end | |||
if obj["type"]=="list" then | |||
local res={} | |||
if | for i, v in ipairs(obj) do | ||
if i~="type" then | |||
if v["type"]=="arg" then | |||
if v[2] then | |||
--mw.log(v[2],v[1]) | |||
res[p.merge(frame, v[2])]=p.merge(frame, v[1]) | |||
else | |||
--mw.log(v[1]) | |||
table.insert(res, p.merge(frame, v[1])) | |||
end | |||
table.insert( | |||
else | else | ||
table.insert( | --mw.log(v) | ||
table.insert(res, p.merge(frame, v)) | |||
end | end | ||
end | end | ||
end | end | ||
return | return res | ||
elseif obj["type"]=="template" then | |||
--return "{{" .. p.merge(frame, obj[1]) .. "|" .. table.concat(p.merge(frame, obj[2]), "|") .. "}}" | |||
return frame:expandTemplate{title=p.merge(frame, obj[1]), args=p.merge(frame, obj[2])} | |||
elseif obj["type"]=="value" then | |||
local res={} | |||
for i, v in ipairs(obj) do | |||
if i~="type" then | |||
table.insert(res, p.merge(frame, v)) | |||
end | |||
end | |||
return table.concat(res) | |||
else | |||
return obj | |||
end | end | ||
end | |||
-- 语法: | |||
-- S ::= args | |||
-- args ::= args,arg | arg | |||
-- arg ::= name:value | value | |||
-- value ::= value char | value template | char | template | |||
-- template ::= (name,args) | |||
-- name ::= value | |||
p.execute=function(frame) | |||
local argstr=frame.args[1] | |||
if not argstr then return end | |||
local r=p.merge(frame, p.parse_args(argstr, 1)) | |||
local nr={} | |||
if | for i, v in pairs(r) do | ||
if type(i)=="number" then | |||
if i>1 then | |||
table.insert(nr, v) | |||
--mw.log(v) | |||
end | |||
else | |||
nr[i]=v | |||
--mw.log(i,v) | |||
end | end | ||
end | end | ||
return frame:expandTemplate{title=r[1], args=nr} | |||
end | |||
p.serialize=function(frame) | |||
local argstr=frame.args[1] | |||
if not argstr then return end | |||
local r=p.merge(frame, p.parse_args(argstr, 1)) | |||
local nr={} | |||
for i, v in ipairs(r) do | |||
table.insert(nr, v) | |||
end | |||
for i, v in pairs(r) do | |||
if type(i)~="number" then | |||
table.insert(nr, i .. "=" .. v) | |||
end | end | ||
end | end | ||
return mw.text.nowiki("{{") .. table.concat(nr, mw.text.nowiki("|")) .. mw.text.nowiki("}}") | |||
end | |||
p.fullserialize=function(frame) | |||
local argstr=frame.args[1] | |||
if not argstr then return end | |||
local fakeframe={} | |||
fakeframe.expandTemplate=function(self, value) | |||
return "{{" .. value.title .. "|" .. table.concat(value.args, "|") .. "}}" | |||
end | |||
setmetatable(fakeframe, {__index=frame}) | |||
local r=p.merge(fakeframe, p.parse_args(argstr, 1)) | |||
local nr={} | |||
for i, v in ipairs(r) do | |||
table.insert(nr, v) | |||
end | |||
for i, v in pairs(r) do | |||
if type(i)~="number" then | |||
table.insert(nr, i .. "=" .. v) | |||
end | end | ||
end | end | ||
return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}") | |||
end | end | ||
return p | return p |