编辑“Module:Loop

跳到导航 跳到搜索
警告:您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您登录创建一个账户,您的编辑将归属于您的用户名,且将享受其他好处。

该编辑可以被撤销。 请检查下面的对比以核实您想要撤销的内容,然后发布下面的更改以完成撤销。

最后版本 您的文本
第2行: 第2行:


local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local nowiki_blocks = { 'do', 'condition' }


function pack_inner_loop(loop)
function pack_inner_loop(loop)
    -- 给内层循环的do参数包裹<nowiki>标签
    -- 给内层循环的do参数包裹<nowiki>标签
    loop = mw.ustring.gsub(loop, '{{%s-[Ll]oop%s-|', '{{#invoke:loop|loop|')
    loop = mw.ustring.gsub(loop, '{{%s-[lL][oO][oO][pP]%s-|', '{{#invoke:loop|main|')
   loop = mw.ustring.gsub(loop, '{{%s-[Ww]hile%s-|', '{{#invoke:loop|while|')
   loop = mw.ustring.gsub(loop, '{{%s-[Dd]o[Ww]hile%s-|', '{{#invoke:loop|dowhile|')
    return mw.ustring.gsub(loop, '({{#invoke:loop.*)', function(a)
    return mw.ustring.gsub(loop, '({{#invoke:loop.*)', function(a)
      local i = 1
      local i = 1
      local stack = {}
      local stack = {}
      local block_begin = -1
      local do_begin = -1
      local block_end = -1
      local do_end = -1
      while (i < mw.ustring.len(a)) do
      while (i < mw.ustring.len(a)) do
     for _, block in ipairs(nowiki_blocks) do
       if do_begin == -1 and mw.ustring.find(a, '^|%s-do%s-=', i) then
       if block_begin == -1 and mw.ustring.find(a, '^|%s-'..block..'%s-=', i) then
         _, do_begin = mw.ustring.find(a, '^|%s-do%s-=', i)
         _, block_begin = mw.ustring.find(a, '^|%s-'..block..'%s-=', i)
         do_begin = do_begin + 1
         block_begin = block_begin + 1
         i = do_begin
         i = block_begin
       end
        
        if do_begin ~= -1 then
         break
       end
     end
        if block_begin ~= -1 then
          if mw.ustring.sub(a, i, i + 2) == '{{{' then
          if mw.ustring.sub(a, i, i + 2) == '{{{' then
            i = i + 3
            i = i + 3
第40行: 第32行:
              table.remove(stack)
              table.remove(stack)
            else
            else
              block_end = i - 1
              do_end = i - 1
              break
              break
            end
            end
第48行: 第40行:
              table.remove(stack)
              table.remove(stack)
            else
            else
              block_end = i - 1
              do_end = i - 1
              break
              break
            end
            end
          elseif mw.ustring.sub(a, i, i) == '|' and #stack == 0 then
          elseif mw.ustring.sub(a, i, i) == '|' and #stack == 0 then
            block_end = i - 1
            do_end = i - 1
            break
            break
          else
          else
第61行: 第53行:
        end
        end
      end
      end
      if block_begin ~= -1 and block_end == -1 then block_end = i - 1 end
      if do_begin ~= -1 and do_end == -1 then do_end = i - 1 end
      if block_begin ~= -1 and block_end ~= -1 then
      if do_begin ~= -1 and do_end ~= -1 then
      -- mw.log('发现内层循环 <nowiki>'..mw.ustring.sub(a, block_begin, block_end)..'</nowiki>')
      -- mw.log('发现内层循环 <nowiki>'..mw.ustring.sub(a, do_begin, do_end)..'</nowiki>')
      return mw.ustring.sub(a, 1, block_begin - 1)..'<nowiki>'..
      return mw.ustring.sub(a, 1, do_begin - 1)..'<nowiki>'..
         mw.text.trim(mw.ustring.sub(a, block_begin, block_end))..'</nowiki>'..
         mw.text.trim(mw.ustring.sub(a, do_begin, do_end))..'</nowiki>'..
         pack_inner_loop(mw.ustring.sub(a, block_end + 1, -1))
         pack_inner_loop(mw.ustring.sub(a, do_end + 1, -1))
      else
      else
        return a
        return a
第73行: 第65行:
end
end


function _loop(args, frame)
function _main(args, frame)
    local name = ''
    local name = ''
    local _min = 1
    local _min = 1
第112行: 第104行:
end
end


function module.loop(frame)
function module.main(frame)
    if (frame:getParent() or frame):getTitle() == 'Template:Loop' and
    if (frame:getParent() or frame):getTitle() == 'Template:Loop' and
      frame.args['do'] == nil then
      frame.args['do'] == nil then
第119行: 第111行:
      args = frame.args
      args = frame.args
    end
    end
    return _loop(args, frame:getParent() or frame)
    return _main(args, frame:getParent() or frame)
end
 
-- 向后兼容
function module.main(frame)
   return module.loop(frame)
end
 
-- 别名
module["for"] = function(frame)
   return module.loop(frame)
end
 
local _while = function(args, frame, dowhile)
   --初步处理条件语句
   local condition = args['condition'] or ''
   condition = mw.text.unstripNoWiki(condition)
   condition = string.gsub(condition, '<!%-%-.-%-%->', '')
  
   --修整条件语句的格式
   local trim = mw.text.split(condition, '\n')
   condition = ''
   for i, v in ipairs(trim) do
     condition = condition..mw.text.trim(v)
   end
  
   condition = mw.text.decode(condition)
   -- mw.log('循环体= '..condition)
  
   --初步处理循环体
   local loop = args['do'] or ''
   loop = mw.text.unstripNoWiki(loop)
   loop = string.gsub(loop, '<!%-%-.-%-%->', '')
  
   --处理循环体中的次级循环语句
   loop = pack_inner_loop(loop)
   --修整循环体中语句的格式
   local trim = mw.text.split(loop, '\n')
   loop = ''
   for i, v in ipairs(trim) do
     loop = loop..mw.text.trim(v)
   end
 
   loop = mw.text.decode(loop)
   -- mw.log('循环体= '..loop)
 
   local result = ''
   if dowhile then
     -- mw.log('执行循环体('..name..'='..tostring(i)..') '..loop)
     repeat result = result..frame:preprocess(loop) until frame:preprocess(condition) == ''
   else
     -- mw.log('执行循环体('..name..'='..tostring(i)..') '..loop)
     while frame:preprocess(condition) ~= '' do result = result..frame:preprocess(loop) end
   end
   -- mw.log('循环结果 '..result)
   return result
end
 
module["while"] = function(frame)
   if (frame:getParent() or frame):getTitle() == 'Template:While' and
     frame.args['do'] == nil then
     args = getArgs(frame)
   else
     args = frame.args
   end
   return _while(args, frame:getParent() or frame, false)
end
 
module.dowhile = function(frame)
   if (frame:getParent() or frame):getTitle() == 'Template:While' and
     frame.args['do'] == nil then
     args = getArgs(frame)
   else
     args = frame.args
   end
   return _while(args, frame:getParent() or frame, true)
end
end


return module
return module
请注意您对H萌娘的所有贡献都被认为是在知识共享署名-相同方式共享下发布,请查看在H萌娘:版权的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。 未经许可,请勿提交受版权保护的作品!
取消 编辑帮助(在新窗口中打开)
预览使用本模板的页面