Module:Igenmod

From MicroWiki, the free micronational encyclopædia
Jump to navigation Jump to search
local p = {}
-----------------------------------------------------------------------

-- get workdate via "Module:File" 
function p.wrkdate ( )
	local str = mw.getCurrentFrame():preprocess('{{REVISIONTIMESTAMP}}')
	return str:sub(1,4) .. '-' .. str:sub(5,6) .. '-' .. str:sub(7,8)
end -- end function wrkDate

-- invert the workdate (for a descending sortkey)
function p.invdate ()
	local invt = ""
	local wdat = p.wrkdate () or  "2020-00-00"	
	invt = string.format ( "%.4u" , 2030 - tonumber ( string.sub ( wdat, 1, 4 )) )
	invt = invt .. string.format ( "%.2u" , 12 - tonumber ( string.sub ( wdat, 6, 7 )) )
	invt = invt .. string.format ( "%.2u" , 31 - tonumber ( string.sub ( wdat, 9, 10 )) )
	return invt
end -- end function invDate

-- get extension text (uppercased) 
function p.exttext ( )
	local page = mw.title.getCurrentTitle().text;
	local ptab = mw.text.split(page , '.', true)
	return		 mw.ustring.upper( table.concat(ptab, '', #ptab  ) )
end -- end function extText

-- get extension code: "s" for SVG,  "n" for anything else
function p.extcode ( )
	if p.exttext () == "SVG"
		then return "s"
		else return "n"
	end
end -- end function extCode

-- get default tag: "v" for SVG,  "n" for anything else
function p.default ( )
	if p.exttext () == "SVG"
		then return "v"
		else return "n"
	end
end -- end function default

-- get unspec tag: "" for SVG,  "n" for anything else
function p.unspec ( )
	if p.exttext () ~= "SVG"
		then return "n"
	end
end -- end function unspec

-- replace a final dot
function p.dotrepl ( frame )
	local lpar = frame.args
	local strg = mw.text.trim( lpar[1] or '' )
	local repl = mw.text.trim( lpar[2] or '' )
	if mw.ustring.sub(strg, #strg) == "." then
		strg = mw.ustring.sub(strg, 1, #strg-1) .. repl
	end
	return strg
end -- function dotrepl

-- invert the workdate, for a descending sortkey
function p.sortkey ()
	local invt = ""
	local wdat = p.wrkdate () or  "2020-00-00"	
	invt = string.format ( "%.4u" , 2030 - tonumber ( string.sub ( wdat, 1, 4 )) )
	invt = invt .. string.format ( "%.2u" , 12 - tonumber ( string.sub ( wdat, 6, 7 )) )
	invt = invt .. string.format ( "%.2u" , 31 - tonumber ( string.sub ( wdat, 9, 10 )) )
	return invt
end -- end function sortKey

-- get categ:sub: "SVG" for SVG,  "PNG" for anything else
function p.categ ( )
	if p.exttext () == "SVG"
		then return "SVG"
		else return "PNG"
	end
end -- end function categ

-- function: changes #/*/:/;  to \35/\42/\58/\59 
function p.subst ( frame )
	local gpar = frame.args
	local char = mw.text.trim ( gpar[1] )
	if		mw.ustring.sub ( char, 1, 1 ) == '#' then 
		return '#' .. mw.ustring.sub( char, 2, #char );
	elseif	mw.ustring.sub ( char, 1, 1 ) == '*' then 
		return '*' .. mw.ustring.sub( char, 2, #char );
	elseif	mw.ustring.sub ( char, 1, 1 ) == ':' then 
		return ':' .. mw.ustring.sub( char, 2, #char );
	elseif	mw.ustring.sub ( char, 1, 1 ) == ';' then 
		return '&#59;' .. mw.ustring.sub( char, 2, #char );
	else
		return char;
	end
end -- end function subst

--  replace slash by pipe
function p.gsubst (frame)
	local frmp = frame.args
	return  mw.ustring.gsub( frmp[1], "/" , "|" ),_;			-- replace slash by pipe 
end	-- function gsubst
 
function p.catsort (frame)
	local frmp = frame.args
	local strg = frmp [1] or " "
	strg = mw.ustring.gsub( strg, "/" , "|" ),_;				-- replace slash by pipe 
	strg = mw.ustring.gsub( strg, "[\n]" , "]]\n[[Category:" );	-- replace lfeed by Cat
	return strg
end	-- function catsort

-- function textsplit (for Colorbox and COAInf.)
function p.split ( frame )
	local lpar   = frame.args
	local parstr = mw.text.trim( lpar[1] ) or 'xx/yy/zz'; 
	local tmplte = mw.text.trim( lpar[2] or 'Igen/cbx' );  -- or 'Igen/coa'
	local argtab = mw.text.split( parstr, "/" );
--  for (trim loop) ?
	return mw.getCurrentFrame(): expandTemplate { title = tmplte, args = argtab };
end

-- function cmdsplit
function p.c_split ( frame )
	local lpar   = frame.args
	local tmplte = mw.text.trim( lpar[1] or '!' );
	local parstr = mw.text.trim( lpar[2] ) or 'xx/yy/zz'; 
	local argtab = mw.text.split( parstr, '/', true );
	local indx = 1;
	local splt = {};
	local ppar = {}
	for i, v in ipairs(lpar) do
		if v ~= nil and lpar [i+2] ~= nil then
			splt = mw.text.split( lpar [i+2], '/', true )
			if splt [2] == nil then
				indx = indx + 1
				ppar [indx] = splt [1]
			else
				splt [1] = mw.text.trim( splt[1] or 'a' )
				splt [2] = mw.text.trim( splt[2] or 'b' )
				local xxx = splt [1]
				ppar [splt [1]] = splt [2]
--				indx = indx + 1
--				ppar [indx] = splt [2] .. splt [1]
			end
		end
	end	
	local cmdtab = {}
	for v = 1, #argtab do
		ppar [1] = mw.text.trim( argtab [v] )
		table.insert( cmdtab, frame:expandTemplate{ title = tmplte,  args = ppar } );
	end
 	return  table.concat (cmdtab)
end -- function c_split

-- function textsplit (for geo locations, with wrong "?")
function p.g_split ( frame )
	local lpar   = frame.args
	local parstr = mw.ustring.gsub( mw.text.trim( lpar[1] ), '?', '″', 2 ) or 'xx/yy/zz';
	local tmplte = mw.text.trim( lpar[2] or 'Location' );  -- or 'Object location'
	local argtab = mw.text.split( parstr, "/" );
--  for (trim loop) ?
	return mw.getCurrentFrame(): expandTemplate { title = tmplte, args = argtab };
end -- function g_split

-- function textsplit (for parameter names, with equal signs)
function p.q_split ( frame )
	local lpar   = frame.args
	local parstr = mw.text.trim( lpar[1] ) or ' '; 
	local tmplte = mw.text.trim( lpar[2] ) or 'Igen';  -- 
	local outtab = {};
	local parind = 0;
	local argtab = mw.text.split( parstr, "/" );	-- becomes "|"

	for i, v in ipairs(argtab) do
	--	if v ~= '' then
			v	= mw.ustring.gsub( v, "¦" , "/" ),_;	-- repl brokenbar by slash
			local fpos = mw.ustring.find( v, '~' );		-- "~" becomes "="
			if fpos == nil then
				if v ~= '+' then			
					parind = parind + 1;
					outtab [ parind ] =  v;				-- positional
				end
			else
				if '+' ~=  mw.ustring.sub ( v, fpos+1 ) then			
					outtab [ mw.ustring.sub ( v, 1, fpos-1 ) ] =  mw.ustring.sub ( v, fpos+1 );
				end
			end
	--	end
	end	
	if tmplte ~= 'Igen/coa'  then
		table.insert( outtab, '+' )				-- re_insert the "+"
	end
	return mw.getCurrentFrame(): expandTemplate { title = tmplte, args = outtab };
end -- function q_split


-- function t_split: 1 parm "templte/p1/p2/.." 
function p.t_split ( frame )
	local lpar   = frame.args
	local parstr = mw.text.trim( lpar[1] ) or 'xx/yy/zz'; 
	local argtab = mw.text.split( parstr, "/" );
	local tmplte = mw.text.trim( table.remove ( argtab, 1 ) );
--  for (trim loop) ?
	return mw.getCurrentFrame(): expandTemplate { title = tmplte, args = argtab };
end -- function t_split

-- global function with 1 parm: can remove special prefixes 
--	 the pairs [], <>, (), {} 
--	doubles as <<, .., ((, &&  but of course ''not''  [[ and {{
function p.remprf ( frame )
	local lpar = frame.args;
	if  mw.ustring.sub (lpar[1], 1, 2) == '[]'
	 or mw.ustring.sub (lpar[1], 1, 2) == '<>'
	 or mw.ustring.sub (lpar[1], 1, 2) == '()'
	 or mw.ustring.sub (lpar[1], 1, 2) == '{}'
	 or mw.ustring.sub (lpar[1], 1, 1) == mw.ustring.sub (lpar[1], 2, 2) 
	and mw.ustring.sub (lpar[1], 1, 2) ~= '[['
	and mw.ustring.sub (lpar[1], 1, 2) ~= '{{' then
		return mw.ustring.sub (lpar[1], 3 )		--  remove that prefix
	else
		return lpar[1]
	end
end -- function remprf

-- global function with 1 parm: remove any 2-byte prefix
function p.rem2bp ( frame )
	local lpar = frame.args;
	return mw.ustring.sub (lpar[1], 3 )
end -- function rem2bp

-- check whether it is a new Inkscape file
function p.inkscape ( frame )
	local otab = {}
	if p.exttext () ~= "SVG" then
		table.insert(otab, frame:expandTemplate{ title = "=", args = {" "} } );
	else 
		local cat = "Unspec New SVG created with Inkscape"
		local key = "{{padleft:{{#expr:{{CURRENTYEAR}}  -{{REVISIONYEAR}}}}|2|0}}"
		key = key .."{{padleft:{{#expr:{{CURRENTMONTH2}}-{{REVISIONMONTH}}}}|2|0}}"
		key = key .."{{padleft:{{#expr:{{CURRENTDAY2}}  -{{REVISIONDAY2}}}}|2|0}}"
		table.insert(otab, frame:expandTemplate{ title = "Igen/cat", args = {cat, key } });
	end
	return  table.concat (otab);
end -- end function inkscape
 
----------------------- TEST ------------------------------------------

-- check whether it is a new Inkscape file
function p.newscape ( frame )
	local otab = {}
	if p.exttext () ~= "SVG" then
		table.insert(otab, frame:expandTemplate{ title = "=", args = {" "} } );
	else 
		local wdat = p.wrkdate () or "2020-00-00"
		local sdat = mw.getCurrentFrame():callParserFunction( "#time", { 'Y-m-d', datestr} ) or "2020-08"
		if  mw.ustring.sub (wdat, 1, 7) == mw.ustring.sub (sdat, 1, 7) then
			local cat = "Unspec new SVG created with Inkscape"
			local key = string.format ( "%.4u" , 2030 - tonumber ( string.sub ( wdat, 1, 4 )) )
			key = key .. string.format ( "%.2u" ,   12 - tonumber ( string.sub ( wdat, 6, 7 )) )
			key = key .. string.format ( "%.2u" ,   31 - tonumber ( string.sub ( wdat, 9,10 )) )
			table.insert(otab, frame:expandTemplate{ title = "Igen/cat", args = {cat, key } });
			
--			local msg = " Template [[Template:Inkscape|{{Inkscape}}]] without W3C-specification is deprecated ! " 
--			table.insert(otab, frame:expandTemplate{ title = "error", args = {msg} } );
		else
			table.insert(otab, frame:expandTemplate{ title = "=", args = {" "} } );
--			table.insert(otab, frame:expandTemplate{ title = "=", args = {wdat..sdat} } ); -- test output
		end
	end
	return  table.concat (otab);
end -- end function newscape


-- function: invert date 
function p.invtest ( frame )
	local gpar = frame.args
	local wdat = mw.text.trim ( gpar[1] ) or '2020-00-00'
--	local leng = tonumber ( gpar[2] ) or 7
	local sdat = mw.getCurrentFrame():callParserFunction( "#time", { 'Y-m-d', datestr} ) or "2020-08-30"
	local key =  string.format ( "%.4u" , 2030 - tonumber ( string.sub ( wdat, 1, 4 )) )
	key = key .. string.format ( "%.2u" ,   12 - tonumber ( string.sub ( wdat, 6, 7 )) )
	key = key .. string.format ( "%.2u" ,   31 - tonumber ( string.sub ( wdat, 9,10 )) )
	return key
end -- end function invTest

-- check whether it is a new file
function p.newfile ( frame )
	if p.exttext () ~= "SVG" then
		return "n"
	else 
		local leng = frame [1] or 7;
		local wdat = p.wrkdate () or  "2020-00-00"
		local sdat = mw.getCurrentFrame():callParserFunction( "#time", { 'Y-m-d', datestr} )
		local leng = tonumber ( frame.args[1] or 7 )
		if  mw.ustring.sub (wdat, 1, leng) ~= mw.ustring.sub (sdat, 1, leng)
			then return "s"
			else return "newcat"
		end
	end
end -- end function newFile


function p.cattest (args)
	local categ = mw.ext.cattools

	local category = args[1] or "Category:Igen/top subtemplates"
	local page     = args[2] or "Template:Igen/top:d"
	if  categ.hasPage( category, page )
		then return page .. " ist in category " .. category .. " enthalten"
		else return page .. " gibt es nicht in " .. category .. " !"
	end
end


function p.sysdate ( )
	return os.date (  )
end


function p.compare ( )
	local wdat = p.wrkdate () or  "2020-00-00"	
	local sdat = mw.getCurrentFrame():callParserFunction( "#time", { 'Y-m-d', datestr} )
	return "W="..wdat ..",  S="..sdat.."."
end

-----------------------------------------------------------------------
return p