Module:Galeria
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules
The format parameter
[edit]When none is specified, the module tries to find the best fitting default format. If another display format is wanted it can be specified;
but a wrong format parameter which does not fit to the file name parameters gives troubles.
- 0: no captions, every unnamed parameter specifies a valid file name
- 1: 'showfilename' captions, every unnamed parameter specifies a valid file name
- 2: parameter pairs of file name and caption; when the second value is missing the file name is displayed, with link
- 3: as format 2, but file name captions are displayed without link
Format 0 and 1 may not contain caption parameters; format 2 and 3 can work with a mixture of file names and caption texts.
The file parameters
[edit]Each file to be displayed can be spezified by one, or by two parameters. The chain of files starts of course with a file name; the following parameter can be the caption for the current file, or it specifies the next file name. When such a second parameter is the same as the first one, possibly only differing in case and space/understroke, it is used as a caption for the first parameter. Otherwise every second parameter seeming to be a valid file name is considered to be the next file name, and the first parameter is treated as an unpaired, single file name.
An easy solution is the specification of empty parameters for captions: it signals that the file name should also be used as the caption.
How it works
[edit]This module gets all parameters from the parent template of G, creates the attributes and values, and passes them to the gallery tag.
The mainly invoker is template:{{G}}.
The template G itself does nothing than to invoke this module, it does not specify any own parameters.
The module analyzes these parameters. In special, the unnamed parameter(s) can contain an unlimited number of items.
First of all, the contents of all unnamed parameters are concatenated to one string:
- concatenates all pipe-separated items and separates them by an ACK
- changes also the newline separators to ACK separators.
Then when the parameter for 'format' is not specified, but
- a second parameter exists (after a pipe), and
- the first parameter is preceded by a newline, and
- the second parameter does not specify a file name,
- the first parameter is preceded by a newline, and
- then the format parameter is defaulted to the value "2".
Using the ACK instead of the slash "/" tolerates items containing slashes, as URL web addresses.
For the format 2, pairs of items are built, with possible defaulting of the description item.
Finally the total amount of items is passed to the Template:{{G/layout}}, together with the other parameters.
Because the <gallery>...</gallery>
tag does not support the suppression of the showfilename
option,
two transclusions of the gallery tag are necessary - one with, and the other one without showfilename
.
Helper functions
[edit]The function "converse" gets a size parameter (possible format examples: 100, x260, 200x240 or 150px, x280px, 220x250px)
and returns the widths
and/or the heights
values; the local function "parseval" is used to parse the values.
The function "filename" returns the {{PAGENAME}} without the extension; also " Wellcome X99999999" will be removed.
The function "pagename" can change all understrokes to spaces.
The function "iffile" performs a rough check whether a string can be a valid file name. Depending on a second parameter, it returns either a flag or the file name without extension.
Other main function
[edit]The function 'gallang" is invoked from the template {{Lgallery}} to diplay multilanguage SVG files.
See also
[edit]- Module:Gallery and {{Gallery}}
Code
local p = {}
-- parses the size value
local function parseval ( value, parm2 )
local par = value or ''
local req = parm2 or ''
if par == '' then
return ''
else
if mw.ustring.sub(par, -2) == 'px' then
par = mw.ustring.sub(par, 1, mw.ustring.len(par) -2)
end
local pos = mw.ustring.find(par, 'x');
if req == 'p' then
return par;
elseif req == 'w' then
if pos == nil then
return par;
elseif pos > 1 then
return mw.ustring.sub(par, 1, pos -1);
else
return ''
end
elseif req == 'h' then
if pos == nil then
return '';
else
return mw.ustring.sub(par, pos +1)
end
end
end
end -- function: parseval
-- checks whether the value is text, or the next file
local function iffil ( ftext, optn )
local name = mw.ustring.lower(ftext or '') ; -- trimmed
local fmat = 'x'; -- assume it's text
if mw.ustring.sub ( name or ' ', 1, 1 ) == "*"
or mw.ustring.sub ( name or ' ', 1, 1 ) == "." then
fmat = 'f' -- short code for filename
elseif name ~= "" then
local inx = mw.ustring.find( name .. "\n", "\n" );
name = mw.ustring.sub ( name, 1, inx - 1 );
if mw.ustring.sub (name, -5) == '.tiff' then
name = mw.ustring.sub (name, 1, #name-4)..'tif';
fmat = 'f';
end
if mw.ustring.sub (name, -5) == '.jpeg' then
name = mw.ustring.sub (name, 1, #name-4)..'jpg';
fmat = 'f';
end
if #name > 4 and
mw.ustring.sub (name, -4, -4 ) == '.' then
local map = {svg=1, png=1, jpg=1, gif=1, tif=1, xcf=1, pdf=1};
if map[mw.ustring.sub (name, -3)] then
fmat = "f"; -- it looks like a file name
end
end
end
if optn == 'F' then fmat = mw.ustring.sub (name, 1, #name-4) end
return fmat
end -- function: iffil
-- returns the file name without the .ext
local function namprt ( filnam )
return iffil ( filnam, 'F')
end -- function: namprt
-- changes all occurences of "_" against " "
local function pagnam ( filnam )
return mw.ustring.gsub( filnam or ' ', '_', ' ' ),_
end -- function: pagename
-- prepares the display of the second param
local function disp2nd ( fnam, fmat ) -- depending on parameter 'f'
if iffil ( fnam ) == "f" then
if fmat == '2' then
return "|<div class=\"center\">{{F|" .. fnam .. "}}</div>"
elseif fmat == '4' then
return "|<div class=\"center\">{{F|" .. fnam .."|"..namprt(fnam).."}}</div>"
elseif fmat == '5' then
return "|<div class=\"center\">" .. namprt ( fnam ) .. "</div>"
else
return "|<div class=\"center\">" .. pagnam ( fnam ) .. "</div>"
end
else
return "|<div class=\"center\">" .. fnam .. "</div>"
end
end -- function: disp2nd
-- main function
function p.gallery ( frame )
local ppar = mw.getCurrentFrame():getParent().args;
local tagtab = {};
local instab = {};
local form = ppar.f or ppar.format or "";
local fmat = ppar.f or ppar.format or "2";
local mode = ppar.m or ppar.mode or "";
local insv = "";
local strg = "";
tagtab [1] = "\n";
for _, v in ipairs(ppar) do
v = mw.text.trim (v);
strg = strg .. "\006" .. v -- replace pipe by ACK
end
strg = mw.ustring.gsub( strg, "[\n]" , "\006" ); -- replace CRLF by ACK
--------------------------------
local par2 = ppar[2] or ""
if fmat == "" then -- when format NOT specified
if par2 ~= "" then -- when second parm:
if iffil ( par2 ) == "f" then
fmat = "1" -- default format="1"
else
fmat = "2" -- default format="2"
end
else -- no second parm
fmat = "1"
end
end
--------------------------------
for _, v in ipairs(mw.text.split(strg , "\006") ) do
v = mw.text.trim (v);
local scnd = ""
if fmat == "1" or fmat == "2" or fmat == "3" or fmat == "4" or fmat == "5" then -- param pairs
if insv == "" then -- 1st value
insv = v;
else -- 2nd value:
if iffil ( v ) == "f" then -- it's a filename
if pagnam ( mw.ustring.lower(insv) ) == pagnam ( mw.ustring.lower(v) ) then
table.insert(instab, insv .. disp2nd ( v, fmat ) );
else -- it is the next file name
table.insert(instab, insv .. disp2nd ( insv, fmat ) );
scnd = v;
end
else -- may be a short code
if v == "" or v == "+" then
table.insert(instab, insv .. disp2nd ( insv, fmat ) );
else
table.insert(instab, insv .. disp2nd ( v, '3' ) ); -- just text
end
end
insv = scnd;
end
else -- fmat = 0, 1
table.insert(instab, v ); -- table.insert(instab, fmat fma2 );
end -- if fmat
end -- for
if insv ~= "" then -- last value single?
if fmat == "2" or fmat == "3" then -- make a pair
table.insert(instab, insv .. disp2nd ( insv, fmat ) );
else
table.insert(instab, insv );
end
end
--
for i, v in ipairs( instab ) do
if v == "" or v == "+" then
tagtab [1] = tagtab [1] .. "\n" -- same
else
if v == "*" then
local titl = mw.title.getCurrentTitle();
v = titl.text;
end
if mw.ustring.sub (v, 1, 1) == "." then
local titl = mw.title.getCurrentTitle();
local namp = namprt ( titl.text );
if v == "."
or v == ".p" then v = namp..".png"
elseif v == ".j" then v = namp..".jpg"
elseif v == ".g" then v = namp..".gif"
elseif v == ".s" then v = namp..".svg"
elseif v == ".t" then v = namp..".tif"
else v = namp..v
end
end
tagtab [1] = tagtab [1] .. "\n" .. v -- add parm
end
end
--
--
if mode == 'n' then mode = 'nolines'
elseif mode == 'p' then mode = 'packed'
elseif mode == 'o' then mode = 'packed-overlay'
elseif mode == 'h' then mode = 'packed-hover'
elseif mode == 's' then mode = 'slideshow'
elseif mode == 't' then mode = 'traditional'
end
local wide = ppar.w or ppar.width or ppar.widths or '';
local high = ppar.h or ppar.height or ppar.heights or '';
local disp = ppar.d or ppar.dis or ppar.disp or ppar.display or '';
if wide .. high == '' and disp ~= '' then
wide = parseval (disp, 'w')
high = parseval (disp, 'h')
end
tagtab [2] = mode;
tagtab [3] = ppar.c or ppar.caption or '';
tagtab [4] = ppar.p or ppar.perrow or '';
tagtab [5] = wide;
tagtab [6] = high;
tagtab [7] = ppar.s or ppar.style or '';
tagtab [8] = ppar.a or ppar.attr or ppar.class or '';
-- tagtab [9] = ppar.t or ppar.text or '';
tagtab [10] = fmat;
if fmat == '' then
tagtab [10] = '1'; -- default format
end
if form..wide..mode == '' then
if ppar.m == nil and ppar.mode == nil then -- mode empty ?
tagtab [2] = 'nolines'; -- only when completely missing
end
end
return mw.getCurrentFrame():expandTemplate{ title = "G/layout", args = tagtab };
end -- function gallery
-- main function gallang
function p.gallang ( frame )
local gpar = frame.args;
local temp = '';
if gpar.sw == "y" then temp = "y" end -- and fmat = '0'
local ppar = mw.getCurrentFrame():getParent().args;-- parent parms
local file = ppar.file or mw.title.getCurrentTitle().text or "";
local fmat = ppar.f or ppar.format or "";
local mode = ppar.m or ppar.mode or "";
local wide = ppar.w or ppar.width or "";
local high = ppar.h or ppar.height or "";
if ppar.sw == "y" then
temp = "y"
fmat = "0"
end
local tagt = {};
tagt [1] = "\n";
for _, v in ipairs(ppar) do
v = mw.text.trim (v);
if v ~= '' and file ~= '' then -- add parm
if temp == "y"
then tagt [1] = tagt [1] .. file .. "|lang="..v.."|''Key:'' "..v.."\n"
else tagt [1] = tagt [1] .. file .. "|lang="..v.."|{{LangCapt|"..v.."}}\n"
end
end
end
-- exists param "file" and at least one lang ?
if mode == 'n' then mode = 'nolines'
elseif mode == 'p' then mode = 'packed'
elseif mode == 'o' then mode = 'packed-overlay'
elseif mode == 'h' then mode = 'packed-hover'
elseif mode == 's' then mode = 'slideshow'
elseif mode == 't' then mode = 'traditional'
end
local wide = ppar.w or ppar.width or ppar.widths or '';
local high = ppar.h or ppar.height or ppar.heights or '';
local disp = ppar.d or ppar.dis or ppar.disp or ppar.display or '';
if wide .. high == '' and disp ~= '' then
wide = parseval (disp, 'w')
high = parseval (disp, 'h')
end
tagt [2] = mode;
tagt [3] = ppar.c or ppar.caption or '';
tagt [4] = ppar.p or ppar.perrow or '';
tagt [5] = wide;
tagt [6] = high;
tagt [7] = ppar.s or ppar.style or '';
tagt [8] = ppar.a or ppar.attr or ppar.class or '';
-- tagt [9] = ppar.t or ppar.text or '';
tagt [10]= fmat;
if fmat == '' then
tagt [10] = '1'; -- default format
end
if tagt [1] == '\n' then
return -- empty
else
return mw.getCurrentFrame():expandTemplate{ title = "G/layout", args = tagt };
end
end -- function gallang
-- convert size to width and height
function p.converse (frame)
local gpar = frame.args
return parseval ( gpar[1], gpar [2] );
end
-- remove final "px"
function p.getp (frame)
local gpar = frame.args
return parseval ( gpar[1], "p");
end
function p.getw (frame)
local gpar = frame.args
return parseval ( gpar[1], "w");
end
function p.geth (frame)
local gpar = frame.args
return parseval ( gpar[1], "h");
end
-- change understrokes
function p.pagename (frame )
local gpar = frame.args
return mw.ustring.gsub( gpar[1] or ' ', '_', ' ' ),_
end
-- check whether it can be a filename
function p.iffile ( frame )
local gpar = frame.args
return iffil ( gpar[1], gpar[2] );
end
-- function filename without extension (and the "Wellcome ..." text)
function p.filename ( frame )
local fnam = mw.title.getCurrentTitle().text;
if mw.ustring.sub( fnam, -4 ) == '.jpg'
then fnam = mw.ustring.sub( fnam, 1, #fnam-4 );
local posf = mw.ustring.find( fnam, ' Wellcome' );
if posf
then fnam = mw.ustring.sub( fnam, 1, posf-1 );
end
elseif mw.ustring.sub( fnam, -4, -4 ) == '.'
then fnam = mw.ustring.sub( fnam, 1, #fnam-4 );
elseif mw.ustring.sub( fnam, -5, -5 ) == '.'
then fnam = mw.ustring.sub( fnam, 1, #fnam-5 );
end
return fnam;
end
return p;