Module:Iteration
More actions
The module uses frequently the template {{=}} for title = "="
This module contains the functions for different templates, solving their iteration problem
The MediaWiki template coding does not support the repetitive processing of a parameter set, which leads often to a very primitive and long chain of parameter checks in the kind of:{{#if:{{{1|}}} | perform an action with parameter 1 }}
{{#if:{{{2|}}} | perform an action with parameter 2 }}
{{#if:{{{3|}}} | perform an action with parameter 3 }}
{{#if:{{{4|}}} | perform an action with parameter 4 }}
•••
•••
{{#if:{{{33|}}} perform an action with parameter 33 }}
for loops this iterations should be possible, somehow. After long searching without any success and without an idea how to perform it, I asked at several forums and got finally from User:Trappist the monk the helping hint to solve it with a control structure like: local out = {}
for i, v in ipairs (args) do
table.insert (out, frame:expandTemplate{ title = title, args = v })
end
return table.concat (out)
The functions contained therein are from very simple, just one parameter to pass, to more complicated ones, where e.g. a pair of parameters needs kind of a flip-flop switch when always a tuple of e.g. an item and its correlated text needs to be passed.
When there are tuples, triples etc., the table.insert occurs, when the last element is processed; this performs problems when the last group is incomplete – it should be finished with empty values to trigger the table.insert. The check with table.maxn seems not to work correctly?
This problem is solved differently, for the function attribs with a primitive workaround.
Namespace lists
There are special lists for some namespaces:
- Filelist - for items of the namespace 6 (File:)
- Userlist - for items of the namespace 2 (User:)
- Linklist - for items of the namespace
0(main) — not yet - Templist - for items of the namespace
10(Template:) — not yet - Cat-list - for items of the namespace
14(Category:) — not yet - Mod-list - for items of the namespace
828(Module:) — not yet
Filelist
File list templates
The three templates {{Ifim}}, {{Ifim1}} and {{Ifimt}} avoid to display the file itself as an |other version=.
There are currently five templates creating file lists with the function:filelist
{{Other versions}}a vertical list (without initial){{Filelist}}a horizontal list (without initial){{Derivative versions}}a vertical list{{Derived from}}a vertical list{{File}}a horizontal list
All these templates are autoreferencing, and the support also the |gallery= option.
Other file lists
The function:svglang creates a list of just file_names and language_codes, for:
-
{{Svg lang}} {{Lang gallery}}{{Multilingual SVG diagrams}}
Much more is created by the function:ownbased for the template:
{{Own based}}
which will handle in the majority of cases just one file, but can serve an unlimited number.
This list can be controlled by the user to be displayed either horizontally or vertically.
{{Attribs}}
The template works, whether there is a user assigned for a file, or one filename follows another.
{{Emoji}}
The template displays a line of SVG emojis; Unicode characters/emojis can be displayed with the function emodis or emotab.
Variable iterations
A very simple iteration, usable for everything, is performed by function:iterate
- used by e.g.
{{Image extracted}},{{Image translated}},
More usable is the function:iteration for transclusions of a template with:
- a number of positional parameters which can change at each transclusion, and
- a number of positional parameters which are the same for all transclusions.
See template {{Iterate}}.
The function:loop is used by {{Repeat}}.
samefile function
When the name of one of the files is the same as the first one, it is enough to reference it with its extension after a dot, e.g. just ".jpeg". The most standard extensions can be abbreviated, e.g. ".j" will be sufficient for ".jpg" (only for lower case!).
The function incrhx increments a hexadecimal number (parm 1) by a decimal number (parm 2).
Valid numbers are assumed, no checking occurs!
When parameter 2 is preceded by a minus, the first number is decremented by the second one.
Userlist
- Userlist:
{{Userlist}}with many formatting parameters
Linklist
Templist
Other iterations
- Langlist:
- Colorbox:
{{ColorString}}and other color box templates - Legends :
{{Legtab}}combines single{{Legend}}s - Tleparms: the metatemplate
{{Tle}}displays the parameter usage of a template - Navigate:
{{Navcat}}navigates through color categories - Showname:
{{Showname}}helper template, for parameter tests - Emodis :
{{Emoji}}displays (one or many) Unicode characters
- The function
emodisdisplays Unicode characters / emojis; it can care for newlines, while - The function
emotabdisplays a table of files / emojis.
-- This module contains the functions for different templates, solving their iteration problems.
local p = {}
-- for Template:Ifim
function p.ifim1 (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local p1 = args.p1 or "";
local p2 = args.p2 or "";
local p3 = args.p3 or "";
local p4 = args.p4 or "";
local p5 = args.p5 or "";
local fn = args.fn or "";
for _, v in ipairs(args) do
table.insert(otab, frame:expandTemplate{ title = "Ifim1", args = { v, p1, p2, p3, p4, p5, n= fn } });
end
return table.concat (otab)
end
-- for Template:Ifimc
function p.ifim2 (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local p1 = args.p1 or "";
local p2 = args.p2 or "";
local p3 = args.p3 or "";
local p4 = args.p4 or "";
for _, v in ipairs(args) do
table.insert(otab, frame:expandTemplate{ title = "Ifim2", args = { v, p1, p2, p3, p4, v } });
end
return table.concat (otab)
end
-- for Template:Ifimt (param pairs)
function p.ifimt (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local v1 = "";
local p1 = args.p1 or "";
local p2 = args.p2 or "";
local p3 = args.p3 or "";
local p4 = args.p4 or "";
for _, v in ipairs(args) do
if v1 == "" then
v1 = mw.text.trim( v );
else
table.insert(otab, frame:expandTemplate{ title = "Ifim2", args = { v1, p1, p2, p3, p4, v } });
v1 = "";
end
end
return table.concat (otab)
end
-------------------------------------------------------
-- for Template:SVG lang
function p.svglang (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local file = args.file or "";
for _, v in ipairs(args) do
table.insert(otab, frame:expandTemplate{ title = "Source thumb", args = { file, mw.text.trim(v) } });
end
return table.concat (otab)
end
-- for Template:Derivative versions
function p.derivates (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local btab = {};
local dis = args.d or args.display or "";
local opt = args.o or args.opt or "";
local prf = args.p or "<br><span style=color:#69F>✦ </span>"; -- 'list' item
local by0 = args.by or "";
btab [1] = args.by1 or by0;
btab [2] = args.by2 or by0;
btab [3] = args.by3 or by0;
btab [4] = args.by4 or by0; -- only the first four items can get their own "by"s
for i, v in ipairs(args) do
local by = by0
local pf = prf
if i == 1 then pf = "" end
if i <= 4 then by = btab[i] end
if v ~= '' then
table.insert(otab, frame:expandTemplate{ title = "F", args = {v, opt, dis, p= pf, by= by } });
end
end
return table.concat (otab)
end
-- for Template:Derived from
function p.derived (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local opt = args.o or args.opt or "";
local dis = args.d or args.display or "";
local prf = args.p or "<br><span style=color:#69F>✦ </span>"; -- 'list' item
for _, v in ipairs(args) do
if v ~= '' then
table.insert(otab, frame:expandTemplate{ title = "F", args = {v, "", dis, opt, p= pf } });
end
end
return table.concat (otab)
end
-- for Template:Attribs
function p.attribs (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local tp = args.type or "SVG"; -- needs check
local un = args.by or args.U or args.u or "";
local f = args.f or "";
local t = args.t or "";
local vx = "";
local ux = "";
local ft = "";
local tt = "";
for _, v in ipairs(args) do
if vx == "" then -- the 2nd 'v' can be empty
vx = mw.text.trim( v );
else
ux = mw.text.trim( v );
if ux == "" then ux = un end; -- does not work otherwise (?)
ft = f;
tt = t or ft;
table.insert(otab, frame:expandTemplate{ title = "Attrib", args = {vx, ux, "-", tp, ux, ux, tt, ft } });
vx = "";
end
end
return table.concat (otab)
end
-- for Template:Legend-table
function p.legendt (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local lg = args.lang or "";
local v1 = ""
for _, v in ipairs(args) do
if v1 == "" then
v1 = v;
else
table.insert(otab, frame:expandTemplate{ title = "Legend", args = { lang = lg, v1, v } });
v1 = "";
end
end
return table.concat (otab)
end
-- for Template:ColorString (Igen/cbox)
function p.colorbox (frame)
local args = mw.getCurrentFrame(): getParent().args;
local otab = {};
local lg = args.lang or "{{PAGELANGUAGE}}"; --
local v1 = ""
local p2 = ""
for i, v in ipairs(args) do
if i <= 2 then
p2 = v;
else
if v1 == "" then
v1 = mw.text.trim( v );
else
table.insert(otab, frame:expandTemplate{ title = "Igen/cbox", args = { v1, v, p2, lang = lg } });
v1 = "";
end
end
end
return table.concat (otab)
end
return p;