跳转到内容

Module:Arguments:修订间差异

来自锑星百科
修正错误
修正错误
第10行: 第10行:
-- arg ::= name:value | value
-- arg ::= name:value | value
-- value ::= value char | value template | char | template
-- value ::= value char | value template | char | template
-- template ::= $(name,args)
-- template ::= (name,args)
-- name ::= value
-- name ::= value


第22行: 第22行:
     template["type"]="template"
     template["type"]="template"
     local len=mw.ustring.len(str)
     local len=mw.ustring.len(str)
    -- 跳过无效字符
    while mw.ustring.sub(str, i, i)~="(" do
      i=i+1
      if i>len then return end
    end
     local ch=mw.ustring.sub(str, i, i)
     local ch=mw.ustring.sub(str, i, i)
     local a
     local a
     if ch=="(" then
     a, i=parse_value(str, i+1)
      a, i=parse_value(str, i+1)
    table.insert(template, a)
      table.insert(template, a)
    a, i=parse_args(str, i+1)
      a, i=parse_args(str, i+1)
    table.insert(template, a)
      table.insert(template, a)
     return template, i+1
    end
     return template, i
   end
   end


第57行: 第50行:
         elseif ch==")" or ch=="," or ch==":" then
         elseif ch==")" or ch=="," or ch==":" then
           return val, i
           return val, i
         elseif ch=="$" then
         elseif ch=="(" then
           local t
           local t
           t, i=parse_template(str, i+1)
           t, i=parse_template(str, i)
           table.insert(val, t)
           table.insert(val, t)
         else
         else

2020年3月8日 (日) 09:19的版本

此模块的文档可以在Module:Arguments/doc创建

local p={}

p.version=function(frame)
  return "0.1"
end

-- 语法:
-- S ::= args
-- args ::= args,arg | arg
-- arg ::= name:value | value
-- value ::= value char | value template | char | template
-- template ::= (name,args)
-- name ::= value

p.parse=function(frame)
  local argstr=frame.args[1]
  if not argstr then return end

  local function 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=parse_value(str, i+1)
    table.insert(template, a)
    a, i=parse_args(str, i+1)
    table.insert(template, a)
    return template, i+1
  end

  local function 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=parse_template(str, i)
          table.insert(val, t)
        else
          table.insert(val, ch)
          i=i+1
        end
      end
    end
    return val
  end

  local function parse_arg(str, start)
    local i=start
    local arg={}
    arg["type"]="arg"
    local len=mw.ustring.len(str)

    local v
    v, i=parse_value(str, i)
    if mw.ustring.sub(str, i, i)==":" then
      arg[2]=v
      v, i=parse_value(str, i+1)
    end
    arg[1]=v
    return arg, i
  end

  local function 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=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

  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 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

  --mw.log(table.concat(merge(parse_args(argstr, 1)), "|"))
  local r=merge(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
  --mw.log(r[1],r[3])
  return frame:expandTemplate{title=r[1], args=nr}
end

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