Модуль:Песочница/Pok: различия между версиями

Нет описания правки
мНет описания правки
Строка 1: Строка 1:
-- source: https://en.wikipedia.org/wiki/Module:Params
---                                        ---
---                                        ---
---    LOCAL ENVIRONMENT                  ---
---    LOCAL ENVIRONMENT                  ---
Строка 12: Строка 11:


-- Helper function for `string.gsub()` (for managing zero-padded numbers)
-- Helper function for `string.gsub()` (for managing zero-padded numbers)
function zero_padded(str)
local function zero_padded (str)
return ("%03d%s"):format(#str, str)
return ('%03d%s'):format(#str, str)
end
end




-- Helper function for `table.sort()` (for natural sorting)
-- Helper function for `table.sort()` (for natural sorting)
function natural_sort(var1, var2)
local function natural_sort (var1, var2)
return tostring(var1):gsub("%d+", zero_padded) <
return tostring(var1):gsub('%d+', zero_padded) <
tostring(var2):gsub("%d+", zero_padded)
tostring(var2):gsub('%d+', zero_padded)
end
end




-- Return a copy or a reference to a table
-- Return a copy or a reference to a table
local function copy_or_ref_table(src, refonly)
local function copy_or_ref_table (src, refonly)
if refonly then return src end
if refonly then return src end
newtab = {}
newtab = {}
Строка 34: Строка 33:


-- Remove numerical elements from a table, shifting everything to the left
-- Remove numerical elements from a table, shifting everything to the left
function remove_numerical_keys(tbl, idx, len)
local function remove_numerical_keys (tbl, idx, len)
local cache = {}
local cache = {}
local tmp = idx + len - 1
local tmp = idx + len - 1
Строка 48: Строка 47:


-- Make a reduced copy of a table (shifting in both directions if necessary)
-- Make a reduced copy of a table (shifting in both directions if necessary)
function copy_table_reduced(tbl, idx, len)
local function copy_table_reduced (tbl, idx, len)
local ret = {}
local ret = {}
local tmp = idx + len - 1
local tmp = idx + len - 1
Строка 76: Строка 75:


-- Make an expanded copy of a table (shifting in both directions if necessary)
-- Make an expanded copy of a table (shifting in both directions if necessary)
function copy_table_expanded(tbl, idx, len)
--[[
local function copy_table_expanded (tbl, idx, len)
local ret = {}
local ret = {}
local tmp = idx + len - 1
local tmp = idx + len - 1
Строка 101: Строка 101:
return ret
return ret
end
end
]]--




-- Move a key from a table to another, but only if under a different name and
-- Move a key from a table to another, but only if under a different name and
-- always parsing numerical strings as numbers
-- always parsing numerical strings as numbers
function steal_if_renamed(val, src, skey, dest, dkey)
local function steal_if_renamed (val, src, skey, dest, dkey)
local realkey = tonumber(dkey) or dkey:match'^%s*(.-)%s*$'
local realkey = tonumber(dkey) or dkey:match'^%s*(.-)%s*$'
if skey ~= realkey then
if skey ~= realkey then
Строка 122: Строка 123:
local mkeywords = {
local mkeywords = {
['or'] = 0,
['or'] = 0,
--pattern = 1, -- Simply uncommenting enables the option
pattern = 1,
plain = 2,
plain = 2,
strict = 3
strict = 3
Строка 181: Строка 182:
--[[ Module's private environment ]]--
--[[ Module's private environment ]]--
--------------------------------------
--------------------------------------
-- Functions listed here declare that they don't need the `frame.args`
-- metatable to be copied into a regular table; if they are modifiers they also
-- guarantee that they will make available their own (modified) copy
local refpipe = {
count = true,
value_of = true,
list = true,
list_values = true,
for_each = true,
call_for_each_group = true
}
-- Functions listed here declare that they don't need the
-- `frame:getParent().args` metatable to be copied into a regular table; if
-- they are modifiers they also guarantee that they will make available their
-- own (modified) copy
local refparams = {
--inserting = true,
grouping_by_calling = true,
count = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
value_of = true,
call_for_each_group = true
}




Строка 198: Строка 228:


-- Create a new context
-- Create a new context
local function context_new()
local function context_new ()
local ctx = {}
local ctx = {}
ctx.luaname = 'Module:Params' --[[ or `frame:getTitle()` ]]--
ctx.luaname = 'Module:Params' --[[ or `frame:getTitle()` ]]--
ctx.iterfunc = pairs
ctx.iterfunc = pairs
ctx.sorttype = 0
ctx.firstposonly = static_iface
ctx.firstposonly = static_iface
ctx.n_available = maxfill
ctx.n_available = maxfill
Строка 209: Строка 240:


-- Move to the next action within the user-given list
-- Move to the next action within the user-given list
local function context_iterate(ctx, n_forward)
local function context_iterate (ctx, n_forward)
local nextfn
local nextfn
if ctx.pipe[n_forward] ~= nil then
if ctx.pipe[n_forward] ~= nil then
Строка 229: Строка 260:


-- Main loop
-- Main loop
local function main_loop(ctx, start_with)
local function main_loop (ctx, start_with)
local fn = start_with
local fn = start_with
repeat fn = fn(ctx) until not fn
repeat fn = fn(ctx) until not fn
Строка 235: Строка 266:




-- Parse the arguments of the `mapping_*` and `renaming_*` class of modifiers
-- Parse user arguments of type `...|[let]|[...][number of additional
function parse_child_args(dest, src, n_skip, default_style)
-- parameters]|[parameter 1]|[parameter 2]|[...]`
local style
local function parse_child_args (src, start_from, append_after)
local shf
local tmp = src[n_skip + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then
style = default_style
shf = n_skip - 1
else shf = n_skip end
local names
local names
local nargs
local tmp
local pin = style[2] + shf
local dest = {}
local n_exist = style[3]
local pin = start_from
local karg = style[4]
if src[pin] ~= nil and src[pin]:match'^%s*let%s*$' then
local varg = style[5]
names = {}
tmp = style[6]
repeat
if tmp > -1 then
tmp = src[pin + 1] or ''
tmp = src[tmp + shf]
karg = tonumber(tmp)
if karg == nil then karg = tmp:match'^%s*(.-)%s*$'
else n_exist = math.max(n_exist, karg) end
end
tmp = style[7]
if tmp > -1 then
tmp = src[tmp + shf]
varg = tonumber(tmp)
if varg == nil then varg = tmp:match'^%s*(.-)%s*$'
else n_exist = math.max(n_exist, varg) end
end
if src[pin] ~= nil and src[pin]:match'^%s*let%s*$' then
names = {}
repeat
tmp = src[pin + 1] or ''
names[tonumber(tmp) or tmp:match'^%s*(.-)%s*$' or ''] =
names[tonumber(tmp) or tmp:match'^%s*(.-)%s*$' or ''] =
src[pin + 2]
src[pin + 2]
Строка 277: Строка 285:
if tmp ~= nil then
if tmp ~= nil then
if tmp < 0 then tmp = -1 end
if tmp < 0 then tmp = -1 end
shf = n_exist - pin
local shf = append_after - pin
for idx = pin + 1, pin + tmp do dest[idx + shf] = src[idx] end
for idx = pin + 1, pin + tmp do dest[idx + shf] = src[idx] end
nargs = pin + tmp + 1
pin = pin + tmp + 1
else nargs = pin end
end
if names ~= nil then
if names ~= nil then
for key, val in pairs(names) do dest[key] = val end
for key, val in pairs(names) do dest[key] = val end
end
end
tmp = style[1]
return dest, pin
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return nargs, tmp, karg, varg
end
end




-- Parse the arguments of the `with_*_matching` class of modifiers
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
local function parse_pattern_args(ctx, ptns, fname)
-- modifiers
local state = 0
local function parse_callback_args (src, n_skip, default_style)
local cnt = 1
local style
local keyw
local shf
local nptns = 0
local tmp = src[n_skip + 1]
for _, val in ipairs(ctx.pipe) do
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if state == 0 then
if style == nil then
nptns = nptns + 1
style = default_style
ptns[nptns] = { val, false, false }
shf = n_skip - 1
state = -1
else shf = n_skip end
else
local n_exist = style[3]
keyw = val:match'^%s*(.*%S)'
local karg = style[4]
if keyw == nil or mkeywords[keyw] == nil or (
local varg = style[5]
state > 0 and mkeywords[keyw] > 0
tmp = style[6]
) then break
if tmp > -1 then
else
tmp = src[tmp + shf]
state = mkeywords[keyw]
karg = tonumber(tmp)
if state > 1 then ptns[nptns][2] = true end
if karg == nil then karg = tmp:match'^%s*(.-)%s*$'
if state == 3 then ptns[nptns][3] = true end
else n_exist = math.max(n_exist, karg) end
end
end
end
tmp = style[7]
cnt = cnt + 1
if tmp > -1 then
tmp = src[tmp + shf]
varg = tonumber(tmp)
if varg == nil then varg = tmp:match'^%s*(.-)%s*$'
else n_exist = math.max(n_exist, varg) end
end
end
if state == 0 then error(ctx.luaname .. ', ‘' .. fname ..
local dest, nargs = parse_child_args(src, style[2] + shf, n_exist)
'’: No pattern was given', 0) end
tmp = style[1]
return cnt
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return dest, nargs, tmp, karg, varg
end
 
 
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
-- modifiers
local function parse_replace_args (opts, fname)
if opts[1] == nil then error(ctx.luaname ..
', ‘' .. fname .. '’: No pattern string was given', 0) end
if opts[2] == nil then error(ctx.luaname ..
', ‘' .. fname .. '’: No replacement string was given', 0) end
local ptn = opts[1]
local repl = opts[2]
local argc = 3
local nmax = tonumber(opts[3])
if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end
local flg = opts[argc]
if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg == 3, argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl)
end
end




-- Map parameters' values using a custom callback and a referenced table
-- Parse the arguments of the `with_*_matching` class of modifiers
function map_values(tbl, margs, karg, varg, looptype, fn)
local function parse_pattern_args (ctx, fname)
if looptype == 1 then
local state = 0
for key, val in pairs(tbl) do
local cnt = 1
margs[varg] = val
local keyw
tbl[key] = fn()
local nptns = 0
local ptns = {}
for _, val in ipairs(ctx.pipe) do
if state == 0 then
nptns = nptns + 1
ptns[nptns] = { val, false, false }
state = -1
else
keyw = val:match'^%s*(.*%S)'
if keyw == nil or mkeywords[keyw] == nil or (
state > 0 and mkeywords[keyw] > 0
) then break
else
state = mkeywords[keyw]
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
end
elseif looptype == 3 then
cnt = cnt + 1
for key, val in pairs(tbl) do
end
margs[karg] = key
if state == 0 then error(ctx.luaname .. ', ‘' .. fname ..
margs[varg] = val
'’: No pattern was given', 0) end
return ptns, cnt
end
 
 
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
tbl[key] = fn()
end
end
elseif looptype == 2 then
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
for key in pairs(tbl) do
margs[karg] = key
margs[karg] = key
tbl[key] = fn()
tbl[key] = fn()
end
end
elseif looptype == 0 then
end,
for key in pairs(tbl) do
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg] = key
margs[varg] = val
tbl[key] = fn()
tbl[key] = fn()
end
end
end
end
end
}




-- Map parameters' names using a custom callback and a referenced table
-- Private table for `map_names()`
function map_names(tbl, rargs, karg, varg, looptype, fn)
local name_thieves_maps = {
local cache = {}
[0] = function (cache, tbl, rargs, karg, varg, fn)
if looptype == 2 then
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
steal_if_renamed(val, tbl, key, cache, fn())
end
end
elseif looptype == 3 then
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
rargs[karg] = key
rargs[varg] = val
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
steal_if_renamed(val, tbl, key, cache, fn())
end
end
elseif looptype == 1 then
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
rargs[varg] = val
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
steal_if_renamed(val, tbl, key, cache, fn())
end
end
elseif looptype == 0 then
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
rargs[karg] = key
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
steal_if_renamed(val, tbl, key, cache, fn())
end
end
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves_maps[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numerical
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local tmp
local prefix
local gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
gid = tonumber(key)
if gid == nil then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else prefix = '' end
if groups[gid] == nil then groups[gid] = {} end
tmp = tonumber(prefix)
if tmp ~= nil then
if tmp < 1 then prefix = tmp - 1 else prefix = tmp end
end
groups[gid][prefix] = val
end
return groups
end
end


Строка 380: Строка 478:
-- 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(ctx)
local function concat_params (ctx)
local tbl = ctx.params
local tbl = ctx.params
local size = table.maxn(ctx.pipe)
local size = table.maxn(ctx.pipe)
Строка 403: Строка 501:
-- Flush the parameters by calling a custom function for each value (after this
-- Flush the parameters by calling a custom function for each value (after this
-- function has been invoked `ctx.params` will be no longer usable)
-- function has been invoked `ctx.params` will be no longer usable)
local function flush_params(ctx, fn)
local function flush_params (ctx, fn)
local tbl = ctx.params
local tbl = ctx.params
if ctx.subset == 1 then
if ctx.subset == 1 then
Строка 412: Строка 510:
for key, val in ipairs(tbl) do tbl[key] = nil end
for key, val in ipairs(tbl) do tbl[key] = nil end
end
end
if ctx.dosort then
if ctx.sorttype > 0 then
local nums = {}
local nums = {}
local words = {}
local words = {}
local nlen = 0
local nn = 0
local wlen = 0
local nw = 0
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
if type(key) == 'number' then
if type(key) == 'number' then
nlen = nlen + 1
nn = nn + 1
nums[nlen] = key
nums[nn] = key
else
else
wlen = wlen + 1
nw = nw + 1
words[wlen] = key
words[nw] = key
end
end
end
end
table.sort(nums)
table.sort(nums)
table.sort(words, natural_sort)
table.sort(words, natural_sort)
for idx = 1, nlen do fn(nums[idx], tbl[nums[idx]]) end
if ctx.sorttype == 2 then
for idx = 1, wlen do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
return
end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
return
return
end
end
Строка 448: Строка 551:


-- Syntax:  #invoke:params|sequential|pipe to
-- Syntax:  #invoke:params|sequential|pipe to
library.sequential = function(ctx)
library.sequential = function (ctx)
if ctx.subset == -1 then error(ctx.luaname ..
if ctx.subset == -1 then error(ctx.luaname ..
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
if ctx.dosort then error(ctx.luaname ..
if ctx.sorttype > 0 then error(ctx.luaname ..
': The ‘all_sorted’ directive is redundant when followed by ‘sequential’', 0) end
': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end
ctx.iterfunc = ipairs
ctx.iterfunc = ipairs
ctx.subset = 1
ctx.subset = 1
Строка 460: Строка 563:


-- Syntax:  #invoke:params|non-sequential|pipe to
-- Syntax:  #invoke:params|non-sequential|pipe to
library['non-sequential'] = function(ctx)
library['non-sequential'] = function (ctx)
if ctx.subset == 1 then error(ctx.luaname ..
if ctx.subset == 1 then error(ctx.luaname ..
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
Строка 469: Строка 572:




-- Syntax:  #invoke:params|sort|pipe to
-- Syntax:  #invoke:params|all_sorted|pipe to
library.all_sorted = function(ctx)
library.all_sorted = function (ctx)
if ctx.subset == 1 then error(ctx.luaname ..
if ctx.subset == 1 then error(ctx.luaname ..
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
ctx.dosort = true
if ctx.sorttype == 2 then error(ctx.luaname ..
': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end
ctx.sorttype = 1
return context_iterate(ctx, 1)
end
 
 
-- Syntax:  #invoke:params|reassorted|pipe to
library.reassorted = function (ctx)
if ctx.subset == 1 then error(ctx.luaname ..
': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 1 then error(ctx.luaname ..
': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end
ctx.sorttype = 2
return context_iterate(ctx, 1)
return context_iterate(ctx, 1)
end
end
Строка 479: Строка 595:


-- Syntax:  #invoke:params|setting|directives|...|pipe to
-- Syntax:  #invoke:params|setting|directives|...|pipe to
library.setting = function(ctx)
library.setting = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local cmd = opts[1]
local cmd = opts[1]
Строка 503: Строка 619:
vname = memoryslots[string.char(chr)]
vname = memoryslots[string.char(chr)]
if vname == nil then error(ctx.luaname ..
if vname == nil then error(ctx.luaname ..
', ‘setting’: Unknown slot "' ..
', ‘setting’: Unknown slot ' ..
string.char(chr) .. '"', 0) end
string.char(chr) .. '', 0) end
table.insert(dest, vname)
table.insert(dest, vname)
end
end
Строка 514: Строка 630:


-- Syntax:  #invoke:params|squeezing|pipe to
-- Syntax:  #invoke:params|squeezing|pipe to
library.squeezing = function(ctx)
library.squeezing = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local store = {}
local store = {}
Строка 534: Строка 650:


-- Syntax:  #invoke:params|filling_the_gaps|pipe to
-- Syntax:  #invoke:params|filling_the_gaps|pipe to
library.filling_the_gaps = function(ctx)
library.filling_the_gaps = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local nmin = 1
local nmin = 1
Строка 564: Строка 680:


-- Syntax:  #invoke:params|clearing|pipe to
-- Syntax:  #invoke:params|clearing|pipe to
library.clearing = function(ctx)
library.clearing = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local numericals = {}
local numericals = {}
Строка 579: Строка 695:


-- Syntax:  #invoke:params|cutting|left cut|right cut|pipe to
-- Syntax:  #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function(ctx)
library.cutting = function (ctx)
local lcut = tonumber(ctx.pipe[1])
local lcut = tonumber(ctx.pipe[1])
if lcut == nil then error(ctx.luaname ..
if lcut == nil then error(ctx.luaname ..
Строка 614: Строка 730:


-- Syntax:  #invoke:params|cropping|left crop|right crop|pipe to
-- Syntax:  #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function(ctx)
library.cropping = function (ctx)
local lcut = tonumber(ctx.pipe[1])
local lcut = tonumber(ctx.pipe[1])
if lcut == nil then error(ctx.luaname ..
if lcut == nil then error(ctx.luaname ..
Строка 658: Строка 774:


-- Syntax:  #invoke:params|purging|start offset|length|pipe to
-- Syntax:  #invoke:params|purging|start offset|length|pipe to
library.purging = function(ctx)
library.purging = function (ctx)
local idx = tonumber(ctx.pipe[1])
local idx = tonumber(ctx.pipe[1])
if idx == nil then error(ctx.luaname ..
if idx == nil then error(ctx.luaname ..
Строка 677: Строка 793:


-- Syntax:  #invoke:params|backpurging|start offset|length|pipe to
-- Syntax:  #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function(ctx)
library.backpurging = function (ctx)
local last = tonumber(ctx.pipe[1])
local last = tonumber(ctx.pipe[1])
if last == nil then error(ctx.luaname ..
if last == nil then error(ctx.luaname ..
Строка 704: Строка 820:


-- Syntax:  #invoke:params|rotating|pipe to
-- Syntax:  #invoke:params|rotating|pipe to
library.rotating = function(ctx)
library.rotating = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local numericals = {}
local numericals = {}
Строка 722: Строка 838:
-- Syntax:  #invoke:params|pivoting|pipe to
-- Syntax:  #invoke:params|pivoting|pipe to
--[[
--[[
library.pivoting = function(ctx)
library.pivoting = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local shift = #tbl + 1
local shift = #tbl + 1
Строка 741: Строка 857:
-- Syntax:  #invoke:params|mirroring|pipe to
-- Syntax:  #invoke:params|mirroring|pipe to
--[[
--[[
library.mirroring = function(ctx)
library.mirroring = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local numericals = {}
local numericals = {}
Строка 765: Строка 881:
-- Syntax:  #invoke:params|swapping|pipe to
-- Syntax:  #invoke:params|swapping|pipe to
--[[
--[[
library.swapping = function(ctx)
library.swapping = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local cache = {}
local cache = {}
Строка 788: Строка 904:


-- Syntax:  #invoke:params|sorting_sequential_values|[criterion]|pipe to
-- Syntax:  #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function(ctx)
library.sorting_sequential_values = function (ctx)
local sortfn
local sortfn
if ctx.pipe[1] ~= nil then sortfn = sortfunctions[ctx.pipe[1]] end
if ctx.pipe[1] ~= nil then sortfn = sortfunctions[ctx.pipe[1]] end
Строка 800: Строка 916:
-- Syntax:  #invoke:params|inserting|position|how many|...|pipe to
-- Syntax:  #invoke:params|inserting|position|how many|...|pipe to
--[[
--[[
library.inserting = function(ctx)
library.inserting = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
-- this function MUST create a copy of it before returning
Строка 819: Строка 935:


-- Syntax:  #invoke:params|imposing|name|value|pipe to
-- Syntax:  #invoke:params|imposing|name|value|pipe to
library.imposing = function(ctx)
library.imposing = function (ctx)
if ctx.pipe[1] == nil then error(ctx.luaname ..
if ctx.pipe[1] == nil then error(ctx.luaname ..
', ‘imposing’: Missing parameter name to impose', 0) end
', ‘imposing’: Missing parameter name to impose', 0) end
local key = ctx.pipe[1]:match'^%s*(.-)%s*$'
local key = ctx.pipe[1]:match'^%s*(.-)%s*$'
ctx.params[tonumber(key) or key] = ctx.pipe[2]
ctx.params[tonumber(key) or key] = ctx.pipe[2]
return context_iterate(ctx, 3)
end
-- Syntax:  #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
if ctx.pipe[1] == nil then error(ctx.luaname ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = ctx.pipe[1]:match'^%s*(.-)%s*$'
key = tonumber(key) or key
if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end
return context_iterate(ctx, 3)
return context_iterate(ctx, 3)
end
end
Строка 829: Строка 956:


-- Syntax:  #invoke:params|discarding|name|[how many]|pipe to
-- Syntax:  #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function(ctx)
library.discarding = function (ctx)
if ctx.pipe[1] == nil then error(ctx.luaname ..
if ctx.pipe[1] == nil then error(ctx.luaname ..
', ‘discarding’: Missing parameter name to discard', 0) end
', ‘discarding’: Missing parameter name to discard', 0) end
Строка 848: Строка 975:




-- Syntax:  #invoke:params|with_name_matching|pattern 1|[plain flag 1]|[or]
-- Syntax:  #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]
--            |[pattern 2]|[plain flag 2]|[or]|[...]|[pattern N]|[plain flag
--            |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
--            N]|pipe to
--            N]|pipe to
library.with_name_matching = function(ctx)
library.with_name_matching = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local patterns = {}
local targets, argc = parse_pattern_args(ctx, targets,
local argc = parse_pattern_args(ctx, patterns, 'with_name_matching')
'with_name_matching')
local nomatch
local nomatch
for key in pairs(tbl) do
for key in pairs(tbl) do
nomatch = true
nomatch = true
for _, ptn in ipairs(patterns) do
for _, ptn in ipairs(targets) do
if not ptn[3] then
if not ptn[3] then
if string.find(key, ptn[1], 1, ptn[2]) then
if string.find(key, ptn[1], 1, ptn[2]) then
Строка 875: Строка 1002:




-- Syntax:  #invoke:params|with_name_not_matching|pattern 1|[plain flag 1]
-- Syntax:  #invoke:params|with_name_not_matching|target 1|[plain flag 1]
--            |[and]|[pattern 2]|[plain flag 2]|[and]|[...]|[pattern N]|[plain
--            |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
--            flag N]|pipe to
--            flag N]|pipe to
library.with_name_not_matching = function(ctx)
library.with_name_not_matching = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local patterns = {}
local targets, argc = parse_pattern_args(ctx, targets,
local argc = parse_pattern_args(ctx, patterns,
'with_name_not_matching')
'with_name_not_matching')
local yesmatch
local yesmatch
for key in pairs(tbl) do
for key in pairs(tbl) do
yesmatch = true
yesmatch = true
for _, ptn in ipairs(patterns) do
for _, ptn in ipairs(targets) do
if ptn[3] then
if ptn[3] then
if key ~= ptn[1] then
if key ~= ptn[1] then
Строка 903: Строка 1029:




-- Syntax:  #invoke:params|with_value_matching|pattern 1|[plain flag 1]|[or]
-- Syntax:  #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]
--            |[pattern 2]|[plain flag 2]|[or]|[...]|[pattern N]|[plain flag
--            |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
--            N]|pipe to
--            N]|pipe to
library.with_value_matching = function(ctx)
library.with_value_matching = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local patterns = {}
local targets, argc = parse_pattern_args(ctx, targets,
local argc = parse_pattern_args(ctx, patterns, 'with_value_matching')
'with_value_matching')
local nomatch
local nomatch
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
nomatch = true
nomatch = true
for _, ptn in ipairs(patterns) do
for _, ptn in ipairs(targets) do
if ptn[3] then
if ptn[3] then
if val == ptn[1] then
if val == ptn[1] then
Строка 930: Строка 1056:




-- Syntax:  #invoke:params|with_value_not_matching|pattern 1|[plain flag 1]
-- Syntax:  #invoke:params|with_value_not_matching|target 1|[plain flag 1]
--            |[and]|[pattern 2]|[plain flag 2]|[and]|[...]|[pattern N]|[plain
--            |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
--            flag N]|pipe to
--            flag N]|pipe to
library.with_value_not_matching = function(ctx)
library.with_value_not_matching = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
local patterns = {}
local targets, argc = parse_pattern_args(ctx, targets,
local argc = parse_pattern_args(ctx, patterns,
'with_value_not_matching')
'with_value_not_matching')
local yesmatch
local yesmatch
for key, val in pairs(tbl) do
for key, val in pairs(tbl) do
yesmatch = true
yesmatch = true
for _, ptn in ipairs(patterns) do
for _, ptn in ipairs(targets) do
if ptn[3] then
if ptn[3] then
if val ~= ptn[1] then
if val ~= ptn[1] then
Строка 959: Строка 1084:


-- Syntax:  #invoke:params|trimming_values|pipe to
-- Syntax:  #invoke:params|trimming_values|pipe to
library.trimming_values = function(ctx)
library.trimming_values = function (ctx)
local tbl = ctx.params
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
Строка 969: Строка 1094:
--            style]|[let]|[...][number of additional parameters]|[parameter
--            style]|[let]|[...][number of additional parameters]|[parameter
--            1]|[parameter 2]|[...]|[parameter N]|pipe to
--            1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function(ctx)
library.mapping_by_calling = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local tname
local tname
Строка 975: Строка 1100:
if tname == nil then error(ctx.luaname ..
if tname == nil then error(ctx.luaname ..
', ‘mapping_by_calling’: No template name was provided', 0) end
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs = {}
local margs, argc, looptype, karg, varg = parse_callback_args(opts, 1,
local argc, looptype, karg, varg = parse_child_args(margs, opts, 1,
mapping_styles.values_only)
mapping_styles.values_only)
local model = { title = tname, args = margs }
local model = { title = tname, args = margs }
map_values(ctx.params, margs, karg, varg, looptype, function()
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
return ctx.frame:expandTemplate(model)
end)
end)
Строка 989: Строка 1113:
--            name|[call style]|[let]|[...]|[number of additional
--            name|[call style]|[let]|[...]|[number of additional
--            arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
--            arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function(ctx)
library.mapping_by_invoking = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local mname
local mname
Строка 999: Строка 1123:
if fname == nil then error(ctx.luaname ..
if fname == nil then error(ctx.luaname ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs = {}
local margs, argc, looptype, karg, varg = parse_callback_args(opts, 2,
local argc, looptype, karg, varg = parse_child_args(margs, opts, 2,
mapping_styles.values_only)
mapping_styles.values_only)
local model = { title = 'Module:' .. mname, args = margs }
local model = { title = 'Module:' .. mname, args = margs }
Строка 1007: Строка 1130:
', ‘mapping_by_invoking’: The function ‘' .. fname ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
'’ does not exist', 0) end
map_values(ctx.params, margs, karg, varg, looptype, function()
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return mfunc(ctx.frame:newChild(model))
return mfunc(ctx.frame:newChild(model))
end)
end)
Строка 1017: Строка 1140:
--            style]|[let]|[...][number of additional arguments]|[argument
--            style]|[let]|[...][number of additional arguments]|[argument
--            1]|[argument 2]|[...]|[argument N]|pipe to
--            1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function(ctx)
library.mapping_by_magic = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local magic
local magic
Строка 1023: Строка 1146:
if magic == nil then error(ctx.luaname ..
if magic == nil then error(ctx.luaname ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs = {}
local margs, argc, looptype, karg, varg = parse_callback_args(opts, 1,
local argc, looptype, karg, varg = parse_child_args(margs, opts, 1,
mapping_styles.values_only)
mapping_styles.values_only)
map_values(ctx.params, margs, karg, varg, looptype, function()
value_maps[looptype](ctx.params, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
return ctx.frame:callParserFunction(magic, margs)
end)
end)
Строка 1033: Строка 1155:




-- Syntax:  #invoke:params|renaming_by_calling|template name|[call
-- Syntax:  #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
--            flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, is_strict, argc, die =
parse_replace_args(ctx.pipe, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if is_strict then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc)
end
 
 
-- Syntax:  #invoke:params|renaming_by_calling|template name|[call
--            style]|[let]|[...][number of additional parameters]|[parameter
--            style]|[let]|[...][number of additional parameters]|[parameter
--            1]|[parameter 2]|[...]|[parameter N]|pipe to
--            1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function(ctx)
library.renaming_by_calling = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local tname
local tname
Строка 1042: Строка 1188:
if tname == nil then error(ctx.luaname ..
if tname == nil then error(ctx.luaname ..
', ‘renaming_by_calling’: No template name was provided', 0) end
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs = {}
local rargs, argc, looptype, karg, varg = parse_callback_args(opts, 1,
local argc, looptype, karg, varg = parse_child_args(rargs, opts, 1,
mapping_styles.names_only)
mapping_styles.names_only)
local model = { title = tname, args = rargs }
local model = { title = tname, args = rargs }
map_names(ctx.params, rargs, karg, varg, looptype, function()
map_names(ctx.params, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
return ctx.frame:expandTemplate(model)
end)
end)
Строка 1056: Строка 1201:
--            name|[call style]|[let]|[...]|[number of additional
--            name|[call style]|[let]|[...]|[number of additional
--            arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
--            arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_invoking = function(ctx)
library.renaming_by_invoking = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local mname
local mname
Строка 1066: Строка 1211:
if fname == nil then error(ctx.luaname ..
if fname == nil then error(ctx.luaname ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs = {}
local rargs, argc, looptype, karg, varg = parse_callback_args(opts, 2,
local argc, looptype, karg, varg = parse_child_args(rargs, opts, 2,
mapping_styles.names_only)
mapping_styles.names_only)
local model = { title = 'Module:' .. mname, args = rargs }
local model = { title = 'Module:' .. mname, args = rargs }
Строка 1074: Строка 1218:
', ‘renaming_by_invoking’: The function ‘' .. fname ..
', ‘renaming_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
'’ does not exist', 0) end
map_names(ctx.params, rargs, karg, varg, looptype, function()
map_names(ctx.params, rargs, karg, varg, looptype, function ()
return mfunc(ctx.frame:newChild(model))
return mfunc(ctx.frame:newChild(model))
end)
end)
return context_iterate(ctx, argc)
return context_iterate(ctx, argc)
end
end
 
 
 
 
-- Syntax:  #invoke:params|renaming_by_magic|parser function|[call
-- Syntax:  #invoke:params|renaming_by_magic|parser function|[call
--            style]|[let]|[...][number of additional arguments]|[argument
--            style]|[let]|[...][number of additional arguments]|[argument
--            1]|[argument 2]|[...]|[argument N]|pipe to
--            1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_magic = function(ctx)
library.renaming_by_magic = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local magic
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(ctx.luaname ..
if magic == nil then error(ctx.luaname ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs = {}
local rargs, argc, looptype, karg, varg = parse_callback_args(opts, 1,
local argc, looptype, karg, varg = parse_child_args(rargs, opts, 1,
mapping_styles.names_only)
mapping_styles.names_only)
map_names(ctx.params, rargs, karg, varg, looptype, function ()
map_names(ctx.params, rargs, karg, varg, looptype, function()
return ctx.frame:callParserFunction(magic, rargs)
return ctx.frame:callParserFunction(magic, rargs)
end)
end)
return context_iterate(ctx, argc)
end
 
 
-- Syntax:  #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
--            flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, is_strict, argc, die =
parse_replace_args(ctx.pipe, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if is_strict then
local key = tonumber(ptn) or ptn:match'^%s*(.-)%s*$'
local val = tbl[key]
tbl[key] = nil
tbl[tonumber(repl) or repl:match'^%s*(.-)%s*$'] = val
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc)
end
 
 
-- Syntax:  #invoke:params|grouping_by_calling|template
--            name|[let]|[...]|[number of additional arguments]|[argument
--            1]|[argument 2]|[...]|[argument N]|pipe to
library.grouping_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
local tmp
if opts[1] ~= nil then tmp = opts[1]:match'^%s*(.*%S)' end
if tmp == nil then error(ctx.luaname ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local tmp, argc = parse_child_args(opts, 2, 0)
local gargs = {}
for key, val in pairs(tmp) do
if type(key) == 'number' and key < 1 then gargs[key - 1] = val
else gargs[key] = val end
end
local groups = make_groups(ctx.params)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0] = gid
model.args = group
groups[gid] = ctx.frame:expandTemplate(model)
end
ctx.params = groups
return context_iterate(ctx, argc)
return context_iterate(ctx, argc)
end
end
Строка 1106: Строка 1307:


-- Syntax:  #invoke:params|count
-- Syntax:  #invoke:params|count
library.count = function(ctx)
library.count = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local retval = 0
local retval = 0
Строка 1119: Строка 1320:
--            |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
--            |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
--            n]|[...]
--            n]|[...]
library.concat_and_call = function(ctx)
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local opts = ctx.pipe
Строка 1138: Строка 1339:
--            1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
--            1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
--            item n=value n]|[...]
--            item n=value n]|[...]
library.concat_and_invoke = function(ctx)
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local opts = ctx.pipe
Строка 1165: Строка 1366:
--            2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
--            2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
--            value n]|[...]
--            value n]|[...]
library.concat_and_magic = function(ctx)
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
-- NOTE: `ctx.params` might be the original metatable!
local opts = ctx.pipe
local opts = ctx.pipe
Строка 1179: Строка 1380:


-- Syntax:  #invoke:params|value_of|parameter name
-- Syntax:  #invoke:params|value_of|parameter name
library.value_of = function(ctx)
library.value_of = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
local opts = ctx.pipe
Строка 1203: Строка 1404:


-- Syntax:  #invoke:params|list
-- Syntax:  #invoke:params|list
library.list = function(ctx)
library.list = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
-- NOTE: `ctx.pipe` might be the original metatable!
local kvs = ctx.pairsep or ''
local kvs = ctx.pairsep or ''
Строка 1211: Строка 1412:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
ret[nss + 1] = pps
ret[nss + 1] = pps
ret[nss + 2] = key
ret[nss + 2] = key
Строка 1234: Строка 1435:


-- Syntax:  #invoke:params|list_values
-- Syntax:  #invoke:params|list_values
library.list_values = function(ctx)
library.list_values = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
-- NOTE: `ctx.pipe` might be the original metatable!
local pps = ctx.itersep or ''
local pps = ctx.itersep or ''
Строка 1241: Строка 1442:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
ret[nss + 1] = pps
ret[nss + 1] = pps
ret[nss + 2] = val
ret[nss + 2] = val
Строка 1262: Строка 1463:


-- Syntax:  #invoke:params|for_each|wikitext
-- Syntax:  #invoke:params|for_each|wikitext
library.for_each = function(ctx)
library.for_each = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
-- NOTE: `ctx.pipe` might be the original metatable!
local txt = ctx.pipe[1] or ''
local txt = ctx.pipe[1] or ''
Строка 1270: Строка 1471:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
ret[nss + 1] = pps
ret[nss + 1] = pps
ret[nss + 2] = txt:gsub('%$#', key):gsub('%$@', val)
ret[nss + 2] = txt:gsub('%$#', key):gsub('%$@', val)
Строка 1293: Строка 1494:
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            n=value n]|[...]
--            n=value n]|[...]
library.call_for_each = function(ctx)
library.call_for_each = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local tname
local tname
Строка 1306: Строка 1507:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = key
opts[1] = key
opts[2] = val
opts[2] = val
Строка 1331: Строка 1532:
--            1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
--            1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
--            |[named param n=value n]|[...]
--            |[named param n=value n]|[...]
library.invoke_for_each = function(ctx)
library.invoke_for_each = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local mname
local mname
Строка 1348: Строка 1549:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = key
opts[1] = key
opts[2] = val
opts[2] = val
Строка 1373: Строка 1574:
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            n=value n]|[...]
--            n=value n]|[...]
library.magic_for_each = function(ctx)
library.magic_for_each = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local magic
local magic
Строка 1385: Строка 1586:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = key
opts[1] = key
opts[2] = val
opts[2] = val
Строка 1411: Строка 1612:
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            n=value n]|[...]
--            n=value n]|[...]
library.call_for_each_value = function(ctx)
library.call_for_each_value = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local tname
local tname
Строка 1423: Строка 1624:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = val
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 1] = ccs
Строка 1447: Строка 1648:
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            n=value n]|[...]
--            n=value n]|[...]
library.invoke_for_each_value = function(ctx)
library.invoke_for_each_value = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local mname
local mname
Строка 1465: Строка 1666:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = val
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 1] = ccs
Строка 1489: Строка 1690:
--            |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
--            |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
--            param n=value n]|[...]
--            param n=value n]|[...]
library.magic_for_each_value = function(ctx)
library.magic_for_each_value = function (ctx)
local opts = ctx.pipe
local opts = ctx.pipe
local magic
local magic
Строка 1500: Строка 1701:
flush_params(
flush_params(
ctx,
ctx,
function(key, val)
function (key, val)
opts[1] = val
opts[1] = val
ret[nss + 1] = ccs
ret[nss + 1] = ccs
Строка 1525: Строка 1726:
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
--            n=value n]|[...]
--            n=value n]|[...]
library.call_for_each_group = function(ctx)
library.call_for_each_group = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
local opts = ctx.pipe
Строка 1535: Строка 1736:
local ccs = ctx.itersep or ''
local ccs = ctx.itersep or ''
local nss = 0
local nss = 0
local prefix
local gid
local groups = {}
local ret = {}
local ret = {}
opts = {}
opts = {}
Строка 1545: Строка 1743:
end
end
ctx.pipe = opts
ctx.pipe = opts
for key, val in pairs(ctx.params) do
ctx.params = make_groups(ctx.params)
prefix, gid = tostring(key):match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
if groups[gid] == nil then groups[gid] = {} end
tmp = tonumber(prefix)
if tmp ~= nil then
if tmp < 1 then prefix = tmp - 1 else prefix = tmp end
end
groups[gid][prefix] = val
end
ctx.params = groups
flush_params(
flush_params(
ctx,
ctx,
function(gid, group)
function (gid, group)
for key, val in pairs(opts) do group[key] = val end
for key, val in pairs(opts) do group[key] = val end
group[0] = gid
group[0] = gid
Строка 1595: Строка 1783:
-- Syntax:  #invoke:params|new|pipe to
-- Syntax:  #invoke:params|new|pipe to
--[[
--[[
static_iface.new = function(frame)
static_iface.new = function (frame)
local ctx = context_new()
local ctx = context_new()
ctx.frame = frame:getParent()
ctx.frame = frame:getParent()
Строка 1609: Строка 1797:
--[[ First-position-only functions ]]--
--[[ First-position-only functions ]]--
---------------------------------------
---------------------------------------




-- Syntax:  #invoke:params|self
-- Syntax:  #invoke:params|self
static_iface.self = function(frame)
static_iface.self = function (frame)
return frame:getParent():getTitle()
return frame:getParent():getTitle()
end
end
Строка 1621: Строка 1808:
--[[ Public metatable of functions ]]--
--[[ Public metatable of functions ]]--
---------------------------------------
---------------------------------------




return setmetatable(static_iface, {
return setmetatable(static_iface, {
__index = function(iface, _fname_)
__index = function (iface, _fname_)
local ctx = context_new()
local ctx = context_new()
local fname = _fname_:match'^%s*(.*%S)'
local fname = _fname_:match'^%s*(.*%S)'
Строка 1632: Строка 1818:
if library[fname] == nil then error(ctx.luaname ..
if library[fname] == nil then error(ctx.luaname ..
': The function ‘' .. fname .. '’ does not exist', 0) end
': The function ‘' .. fname .. '’ does not exist', 0) end
return function(frame)
local func = library[fname]
local func = library[fname]
return function (frame)
local refpipe = {
count = true,
value_of = true,
list = true,
list_values = true,
for_each = true,
call_for_each_group = true
}
local refparams = {
--inserting = true,
count = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
value_of = true,
call_for_each_group = true
}
ctx.frame = frame:getParent()
ctx.frame = frame:getParent()
ctx.pipe = copy_or_ref_table(frame.args, refpipe[fname])
ctx.pipe = copy_or_ref_table(frame.args,
ctx.params = copy_or_ref_table(ctx.frame.args, refparams[fname])
refpipe[fname])
ctx.params = copy_or_ref_table(ctx.frame.args,
refparams[fname])
main_loop(ctx, func)
main_loop(ctx, func)
return ctx.text
return ctx.text