Module:Arguments:修订间差异
外观
修正错误 |
增加功能 |
||
第86行: | 第86行: | ||
end | end | ||
function p.merge(obj) | |||
if type(obj)~="table" then return obj end | |||
if obj["type"]=="list" then | |||
local res={} | |||
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(v[2])]=p.merge(v[1]) | |||
else | |||
--mw.log(v[1]) | |||
table.insert(res, p.merge(v[1])) | |||
end | |||
else | |||
--mw.log(v) | |||
table.insert(res, p.merge(v)) | |||
end | |||
end | |||
end | |||
return res | |||
elseif obj["type"]=="template" then | |||
return frame:expandTemplate{title=p.merge(obj[1]), args=p.merge(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(v)) | |||
end | |||
end | |||
return table.concat(res) | |||
else | |||
return obj | |||
end | |||
end | |||
-- 语法: | -- 语法: | ||
第95行: | 第131行: | ||
-- name ::= value | -- name ::= value | ||
p. | p.execute=function(frame) | ||
local argstr=frame.args[1] | |||
if not argstr then return end | |||
local r=p.merge(p.parse_args(argstr, 1)) | |||
local nr={} | |||
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 | |||
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(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 | |||
return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}") | |||
end | |||
p.fullserialize=function(frame) | |||
local argstr=frame.args[1] | local argstr=frame.args[1] | ||
if not argstr then return end | if not argstr then return end | ||
第122行: | 第195行: | ||
return res | return res | ||
elseif obj["type"]=="template" then | elseif obj["type"]=="template" then | ||
return mw.text.nowiki("{{" .. merge(obj[1]) .. "|" .. table.concat(merge(obj[2]), "|") .. "}}") | |||
elseif obj["type"]=="value" then | elseif obj["type"]=="value" then | ||
local res={} | local res={} | ||
第137行: | 第209行: | ||
end | end | ||
local r=merge(p.parse_args(argstr, 1)) | local r=merge(p.parse_args(argstr, 1)) | ||
local nr={} | local nr={} | ||
for i, v in ipairs(r) do | |||
table.insert(nr, v) | |||
end | |||
for i, v in pairs(r) do | for i, v in pairs(r) do | ||
if type(i) | if type(i)~="number" then | ||
table.insert(nr, i .. "=" .. v) | |||
end | end | ||
end | end | ||
return | return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}") | ||
end | end | ||
return p | return p |
2020年3月8日 (日) 09:45的版本
此模块的文档可以在Module:Arguments/doc创建
local p={}
p.version=function(frame)
return "0.1"
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
function p.parse_value(str, start)
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)
i=i+1
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
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
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
i=i+1
end
return args
end
function p.merge(obj)
if type(obj)~="table" then return obj end
if obj["type"]=="list" then
local res={}
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(v[2])]=p.merge(v[1])
else
--mw.log(v[1])
table.insert(res, p.merge(v[1]))
end
else
--mw.log(v)
table.insert(res, p.merge(v))
end
end
end
return res
elseif obj["type"]=="template" then
return frame:expandTemplate{title=p.merge(obj[1]), args=p.merge(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(v))
end
end
return table.concat(res)
else
return obj
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(p.parse_args(argstr, 1))
local nr={}
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
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(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
return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}")
end
p.fullserialize=function(frame)
local argstr=frame.args[1]
if not argstr then return end
local function merge(obj)
if type(obj)~="table" then return obj end
if obj["type"]=="list" then
local res={}
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[merge(v[2])]=merge(v[1])
else
--mw.log(v[1])
table.insert(res, merge(v[1]))
end
else
--mw.log(v)
table.insert(res, merge(v))
end
end
end
return res
elseif obj["type"]=="template" then
return mw.text.nowiki("{{" .. merge(obj[1]) .. "|" .. table.concat(merge(obj[2]), "|") .. "}}")
elseif obj["type"]=="value" then
local res={}
for i, v in ipairs(obj) do
if i~="type" then
table.insert(res, merge(v))
end
end
return table.concat(res)
else
return obj
end
end
local r=merge(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
return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}")
end
return p