Jump to content
MediaWiki

Module:Loops

From mediawiki.org
Module documentation
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.

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

AltStyle によって変換されたページ (->オリジナル) /