跳转到内容

Module:Arguments:修订间差异

来自锑星百科
解析参数字符串
 
受到保护的"模块:Arguments": 高流量页面: 包含代码 (‎[edit=sysop] (无限期) ‎[move=sysop] (无限期)) [连锁]
 
(未显示同一用户的9个中间版本)
第5行: 第5行:
end
end


-- 语法:
function p.parse_template(str, start)
-- S ::= args
  local i=start
-- args ::= args,arg | arg
  local template={}
-- arg ::= name:value | value
  template["type"]="template"
-- value ::= value char | value template | char | template
  local len=mw.ustring.len(str)
-- template ::= $(name,args)
  local ch=mw.ustring.sub(str, i, i)
-- name ::= value
  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.parse=function(frame)
function p.parse_value(str, start)
   local argstr=frame.args[1]
   local i=start
   if not argstr then return end
  local escape=false
  local val={}
  val["type"]="value"
   local len=mw.ustring.len(str)


   local function parse_template(str, start)
   while i and i<=len do
    local i=start
     local ch=mw.ustring.sub(str, i, i)
    local template={}
     if escape then
    template["type"]="template"
      table.insert(val, ch)
     local len=mw.ustring.len(str)
     -- 跳过无效字符
    while mw.ustring.sub(str, i, i)~="(" do
       i=i+1
       i=i+1
       if i>len then return end
      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
    local ch=mw.ustring.sub(str, i, i)
  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
     if ch=="(" then
     a, i=p.parse_arg(str, i)
      a, i=parse_value(str, i+1)
    table.insert(args, a)
      table.insert(template, a)
    --mw.log(i, mw.ustring.sub(str, i, i))
      a, i=parse_args(str, i+1)
    if mw.ustring.sub(str, i, i)~="," then
      table.insert(template, a)
      return args, i
     end
     end
     return template, i
     i=i+1
   end
   end
  return args
end


  local function parse_value(str, start)
function p.merge(frame, obj)
    local i=start
  if type(obj)~="table" then return obj end
    local escape=false
    local val={}
    val["type"]="value"
    local len=mw.ustring.len(str)


    while i and i<=len do
  if obj["type"]=="list" then
      local ch=mw.ustring.sub(str, i, i)
    local res={}
       if escape then
    for i, v in ipairs(obj) do
        table.insert(val, ch)
       if i~="type" then
        i=i+1
         if v["type"]=="arg" then
        escape=false
           if v[2] then
      else
            --mw.log(v[2],v[1])
        if ch=="\\" then
            res[p.merge(frame, v[2])]=p.merge(frame, v[1])
          i=i+1
           else
          escape=true
            --mw.log(v[1])
         elseif ch==")" or ch=="," or ch==":" then
            table.insert(res, p.merge(frame, v[1]))
           return val, i
          end
        elseif ch=="$" then
          local t
          t, i=parse_template(str, i+1)
           table.insert(val, t)
         else
         else
           table.insert(val, ch)
          --mw.log(v)
          i=i+1
           table.insert(res, p.merge(frame, v))
         end
         end
       end
       end
     end
     end
     return val
     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


  local function parse_arg(str, start)
-- 语法:
    local i=start
-- S ::= args
    local arg={}
-- args ::= args,arg | arg
    arg["type"]="arg"
-- arg ::= name:value | value
    local len=mw.ustring.len(str)
-- 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 v
  local r=p.merge(frame, p.parse_args(argstr, 1))
    v, i=parse_value(str, i)
  local nr={}
     if mw.ustring.sub(str, i, i)==":" then
  for i, v in pairs(r) do
       arg[2]=v
     if type(i)=="number" then
       v, i=parse_value(str, i+1)
       if i>1 then
        table.insert(nr, v)
        --mw.log(v)
      end
    else
      nr[i]=v
       --mw.log(i,v)
     end
     end
    arg[1]=v
    return arg, i
   end
   end
  return frame:expandTemplate{title=r[1], args=nr}
end


  local function parse_args(str, start)
p.serialize=function(frame)
    local i=start
  local argstr=frame.args[1]
    local args={}
  if not argstr then return end
    args["type"]="list"
    local len=mw.ustring.len(str)


    while i and i<=len do
  local r=p.merge(frame, p.parse_args(argstr, 1))
      local a
  local nr={}
      a, i=parse_arg(str, i)
  for i, v in ipairs(r) do
      table.insert(args, a)
    table.insert(nr, v)
      --mw.log(i, mw.ustring.sub(str, i, i))
  end
      if mw.ustring.sub(str, i, i)~="," then
  for i, v in pairs(r) do
        return args, i
    if type(i)~="number" then
      end
      table.insert(nr, i .. "=" .. v)
      i=i+1
     end
     end
    return args
   end
   end
  return mw.text.nowiki("{{") .. table.concat(nr, mw.text.nowiki("|")) .. mw.text.nowiki("}}")
end


  local function merge(obj)
p.fullserialize=function(frame)
    if type(obj)~="table" then return obj end
  local argstr=frame.args[1]
  if not argstr then return end


    if obj["type"]=="list" then
  local fakeframe={}
      local res={}
  fakeframe.expandTemplate=function(self, value)
      for i, v in ipairs(obj) do
    return "{{" .. value.title .. "|" .. table.concat(value.args, "|") .. "}}"
        if i~="type" then
  end
          if v["type"]=="arg" then
  setmetatable(fakeframe, {__index=frame})
            if v[2] then
  local r=p.merge(fakeframe, p.parse_args(argstr, 1))
              res[merge(v[2])]=merge(v[1])
  local nr={}
            else
  for i, v in ipairs(r) do
              table.insert(res, merge(v[1]))
    table.insert(nr, v)
            end
  end
          else
  for i, v in pairs(r) do
            table.insert(res, merge(v))
    if type(i)~="number" then
          end
      table.insert(nr, i .. "=" .. v)
        end
      end
      return res
    elseif obj["type"]=="template" then
      return frame:expandTemplate{title=merge(obj[1]), args=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
   end
   end
 
   return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}")
   --mw.log(merge(parse_args(argstr,1))[3])
  return table.concat(merge(parse_args(argstr, 1)), "|")
end
end


return p
return p

2020年3月9日 (一) 14:01的最新版本

此模块的文档可以在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(frame, 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(frame, v[2])]=p.merge(frame, v[1])
          else
            --mw.log(v[1])
            table.insert(res, p.merge(frame, v[1]))
          end
        else
          --mw.log(v)
          table.insert(res, p.merge(frame, v))
        end
      end
    end
    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

-- 语法:
-- 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={}
  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(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
  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
  return mw.text.nowiki("{{" .. table.concat(nr, "|") .. "}}")
end

return p
我们为您提供服务需要使用Cookie。使用我们的服务即表示您同意我们使用Cookie。