GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Main page
  • Contents
  • Current events
  • Random article
  • About Wikipedia
  • Contact us
  • Help
  • Learn to edit
  • Community portal
  • Recent changes
  • Upload file
  • Special pages
  • Search
  • Donate

This view

  • Original page
  • New address

GeezerVison is showing en.wikipedia.org — Module:ArgRest - Wikipedia

Module documentationviewedithistorypurge
This module is rated as alpha. It is ready for limited use and third-party feedback. It may be used on a small number of pages, but should be monitored closely. Suggestions for new features or adjustments to input and output are welcome.

This is an auxiliary module intended to be invoked by templates; it permits templates to support an arbitrary set of parameters by repeating a block of wikitext multiple times. This module works with named as well as unnamed parameters, can handle multiple named parameters at the same time, and supports defaults,

Usage

If you want to use this module in your template: take the block of wikitext that you want to be repeated for an arbitrary set of parameters, wrap it in <nowiki>, and pass that as the module's first parameter; then, choose a "base" parameter such that the module will stop repeating the wikitext if the parameter wasn't defined by the user, and pass its name as the second parameter. Example usage:

...{{#invoke:ArgRest|main|<nowiki>...{{{named-2-a}}}...{{{named-2-b|default}}}...</nowiki>|named-2-a}}

Afterwards, the module will "fill in" parameters with larger numbers than the ones originally given; i.e. in the above example, the module would allow the containing template to receive parameters {{{named-3-a}}}, {{{named-3-b}}}, {{{named-4-a}}}, etc.
Note: You MUST wrap the first parameter in <nowiki>; otherwise, Mediawiki processes all wikitext and HTML syntax before the module receives it, which makes it impossible to use pattern matching due to the resulting pollution. If you don't, the module will give this error:

Lua error in Module:ArgRest at line 8: <nowiki> tags missing from first parameter.

Example

If the (imaginary) template {{PlusMinusLoop}} has the following code:

{{{plus1}}} - {{{minus1}}}{{#invoke:ArgRest|main|<nowiki> + {{{plus2}}} - {{{minus2|5}}}</nowiki>|plus2}}

then

{{PlusMinusLoop|plus1=0|minus1=1|plus2=1|minus2=2|plus3=3|plus5=21}}

will yield 0 - 1 + 1 - 2 + 3 - 5. The - 5 is present because |minus3 defaulted to 5, but 21 never appears because, although |plus5 is defined, |plus4 isn't, so the module halts there.

Helpful templates

There are a few templates that can used with this module to help it adapt to certain scenarios:

  • {{Call wikitext}}: This template allows ArgRest to be demoed without the need to create a template.
    • For example, {{Call wikitext|sourceCode=<nowiki>{{#invoke:ArgRest|main|<nowiki>{{{1}}}&lt;/nowiki>|1}}</nowiki>|foo|bar}} outputs foobar.
  • {{Expand wikitext}}: If you try to use ArgRest to generate parameters inside of an outer template (e.g. {{enum{{#invoke:ArgRest|main|<nowiki>|{{{1}}}&lt;/nowiki>|1}}}}), it will fail to do so because the outer template won't get processed after ArgRest is done parsing. This template fixes this by invoking the parser to process the outer template.
    • For example, a template defined as {{Expand wikitext|{{enum{{#invoke:ArgRest|main|<nowiki>|{{{1}}}</nowiki>|1}}}}}} called with the arguments {{__TEMPLATE__|foo|bar|Baz}} would output foo, bar and baz where as one defined as {{enum{{#invoke:ArgRest|main|<nowiki>|{{{1}}}</nowiki>|1}}}} would output {{enum|foo|bar|baz}}.
    • WARNING: ArgRest may become highly unstable if you use it this way, and is rather likely to not work as expected in these scenarios. If you do use it like this, heavy caution should be taken.

Note

Be wary when using ArgRest wrapped inside of an outer template; it hasn't quite been thoroughly tested in such scenarios, and should be watched carefully when it is used this way.

Limitations

This module currently suffers from a few limitations:

  • It cannot handle aliases; {{{parameter1| {{{alias1|default}}} }}} will fail to be recognized by the module as a parameter.
  • It cannot handle parameters with names that contain two or more distinct numbers; the module's pattern matching is ignorant of this possibility, and will treat something like {{{named-3-1}}} as equivalent to {{{named-3-3}}}.
  • It cannot handle multiple parameters that have different numbers; similarly to the above example, all numbers are converted by the module into the same number, so ...{{{1}}}...{{{2}}}... won't work.

See also

The above documentation is transcluded from Module:ArgRest/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Subpages of this module.

local p = {}

function p.main(frame)
	-- Undo sanitization:
	local code = frame.args[1] or ''
	if code:match'nowiki' then
		code = mw.text.unstripNoWiki(code)
	else error("<nowiki> missing from first parameter") end
	
	-- Angle brackets still remain santiized; unsanitize them
	local wikitext = code:gsub('&lt;', '<'):gsub('&gt;', '>')
	
	local secondParam = frame.args[2]
    local start = tonumber(secondParam:match('%d+')) -- Extract the first number from the second parameter
    local result = ''
    
    assert(secondParam, "second parameter missing")
    
    local function replaceTripleBraces(parameter, _, default, i) -- extract corresponding arguments from the parent function. the _ is necessary because the pipe still gets caught in the second capture group
    	if _ == "" then default = nil end -- mildly ugly hack for checking for {{{parameter|}}}
		return frame:getParent().args[parameter:gsub("%d+", tostring(i))] or default or "{{{" .. parameter .. "}}}"
    end 
    
    for i = start, math.huge do
        -- Check if the parameter is defined
        if not frame:getParent().args[secondParam:gsub('%d+', tostring(i))] then 
        	break
        end

        local processed = wikitext:gsub("{{{([^{}<>|]+)(|?)([^{}|]*)}}}", function(a, b, c) return replaceTripleBraces(a, b, c, i) end) -- Find stuff of the form {{{parameter}}} or {{{parameter|default}}} via pattern matching
        result = result .. processed
    end
    
    return frame:preprocess(result)
end

return p
Retrieved from "https://en.wikipedia.org/w/index.php?title=Module:ArgRest&oldid=1154293389"
Categories:
  • Modules in alpha
  • Template metamodules
  • Wikitext processing modules
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.