Module:Sandbox/BrandonXLF/Module:Map params
Jump to navigation
Jump to search
File:Test Template Info-Icon - Version (2).svg Module documentation[view] [edit] [history] [purge]
| File:Greek lc beta icon.svg | This module is rated as beta. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected. |
| File:Lua-Logo.svg | This module depends on the following other modules: |
{{#invoke:Map params|map}} maps parameters received by a function to wikitext using |1= or to a template call using |call=.
Usage
[edit source]{{#invoke:Map params|main|parameters}}
Parameters
[edit source]Input
[edit source]|prefixn=- The prefix of the parameters to process. All registered prefixes will be checked to determine if a number is present in the provided arguments.|prefix1=defaults to processing unnamed parameters.|extran=- An extra parameter to pass to the wikitext or template being called. If the extra parameter is suffixed with a number (same as prefixed parameters but not checked to determine if a number is present), add the suffix(i). For example,style(i).|sparse=- Set toyesto support parameter lists with gaps. Defaults tono.|optnum=- Whether or not to support passing the first parameter without a number, i.e. allow it to be|prefix=rather than|prefix1=. Defaults toyes.
Map to
[edit source]|1=- The wikitext to map parameters to. Parameters are substituted with their number removed, i.e.|itemn=becomes|item=etc. The parameter{{{i}}}is replaced with the current index and{{{1}}}is replaced with the current unnamed parameter (if applicable).|call=- Template to call. Parameters are passed with their number removed, i.e.|itemn=becomes|item=etc. The parameter{{{i}}}is the current index and{{{1}}}is the current unnamed parameter (if applicable). Overrides|1=.
Concatenation
[edit source]|sep=/|2=- Separator to add between outputs. To preserve leading and tailing whitespace,|2=can be used instead, or|1=when|call=is being used.|conj=- Special separator to use before the final output. Outer spaces can be added with{{sp}}or .
Advanced
[edit source]|expand=- Whether or not to expand templates, parser functions, extension tags, etc. after substituting parameters. This is most useful when|1=is used without<nowiki>...</nowiki>tags and can provide a slight performance advantage. Only relevant when using|1=. Defaults toyes.
See also
[edit source]
local p = {}
local yesno = require('Module:Yesno')
-- Escape a string to add to a Lua pattern
local function escPattern(s)
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
-- Get the value of a prefixed argument
function getPrefixedArg(args, prefix, num, optNum)
return args[prefix .. num] or ((num == 1 and optNum and args[prefix]) or nil)
end
-- Get the prefixed parameters to process
local function getPrefixes(args)
local prefixes = {}
local i = 1
local cur = getPrefixedArg(args, 'prefix', i, true)
repeat
table.insert(prefixes, cur or '')
i = i + 1
cur = getPrefixedArg(args, 'prefix', i, true)
until not cur
return prefixes
end
-- Get the extra parameters to process
local function getExtras(args)
local extras = {}
local i = 1
local cur = getPrefixedArg(args, 'extra', i, true)
while cur do
local numMatch = cur:match('^(.+)%(i%)$')
if numMatch then
table.insert(extras, {numMatch, true})
else
table.insert(extras, {cur, false})
end
i = i + 1
cur = getPrefixedArg(args, 'extra', i, true)
end
return extras
end
-- Perform wikitext parameter substitution
function substParams(code, num, args)
args['i'] = num
local processed = code:gsub("{{{([^{}|]*)|?[^{}]*}}}", args) -- Substitute parameters
return processed
end
-- Return the function that processes each iteration
function makeProcessor(frame, parent)
local template = frame.args.call
if template then
return function(num, args)
args['i'] = num
return frame:expandTemplate{
title = template,
args = args
}
end
end
-- Note: The difference between angle brackets and their entities is lost
local code = mw.text.unstripNoWiki(frame.args[1]):gsub('<', '<'):gsub('>', '>')
local expand = yesno(frame.args.expand or true)
if expand then
local processingFrame = parent:newChild{
title = 'Module:Map params preprocessor',
args = {}
}
return function(num, args)
return processingFrame:preprocess(substParams(code, num, args))
end
end
return function(num, args)
return substParams(code, num, args)
end
end
function numPairs(args, parentArgs, prefixes, optNum)
local start = tonumber(args.start or 1)
if yesno(args.sparse or false) then
local nums = {}
local seenNums = {}
for k, _ in pairs(parentArgs) do
local prefixMatch = false
local j = 1
-- Check every prefix for a match
while prefixes[j] and not prefixMatch do
local numStr = tostring(k):match('^' .. escPattern(prefixes[j]) .. '(%d*)$')
if numStr ~= nil then
local num = tonumber(numStr) or (optNum and 1 or nil)
if num ~= nil and num >= start and not seenNums[num] then
table.insert(nums, num)
seenNums[num] = true
end
prefixMatch = true
end
j = j + 1
end
end
table.sort(nums)
-- Iterate over each found number
function sequenceIter(a, i)
i = i + 1
local v = a[i]
if v then
return i, v
end
end
return sequenceIter, nums, 0
end
-- Iterate each number and check for any matches
local function prefixIter(a, i)
i = i + 1
local j = 1
local prefixMatch = false
-- Check every prefix for a match
while prefixes[j] and not prefixMatch do
prefixMatch = getPrefixedArg(a, prefixes[j], i, optNum) ~= nil
j = j + 1
end
if prefixMatch then
return i, i
end
end
return prefixIter, parentArgs, start - 1
end
function p.map(frame)
local result = {}
local parent = frame:getParent()
local sep = frame.args.call and frame.args[1] or frame.args[2] or frame.args.sep or ''
local conj = frame.args.conj or sep
local prefixes = getPrefixes(frame.args)
local extras = getExtras(frame.args)
local process = makeProcessor(frame, parent)
local optNum = yesno(frame.args.optnum or true)
for _, num in numPairs(frame.args, parent.args, prefixes, optNum) do
local args = {}
-- Pass extra registered arguments
for _, extraInfo in ipairs(extras) do
local extra, numbered = unpack(extraInfo)
if numbered then
args[extra] = getPrefixedArg(parent.args, extra, num, optNum)
else
args[extra] = parent.args[extra]
end
end
-- Pass current parameters without their numeric suffix
for _, prefix in ipairs(prefixes) do
args[prefix ~= '' and prefix or '1'] = getPrefixedArg(parent.args, prefix, num, optNum)
end
table.insert(result, process(num, args))
end
return mw.text.listToText(result, sep, conj)
end
return p