Module:Galeria

From NC Commons
Jump to navigation Jump to search

Documentation for this module may be created at Module:Galeria/doc

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

-- 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';
		end
		if mw.ustring.sub (name, -5) == '.jpeg' then 
			name = mw.ustring.sub (name, 1, #name-4)..'jpg';
		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

-- 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 )
	if iffil ( fnam ) == "f" then
		if fmat == '2' then
			return "|<center>{{F|" .. fnam .. "}}</center>"
		else		-- fmat==3
			return "|<center>" .. pagnam ( fnam ) .. "</center>"
		end
	else
		return "|<center>" .. fnam .. "</center>"
	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   = form;
	local mode   = ppar.m or ppar.mode or "";
	local insv   = "";
	local strg   = "";
	tagtab [1]   = "\n";
	
	for _, v in ipairs(ppar) do
		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
		local scnd = ""
		if fmat == "1" or fmat == "2" or fmat == "3" 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 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 "";
	local tagt = {};
	tagt [1]   = "\n";
	
	for _, v in ipairs(ppar) do
		if v ~= '' and file ~= '' then	-- add parm
			tagt [1] = tagt [1] .. file .. "|lang="..v.."|{{LangCapt|"..v.."}}\n"	
		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
	
return p;