Module:Loops
Appearance
From mediawiki.org
This module is rated as alpha. It is ready for third party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome.
Lua module implementing features similar to Extension:Loops .
Usage
{{#invoke:Loops|function_name}}
See also
The above documentation is transcluded from Module:Loops/doc. (edit | history)
Editors can experiment in this module’s sandbox (create | mirror) and testcases (create) pages.
Subpages of this module.
Editors can experiment in this module’s sandbox (create | mirror) and testcases (create) pages.
Subpages of this module.
-- <nowiki> -------------------------------------------------------------------------------- -- Lua module implementing features similar to [[mw:Extension:Loops]]. -- -- @module lööps -- @alias loops -- @author [[User:ExE Boss]] -- @require [[Module:TableTools]] -------------------------------------------------------------------------------- locallibraryUtil=require("libraryUtil"); localtableTools=require("Module:TableTools"); localcheckType=libraryUtil.checkType; localcheckTypeForNamedArg=libraryUtil.checkTypeForNamedArg; localustring=mw.ustring; localloops={}; localfunctionuserError(message) return'<strong class="error">'..message..'</strong>'; end localfunctionescapePattern(pattern) returnustring.gsub(pattern,"([%(%)%.%%%+%-%*%?%[%^%$%]])","%%%1") end localfunctionisFrame(frame) returntype(frame)=="table" andtype(frame.args)=="table" andtype(frame.getParent)=="function"; end -------------------------------------------------------------------------------- -- Preprocesses text escaped using the [[mw:Extension:DynamicPageList3]] method. -- -- @function loops._preprocess -- @param {Frame} frame -- @param {string} msg -- @return {string} -------------------------------------------------------------------------------- localfunctionpreprocess(frame,msg) msg=ustring.gsub(msg,"«","<"); msg=ustring.gsub(msg,"»",">"); msg=ustring.gsub(msg,"¦","|"); msg=ustring.gsub(msg,"2{","{{"); msg=ustring.gsub(msg,"}2","}}"); returnframe:preprocess(msg); end loops._preprocess=preprocess; -------------------------------------------------------------------------------- -- @param {Frame|table} args -- @return {number} -- @usage {{#invoke:Loops|numArgs}} -------------------------------------------------------------------------------- functionloops.numArgs(frame) checkType("numArgs",1,frame,"table"); localargs; if(isFrame(frame))then args=(frame:getParent()orframe).args; else args=frame; end returntableTools.length(args); end -------------------------------------------------------------------------------- -- @param {Frame} args -- @return {string} -- -- @usage {{#invoke:Loops|forNumArgs|template string}} -- @usage {{#invoke:Loops|forNumArgs|value pattern|template string}} -- @usage {{#invoke:Loops|forNumArgs|key pattern|value pattern|template string}} -- @usage -- {{#invoke:Loops|forNumArgs -- | template = template string -- }} -- @usage -- {{#invoke:Loops|forNumArgs -- | value = value pattern -- | template = template string -- }} -- @usage -- {{#invoke:Loops|forNumArgs -- | key = key pattern -- | template = template string -- }} -- @usage -- {{#invoke:Loops|forNumArgs -- | key = key pattern -- | value = value pattern -- | template = template string -- }} -------------------------------------------------------------------------------- functionloops.forNumArgs(frame) localframeArgs,parentArgs; checkType("numArgs",1,frame,"table"); if(isFrame(frame))then frameArgs=frame.args; parentArgs=frame:getParent().args; else returnerror("forNumArgs only supports invocation"); end localkPattern,vPattern,template; localframeNumArgs=tableTools.length(frameArgs); if(frameNumArgs>=3)then kPattern=frameArgs[1]; vPattern=frameArgs[2]; template=frameArgs[3]; elseif(frameNumArgs>=2)then vPattern=frameArgs[1]; template=frameArgs[2]; else template=frameArgs[1]; end kPattern=frameArgs.keyorkPattern; vPattern=frameArgs.valueorvPattern; template=frameArgs.templateortemplate; checkTypeForNamedArg("forNumArgs","key",kPattern,"string",true); checkTypeForNamedArg("forNumArgs","value",vPattern,"string",true); checkTypeForNamedArg("forNumArgs","template",template,"string",true); if(template==nil)then returnuserError("Must supply template parameter to forNumArgs"); end vPattern=vPatternor"1ドル"; if(kPattern~=nil)then if(#kPattern>0)then if(kPattern==vPattern)then returnuserError("key pattern must be different from value pattern"); end kPattern=escapePattern(kPattern); else kPattern=nil; end elseif(vPattern~="2ドル")then kPattern="%2ドル"; end if(#vPattern==0)then vPattern=nil; else vPattern=escapePattern(vPattern); end localresult={}; localv,msg; fork=1,tableTools.length(parentArgs)do v=parentArgs[k]; if(v~=nil)then msg=template; if(kPattern)then msg=ustring.gsub(msg,kPattern,(ustring.gsub(tostring(k),"%%","%%%%"))); end if(vPattern)then msg=ustring.gsub(msg,vPattern,(ustring.gsub(tostring(v),"%%","%%%%"))); end result[#result+1]=preprocess(frame,msg); end end returntable.concat(result); end -------------------------------------------------------------------------------- -- Parses and prints wikitext markup N times -- -- @param {Frame} args -- @param[opt] {string} args[1] Pattern. `1ドル` by default -- @param {number} args[2] Starting value -- @param {number} args[3] Number loops to be performed -- @param {string} args[4] Wikitext markup -- @return {string} -------------------------------------------------------------------------------- functionloops.loop(frame) localframeArgs checkType("numArgs",1,frame,"table") if(isFrame(frame))then frameArgs=(frame:getParent()orframe).args else returnuserError("loop only supports invocation") end localpattern=frame.args[1]or"1ドル" localstart=tonumber(frame.args[2]) localloopsPerformed=tonumber(frame.args[3]) -- {{#loop}} supports negative values for loopsPerformed localfin=loopsPerformed<0andstart+(loopsPerformed+1)or(start-1)+loopsPerformed localstep=loopsPerformed<0and-1or1 localtemplate=frame.args[4] localresult={} localmsg fori=start,fin,stepdo msg=ustring.gsub(template,pattern,i) result[#result+1]=msg end returnpreprocess(frame,table.concat(result))-- preprocess at the end end returnloops;