Module:Params: Difference between revisions
From All Skies Encyclopaedia
imported>Grufo Use a clearer internal nomenclature |
imported>Grufo New function: `valueof`; use abbreviations internally |
||
| Line 28: | Line 28: | ||
-- Prepare the context | -- Prepare the context | ||
local function context_init(frame, funcname, refpipe, refparams) | local function context_init(frame, funcname, refpipe, refparams) | ||
local | local ctx = {} | ||
ctx.iterfunc = pairs | |||
ctx.pipe = copy_or_ref_table(frame.args, refpipe) | |||
ctx.frame = frame:getParent() | |||
ctx.params = copy_or_ref_table(ctx.frame.args, refparams) | |||
return funcname( | return funcname(ctx) | ||
end | end | ||
-- Move to the next action within the user-given list | -- Move to the next action within the user-given list | ||
local function context_iterate( | local function context_iterate(ctx, n_forward) | ||
local nextfn = | local nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)' | ||
if nextfn == nil then | if nextfn == nil then | ||
error('You must specify a function to call', 0) | error('You must specify a function to call', 0) | ||
| Line 46: | Line 46: | ||
error('The function "' .. nextfn .. '" does not exist', 0) | error('The function "' .. nextfn .. '" does not exist', 0) | ||
end | end | ||
for idx = n_forward, 1, -1 do table.remove( | for idx = n_forward, 1, -1 do table.remove(ctx.pipe, idx) end | ||
return library[nextfn]( | return library[nextfn](ctx) | ||
end | end | ||
| Line 54: | Line 54: | ||
-- keys from the table of options; non-numerical keys from the table of options | -- keys from the table of options; non-numerical keys from the table of options | ||
-- will prevail over colliding non-numerical keys from the table of parameters | -- will prevail over colliding non-numerical keys from the table of parameters | ||
local function concat_params( | local function concat_params(ctx) | ||
local shift = table.maxn( | local shift = table.maxn(ctx.pipe) | ||
local newargs = {} | local newargs = {} | ||
if | if ctx.subset == 1 then | ||
-- We need only the sequence | -- We need only the sequence | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
newargs[key + shift] = val | newargs[key + shift] = val | ||
end | end | ||
else | else | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
if type(key) == 'number' then | if type(key) == 'number' then | ||
newargs[key + shift] = val | newargs[key + shift] = val | ||
| Line 71: | Line 71: | ||
end | end | ||
end | end | ||
for key, val in pairs( | for key, val in pairs(ctx.pipe) do newargs[key] = val end | ||
return newargs | return newargs | ||
end | end | ||
| Line 82: | Line 82: | ||
-- See iface.sequential() | -- See iface.sequential() | ||
library.sequential = function( | library.sequential = function(ctx) | ||
if | if ctx.subset == -1 then | ||
error('The two directives `non-sequential` and `sequential` are in contradiction with each other', 0) | error('The two directives `non-sequential` and `sequential` are in contradiction with each other', 0) | ||
end | end | ||
ctx.iterfunc = ipairs | |||
ctx.subset = 1 | |||
return context_iterate( | return context_iterate(ctx, 1) | ||
end | end | ||
-- See iface.'non-sequential']() | -- See iface.'non-sequential']() | ||
library['non-sequential'] = function( | library['non-sequential'] = function(ctx) | ||
if | if ctx.subset == 1 then | ||
error('The two directives `sequential` and `non-sequential` are in contradiction with each other', 0) | error('The two directives `sequential` and `non-sequential` are in contradiction with each other', 0) | ||
end | end | ||
ctx.iterfunc = pairs | |||
ctx.subset = -1 | |||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do ctx.params[key] = nil end | ||
return context_iterate( | return context_iterate(ctx, 1) | ||
end | end | ||
-- See iface.with_name_matching() | -- See iface.with_name_matching() | ||
library.with_name_matching = function( | library.with_name_matching = function(ctx) | ||
for key, val in | for key, val in ctx.iterfunc(ctx.params) do | ||
if not string.find(key, | if not string.find(key, ctx.pipe[1], 1, false) then | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
return context_iterate( | return context_iterate(ctx, 2) | ||
end | end | ||
-- See iface.with_name_not_matching() | -- See iface.with_name_not_matching() | ||
library.with_name_not_matching = function( | library.with_name_not_matching = function(ctx) | ||
for key, val in | for key, val in ctx.iterfunc(ctx.params) do | ||
if string.find(key, | if string.find(key, ctx.pipe[1], 1, false) then | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
return context_iterate( | return context_iterate(ctx, 2) | ||
end | end | ||
-- See iface.with_value_matching() | -- See iface.with_value_matching() | ||
library.with_value_matching = function( | library.with_value_matching = function(ctx) | ||
for key, val in | for key, val in ctx.iterfunc(ctx.params) do | ||
if not string.find(val, | if not string.find(val, ctx.pipe[1], 1, false) then | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
return context_iterate( | return context_iterate(ctx, 2) | ||
end | end | ||
-- See iface.with_value_not_matching() | -- See iface.with_value_not_matching() | ||
library.with_value_not_matching = function( | library.with_value_not_matching = function(ctx) | ||
for key, val in | for key, val in ctx.iterfunc(ctx.params) do | ||
if string.find(val, | if string.find(val, ctx.pipe[1], 1, false) then | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
return context_iterate( | return context_iterate(ctx, 2) | ||
end | end | ||
-- See iface.trimmed() | -- See iface.trimmed() | ||
library.trimmed = function( | library.trimmed = function(ctx) | ||
local ltrim = tonumber( | local ltrim = tonumber(ctx.pipe[1]) | ||
if ltrim == nil then error('Left trim must be a number', 0) end | if ltrim == nil then error('Left trim must be a number', 0) end | ||
local rtrim = tonumber( | local rtrim = tonumber(ctx.pipe[2]) | ||
if rtrim == nil then error('Right trim must be a number', 0) end | if rtrim == nil then error('Right trim must be a number', 0) end | ||
if | if ctx.subset == -1 then return context_iterate(ctx, 3) end | ||
local tbl = | local tbl = ctx.params | ||
local tlen = #tbl | local tlen = #tbl | ||
if ltrim < 0 then ltrim = tlen + ltrim end | if ltrim < 0 then ltrim = tlen + ltrim end | ||
| Line 168: | Line 168: | ||
end | end | ||
end | end | ||
return context_iterate( | return context_iterate(ctx, 3) | ||
end | end | ||
| Line 178: | Line 178: | ||
-- See iface.count() | -- See iface.count() | ||
library.count = function( | library.count = function(ctx) | ||
local count = 0 | local count = 0 | ||
for _ in | for _ in ctx.iterfunc(ctx.params) do count = count + 1 end | ||
return count | return count | ||
end | |||
-- See iface.value_of() | |||
library.value_of = function(ctx) | |||
local keystr = ctx.pipe[1] | |||
local val = ctx.params[tonumber(keystr) or keystr] | |||
if val == nil then return '' end | |||
return val | |||
end | end | ||
| Line 187: | Line 196: | ||
-- See iface.list() | -- See iface.list() | ||
library.list = function( | library.list = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
local aas | local aas | ||
local kvs | local kvs | ||
| Line 204: | Line 213: | ||
local ret = '' | local ret = '' | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
ret = ret .. hea .. sep .. key .. kvs .. val | ret = ret .. hea .. sep .. key .. kvs .. val | ||
sep = aas | sep = aas | ||
hea = '' | hea = '' | ||
foo = las | foo = las | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
ret = ret .. hea .. sep .. key .. kvs .. val | ret = ret .. hea .. sep .. key .. kvs .. val | ||
sep = aas | sep = aas | ||
| Line 229: | Line 238: | ||
-- See iface.list_values() | -- See iface.list_values() | ||
library.list_values = function( | library.list_values = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
local aas | local aas | ||
local las | local las | ||
| Line 244: | Line 253: | ||
local ret = '' | local ret = '' | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
ret = ret .. hea .. sep .. val | ret = ret .. hea .. sep .. val | ||
sep = aas | sep = aas | ||
hea = '' | hea = '' | ||
foo = las | foo = las | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
ret = ret .. hea .. sep .. val | ret = ret .. hea .. sep .. val | ||
sep = aas | sep = aas | ||
| Line 269: | Line 278: | ||
-- See iface.for_each() | -- See iface.for_each() | ||
library.for_each = function( | library.for_each = function(ctx) | ||
local las | local las | ||
local hea | local hea | ||
local txt = | local txt = ctx.pipe[1] | ||
local foo = '' | local foo = '' | ||
if txt == nil then return '' end | if txt == nil then return '' end | ||
if | if ctx.pipe[2] ~= nil then hea = ctx.pipe[2] else hea = '' end | ||
if | if ctx.pipe[3] ~= nil then las = ctx.pipe[3] else las = '' end | ||
local ret = '' | local ret = '' | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
ret = ret .. hea .. string.gsub( | ret = ret .. hea .. string.gsub( | ||
string.gsub(txt, '%$#', key), | string.gsub(txt, '%$#', key), | ||
| Line 291: | Line 300: | ||
hea = '' | hea = '' | ||
foo = las | foo = las | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
ret = ret .. hea .. string.gsub( | ret = ret .. hea .. string.gsub( | ||
string.gsub(txt, '%$#', key), | string.gsub(txt, '%$#', key), | ||
| Line 313: | Line 322: | ||
-- See iface.concat_and_call() | -- See iface.concat_and_call() | ||
library.concat_and_call = function( | library.concat_and_call = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
local tname = opts[1] | local tname = opts[1] | ||
| Line 322: | Line 331: | ||
table.remove(opts, 1) | table.remove(opts, 1) | ||
return | return ctx.frame:expandTemplate{ | ||
title = tname, | title = tname, | ||
args = concat_params( | args = concat_params(ctx) | ||
} | } | ||
| Line 331: | Line 340: | ||
-- See iface.concat_and_invoke() | -- See iface.concat_and_invoke() | ||
library.concat_and_invoke = function( | library.concat_and_invoke = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
local mname = opts[1] | local mname = opts[1] | ||
| Line 344: | Line 353: | ||
table.remove(opts, 1) | table.remove(opts, 1) | ||
return require('Module:' .. mname)[fname]( | return require('Module:' .. mname)[fname](ctx.frame:newChild{ | ||
title = 'Module:' .. fname, | title = 'Module:' .. fname, | ||
args = concat_params( | args = concat_params(ctx) | ||
}) | }) | ||
| Line 353: | Line 362: | ||
-- See iface.call_for_each() | -- See iface.call_for_each() | ||
library.call_for_each = function( | library.call_for_each = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
if opts[1] == nil then error('No template name was provided', 0) end | if opts[1] == nil then error('No template name was provided', 0) end | ||
| Line 364: | Line 373: | ||
table.insert(opts, 1, true) | table.insert(opts, 1, true) | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
opts[1] = key | opts[1] = key | ||
opts[2] = val | opts[2] = val | ||
ret = ret .. | ret = ret .. ctx.frame:expandTemplate(model) | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
opts[1] = key | opts[1] = key | ||
opts[2] = val | opts[2] = val | ||
ret = ret .. | ret = ret .. ctx.frame:expandTemplate(model) | ||
end | end | ||
end | end | ||
| Line 387: | Line 396: | ||
-- See iface.invoke_for_each() | -- See iface.invoke_for_each() | ||
library.invoke_for_each = function( | library.invoke_for_each = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
if opts[1] == nil then error('No module name was provided', 0) end | if opts[1] == nil then error('No module name was provided', 0) end | ||
| Line 398: | Line 407: | ||
local mfunc = require(model.title)[opts[2]:match'^%s*(.*%S)'] | local mfunc = require(model.title)[opts[2]:match'^%s*(.*%S)'] | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
opts[1] = key | opts[1] = key | ||
opts[2] = val | opts[2] = val | ||
ret = ret .. mfunc( | ret = ret .. mfunc(ctx.frame:newChild(model)) | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
opts[1] = key | opts[1] = key | ||
opts[2] = val | opts[2] = val | ||
ret = ret .. mfunc( | ret = ret .. mfunc(ctx.frame:newChild(model)) | ||
end | end | ||
end | end | ||
| Line 421: | Line 430: | ||
-- See iface.call_for_each_value() | -- See iface.call_for_each_value() | ||
library.call_for_each_value = function( | library.call_for_each_value = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
if opts[1] == nil then error('No template name was provided', 0) end | if opts[1] == nil then error('No template name was provided', 0) end | ||
| Line 430: | Line 439: | ||
local model = { title = opts[1], args = opts } | local model = { title = opts[1], args = opts } | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
opts[1] = val | opts[1] = val | ||
ret = ret .. | ret = ret .. ctx.frame:expandTemplate(model) | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
opts[1] = val | opts[1] = val | ||
ret = ret .. | ret = ret .. ctx.frame:expandTemplate(model) | ||
end | end | ||
end | end | ||
| Line 451: | Line 460: | ||
-- See iface.invoke_for_each_value() | -- See iface.invoke_for_each_value() | ||
library.invoke_for_each_value = function( | library.invoke_for_each_value = function(ctx) | ||
local opts = | local opts = ctx.pipe | ||
if opts[1] == nil then error('No module name was provided', 0) end | if opts[1] == nil then error('No module name was provided', 0) end | ||
| Line 464: | Line 473: | ||
table.remove(opts, 1) | table.remove(opts, 1) | ||
if | if ctx.subset ~= -1 then | ||
for key, val in ipairs( | for key, val in ipairs(ctx.params) do | ||
opts[1] = val | opts[1] = val | ||
ret = ret .. mfunc( | ret = ret .. mfunc(ctx.frame:newChild(model)) | ||
ctx.params[key] = nil | |||
end | end | ||
end | end | ||
if | if ctx.subset ~= 1 then | ||
for key, val in pairs( | for key, val in pairs(ctx.params) do | ||
opts[1] = val | opts[1] = val | ||
ret = ret .. mfunc( | ret = ret .. mfunc(ctx.frame:newChild(model)) | ||
end | end | ||
end | end | ||
| Line 550: | Line 559: | ||
iface.count = function(frame) | iface.count = function(frame) | ||
return context_init(frame, library.count, true, true) | return context_init(frame, library.count, true, true) | ||
end | |||
-- Syntax: #invoke:params|value_of|parameter name | |||
iface.value_of = function(frame) | |||
return context_init(frame, library.value_of, true, true) | |||
end | end | ||
Revision as of 17:37, 10 July 2023
Documentation for this module may be created at Module:Params/doc
--- ---
--- LOCAL ENVIRONMENT ---
--- ________________________________ ---
--- ---
-- Default separator between different arguments
local arg_sep = '|'
-- Default separator between keys and values
local keyval_sep = '='
-- The private table of functions
local library = {}
-- Return a copy or a reference to a table
local function copy_or_ref_table(src, refonly)
if refonly then return src end
newtab = {}
for key, val in pairs(src) do newtab[key] = val end
return newtab
end
-- Prepare the context
local function context_init(frame, funcname, refpipe, refparams)
local ctx = {}
ctx.iterfunc = pairs
ctx.pipe = copy_or_ref_table(frame.args, refpipe)
ctx.frame = frame:getParent()
ctx.params = copy_or_ref_table(ctx.frame.args, refparams)
return funcname(ctx)
end
-- Move to the next action within the user-given list
local function context_iterate(ctx, n_forward)
local nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)'
if nextfn == nil then
error('You must specify a function to call', 0)
end
if library[nextfn] == nil then
error('The function "' .. nextfn .. '" does not exist', 0)
end
for idx = n_forward, 1, -1 do table.remove(ctx.pipe, idx) end
return library[nextfn](ctx)
end
-- Concatenate the numerical keys from the table of parameters to the numerical
-- keys from the table of options; non-numerical keys from the table of options
-- will prevail over colliding non-numerical keys from the table of parameters
local function concat_params(ctx)
local shift = table.maxn(ctx.pipe)
local newargs = {}
if ctx.subset == 1 then
-- We need only the sequence
for key, val in ipairs(ctx.params) do
newargs[key + shift] = val
end
else
for key, val in pairs(ctx.params) do
if type(key) == 'number' then
newargs[key + shift] = val
else
newargs[key] = val
end
end
end
for key, val in pairs(ctx.pipe) do newargs[key] = val end
return newargs
end
--[[ Piping piped functions ]]--
--------------------------------
-- See iface.sequential()
library.sequential = function(ctx)
if ctx.subset == -1 then
error('The two directives `non-sequential` and `sequential` are in contradiction with each other', 0)
end
ctx.iterfunc = ipairs
ctx.subset = 1
return context_iterate(ctx, 1)
end
-- See iface.'non-sequential']()
library['non-sequential'] = function(ctx)
if ctx.subset == 1 then
error('The two directives `sequential` and `non-sequential` are in contradiction with each other', 0)
end
ctx.iterfunc = pairs
ctx.subset = -1
for key, val in ipairs(ctx.params) do ctx.params[key] = nil end
return context_iterate(ctx, 1)
end
-- See iface.with_name_matching()
library.with_name_matching = function(ctx)
for key, val in ctx.iterfunc(ctx.params) do
if not string.find(key, ctx.pipe[1], 1, false) then
ctx.params[key] = nil
end
end
return context_iterate(ctx, 2)
end
-- See iface.with_name_not_matching()
library.with_name_not_matching = function(ctx)
for key, val in ctx.iterfunc(ctx.params) do
if string.find(key, ctx.pipe[1], 1, false) then
ctx.params[key] = nil
end
end
return context_iterate(ctx, 2)
end
-- See iface.with_value_matching()
library.with_value_matching = function(ctx)
for key, val in ctx.iterfunc(ctx.params) do
if not string.find(val, ctx.pipe[1], 1, false) then
ctx.params[key] = nil
end
end
return context_iterate(ctx, 2)
end
-- See iface.with_value_not_matching()
library.with_value_not_matching = function(ctx)
for key, val in ctx.iterfunc(ctx.params) do
if string.find(val, ctx.pipe[1], 1, false) then
ctx.params[key] = nil
end
end
return context_iterate(ctx, 2)
end
-- See iface.trimmed()
library.trimmed = function(ctx)
local ltrim = tonumber(ctx.pipe[1])
if ltrim == nil then error('Left trim must be a number', 0) end
local rtrim = tonumber(ctx.pipe[2])
if rtrim == nil then error('Right trim must be a number', 0) end
if ctx.subset == -1 then return context_iterate(ctx, 3) end
local tbl = ctx.params
local tlen = #tbl
if ltrim < 0 then ltrim = tlen + ltrim end
if rtrim < 0 then rtrim = tlen + rtrim end
if ltrim + rtrim > 0 then
if ltrim + rtrim >= tlen then
for key, val in ipairs(tbl) do tbl[key] = nil end
else
local last = tlen - rtrim + 1
for idx = tlen, last, -1 do tbl[idx] = nil end
for _ = 1, ltrim, 1 do table.remove(tbl, 1) end
end
end
return context_iterate(ctx, 3)
end
--[[ Non-piping piped functions ]]--
------------------------------------
-- See iface.count()
library.count = function(ctx)
local count = 0
for _ in ctx.iterfunc(ctx.params) do count = count + 1 end
return count
end
-- See iface.value_of()
library.value_of = function(ctx)
local keystr = ctx.pipe[1]
local val = ctx.params[tonumber(keystr) or keystr]
if val == nil then return '' end
return val
end
-- See iface.list()
library.list = function(ctx)
local opts = ctx.pipe
local aas
local kvs
local las
local hea
local sep = ''
local foo = ''
if opts[1] ~= nil then aas = opts[1] else aas = arg_sep end
if opts[2] ~= nil then kvs = opts[2] else kvs = keyval_sep end
if opts[3] ~= nil then hea = opts[3] else hea = '' end
if opts[4] ~= nil then las = opts[4] else las = '' end
local ret = ''
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
ret = ret .. hea .. sep .. key .. kvs .. val
sep = aas
hea = ''
foo = las
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
ret = ret .. hea .. sep .. key .. kvs .. val
sep = aas
hea = ''
foo = las
end
end
return ret .. foo
end
-- See iface.list_values()
library.list_values = function(ctx)
local opts = ctx.pipe
local aas
local las
local hea
local sep = ''
local foo = ''
if opts[1] ~= nil then aas = opts[1] else aas = arg_sep end
if opts[2] ~= nil then hea = opts[2] else hea = '' end
if opts[3] ~= nil then las = opts[3] else las = '' end
local ret = ''
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
ret = ret .. hea .. sep .. val
sep = aas
hea = ''
foo = las
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
ret = ret .. hea .. sep .. val
sep = aas
hea = ''
foo = las
end
end
return ret .. foo
end
-- See iface.for_each()
library.for_each = function(ctx)
local las
local hea
local txt = ctx.pipe[1]
local foo = ''
if txt == nil then return '' end
if ctx.pipe[2] ~= nil then hea = ctx.pipe[2] else hea = '' end
if ctx.pipe[3] ~= nil then las = ctx.pipe[3] else las = '' end
local ret = ''
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
ret = ret .. hea .. string.gsub(
string.gsub(txt, '%$#', key),
'%$@',
val
)
hea = ''
foo = las
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
ret = ret .. hea .. string.gsub(
string.gsub(txt, '%$#', key),
'%$@',
val
)
hea = ''
foo = las
end
end
return ret .. foo
end
-- See iface.concat_and_call()
library.concat_and_call = function(ctx)
local opts = ctx.pipe
local tname = opts[1]
if tname == nil then error('No template name was provided', 0) end
table.remove(opts, 1)
return ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx)
}
end
-- See iface.concat_and_invoke()
library.concat_and_invoke = function(ctx)
local opts = ctx.pipe
local mname = opts[1]
if mname == nil then error('No module name was provided', 0) end
if opts[2] == nil then error('No function name was provided', 0) end
local fname = opts[2]:match'^%s*(.*%S)'
table.remove(opts, 2)
table.remove(opts, 1)
return require('Module:' .. mname)[fname](ctx.frame:newChild{
title = 'Module:' .. fname,
args = concat_params(ctx)
})
end
-- See iface.call_for_each()
library.call_for_each = function(ctx)
local opts = ctx.pipe
if opts[1] == nil then error('No template name was provided', 0) end
local ret = ''
local model = { title = opts[1], args = opts }
table.insert(opts, 1, true)
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
opts[1] = key
opts[2] = val
ret = ret .. ctx.frame:expandTemplate(model)
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
opts[1] = key
opts[2] = val
ret = ret .. ctx.frame:expandTemplate(model)
end
end
return ret
end
-- See iface.invoke_for_each()
library.invoke_for_each = function(ctx)
local opts = ctx.pipe
if opts[1] == nil then error('No module name was provided', 0) end
if opts[2] == nil then error('No function name was provided', 0) end
local ret = ''
local model = { title = 'Module:' .. opts[1], args = opts }
local mfunc = require(model.title)[opts[2]:match'^%s*(.*%S)']
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
opts[1] = key
opts[2] = val
ret = ret .. mfunc(ctx.frame:newChild(model))
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
opts[1] = key
opts[2] = val
ret = ret .. mfunc(ctx.frame:newChild(model))
end
end
return ret
end
-- See iface.call_for_each_value()
library.call_for_each_value = function(ctx)
local opts = ctx.pipe
if opts[1] == nil then error('No template name was provided', 0) end
local ret = ''
local model = { title = opts[1], args = opts }
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
opts[1] = val
ret = ret .. ctx.frame:expandTemplate(model)
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
opts[1] = val
ret = ret .. ctx.frame:expandTemplate(model)
end
end
return ret
end
-- See iface.invoke_for_each_value()
library.invoke_for_each_value = function(ctx)
local opts = ctx.pipe
if opts[1] == nil then error('No module name was provided', 0) end
if opts[2] == nil then error('No function name was provided', 0) end
local ret = ''
local model = { title = 'Module:' .. opts[1], args = opts }
local mfunc = require(model.title)[opts[2]:match'^%s*(.*%S)']
table.remove(opts, 1)
if ctx.subset ~= -1 then
for key, val in ipairs(ctx.params) do
opts[1] = val
ret = ret .. mfunc(ctx.frame:newChild(model))
ctx.params[key] = nil
end
end
if ctx.subset ~= 1 then
for key, val in pairs(ctx.params) do
opts[1] = val
ret = ret .. mfunc(ctx.frame:newChild(model))
end
end
return ret
end
--- ---
--- PUBLIC ENVIRONMENT ---
--- ________________________________ ---
--- ---
-- The public table of functions
local iface = {}
--[[ Piping interface functions ]]--
------------------------------------
-- Syntax: #invoke:params|sequential|function name
iface.sequential = function(frame)
return context_init(frame, library.sequential, false, false)
end
-- Syntax: #invoke:params|non-sequential|function name
iface['non-sequential'] = function(frame)
return context_init(frame, library['non-sequential'], false, false)
end
-- Syntax: #invoke:params|with_name_matching|pattern|function name
iface.with_name_matching = function(frame)
return context_init(frame, library.with_name_matching, false, false)
end
-- Syntax: #invoke:params|with_name_not_matching|pattern|function name
iface.with_name_not_matching = function(frame)
return context_init(frame, library.with_name_not_matching, false, false)
end
-- Syntax: #invoke:params|with_value_matching|pattern|function name
iface.with_value_matching = function(frame)
return context_init(frame, library.with_value_matching, false, false)
end
-- Syntax: #invoke:params|with_value_not_matching|pattern|function name
iface.with_value_not_matching = function(frame)
return context_init(frame, library.with_value_not_matching, false, false)
end
-- Syntax: #invoke:params|with_value_not_matching|pattern|function name
iface.trimmed = function(frame)
return context_init(frame, library.trimmed, false, false)
end
--[[ Non-piping interface functions ]]--
----------------------------------------
-- Syntax: #invoke:params|count
iface.count = function(frame)
return context_init(frame, library.count, true, true)
end
-- Syntax: #invoke:params|value_of|parameter name
iface.value_of = function(frame)
return context_init(frame, library.value_of, true, true)
end
-- Syntax: #invoke:params|list|[argument separator]|[key-value
-- separator]|[header]|[footer]
iface.list = function(frame)
return context_init(frame, library.list, true, false)
end
-- Syntax: #invoke:params|list_values|[argument separator]|[header]|[footer]
iface.list_values = function(frame)
return context_init(frame, library.list_values, true, false)
end
-- Syntax: #invoke:params|for_each|wikitext|[header]|[footer]
iface.for_each = function(frame)
return context_init(frame, library.for_each, true, false)
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]
-- |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
iface.concat_and_call = function(frame)
return context_init(frame, library.concat_and_call, false, true)
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
iface.concat_and_invoke = function(frame)
return context_init(frame, library.concat_and_invoke, false, true)
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
iface.call_for_each = function(frame)
return context_init(frame, library.call_for_each, false, false)
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]
-- |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
-- |[named param n=value n]|[...]
iface.call_for_each_value = function(frame)
return context_init(frame, library.call_for_each_value, false, false)
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
-- |[named param n=value n]|[...]
iface.invoke_for_each = function(frame)
return context_init(frame, library.invoke_for_each, false, false)
end
-- Syntax: #invoke:params|invoke_for_each_value|module name|module function
-- |[append 1]|[append 2]|[...]|[append n]|[named param 1=value 1]
-- |[...]|[named param n=value n]|[...]
iface.invoke_for_each_value = function(frame)
return context_init(frame, library.invoke_for_each_value, false, false)
end
return iface






