10 Jahre Stabführer.de
Stabführer.de wird 10 Jahre alt!
Am besten feiert man das mit neuen Informationen. Gesucht werden daher verstärkt fehlenden Daten, interessante Geschichten und alle Arten von Fotos, Dokumente usw., die es wert sind erhalten zu werden. Gern per Email an info@stabfuehrer.de

Modul:Str

Aus Stabführer.de
function escape_lua_regex(str)
	return mw.ustring.gsub(str, ".", {
	    ["%"] = "%%";
	    ["^"] = "%^";
	    ["$"] = "%$";
	    ["."] = "%.";
	    ["("] = "%(";
	    [")"] = "%)";
	    ["["] = "%[";
	    ["]"] = "%]";
	    ["?"] = "%?";
	    ["*"] = "%*";
	    ["+"] = "%+";
	    ["-"] = "%-";
	    ["\0"] = "%z";
  	})
end

local function trim(s)
	s = mw.ustring.gsub(s,"\n","");
	while mw.ustring.sub(s,1,1) == " " do
		s=  mw.ustring.sub(s,2,-1);
	end
	while mw.ustring.sub(s,-1,-1) == " " do
		s=  mw.ustring.sub(s,1,-2);
	end
	return s;
end

local Str = {} 
	function Str.len(frame)
		local s = trim((frame.args[1] or ""));
		return mw.ustring.len(s);
	end
	
	function Str.left(frame)
		local s = trim((frame.args[1] or ""));
		local idx = tonumber(frame.args[2]) or 0;
		if idx < 1 then
			return "";
		end
		return mw.ustring.sub(s,1,idx);
	end
	
	function Str.right(frame)
		local s = trim((frame.args[1] or ""));
		local length = tonumber(frame.args[2]) or 0;
		if length < 1 then
			return ""
		else
			length = -length;
		end
		return mw.ustring.sub(s,length,-1)
	end
	
	function Str.index(frame)
		local s = trim((frame.args[1] or ""));
		local idx = tonumber(frame.args[2]) or 0;
		if idx < 1 then
			return ""
		end
		return mw.ustring.sub(s,idx,idx)
	end
	
	function Str.sub(frame)
		local s = trim((frame.args[1] or ""));
		local von = tonumber(frame.args[2]) or 1;
		local length = tonumber(frame.args[3]) or 0;
		if (von < 1) then
			von = 1
		end
		local bis = von + length - 1
		if (bis < von) then
			return ""
		end
		return mw.ustring.sub(s,von,bis)
	end
	
	function Str.crop(frame)
		local s = trim((frame.args[1] or ""));
		local cut = tonumber(frame.args[2]) or 0;
		local length =  mw.ustring.len(s)
		if cut < 1 then
			return s;
		end
		return mw.ustring.sub(s,1,length - cut)
	end

	function Str.cropleft(frame)
		local s = trim((frame.args[1] or ""));
		local cut = tonumber(frame.args[2]) or 0;
		local length =  mw.ustring.len(s)
		if cut < 1 then
			return s;
		end
		return mw.ustring.sub(s,cut+1,-1);
	end
	
	function Str.find(frame)
		local text = trim((frame.args[1] or ""));
		local pat = frame.args[2] or "";
		if pat == "" then
			return 1
		end
		local idx = mw.ustring.find(text,pat,1,true)
		if idx then
			return idx;
		else
			return -1;
		end
	end
	
	function Str.hex2dez(frame)
		a = tonumber(frame.args[1],16) or 0;
		return a
	end
	
	function Str.match(frame)
		local text = frame.args[1] or ""
		local pattern = frame.args[2] or ""
		local index = tonumber(frame.args[3]) or 0
		if (text == "" or pattern == "") then return "" end
		-- return all captures (denoted by brackets in the pattern) if index is zero, otherwise return only the index-th capture
		if index <= 0 then
			return mw.ustring.match(text, pattern)
		else
			return ({mw.ustring.match(text, pattern)})[index]
		end
	end
	
	function Str.rep(frame)
		local repetitions = tonumber(frame.args[2]) or 0;
		return mw.ustring.rep( frame.args[1] or '', repetitions );
	end
	
	function Str.replace(frame)	
		local text = frame.args[1] or "";      -- Text, der bearbeitet werden soll
		local search = frame.args[2] or "";    -- Textstellen innerhalb von "text" die ersetzt werden sollen
		local replace = frame.args[3] or "";   -- Ersetzungstext
		if text == "" or search == "" then
			return "";
		end 
		local count = tonumber(frame.args[4]) -- Anzahl der Ersetzungen (optional)
		local regexsearch = frame.args[5]     -- beliebiger Wert um dafür zu sorgen, dass der Suchtext "search" als Lua-regulärer Ausdruck behandelt werden soll
		if not regexsearch or regexsearch == "" then
			search = escape_lua_regex(search)
			replace = mw.ustring.gsub(replace, "%%", "%%%%")
		end
		local result
		if count then
			result,_ = mw.ustring.gsub(text, search, replace, count)
		else
			result,_ = mw.ustring.gsub(text, search, replace)
		end
		return result
	end

	-- richtet Zahlen numerisch aus
	function Str.adjustnumber(frame)
		local ausgabe;
		local text  = frame.args[1] or ""      -- Text, der bearbeitet werden soll, i.d.R. eine Dezimalzahl
		local i_li = math.floor(tonumber(frame.args[2])) or 2;     -- maximale Stellen links vom Trennzeichen
		local i_re = math.floor(tonumber(frame.args[3])) or 2;    -- maximale Stellen rechts vom Trennzeichen
		local sign  = frame.args['Z'] or ","   -- Trennzeichen
		local zeroes='00000000000000000000';   -- 20 duerften ausreichen.
		local zpos = 0;
		local len =  mw.ustring.len(text);
		if not text  or sign == "" then
			zpos = len + 1;
		else
			zpos = mw.ustring.find(text, sign,1, true) or len;
		end

		local zl = 0;
		local zr = 0;
		local t_li = "";
		local t_re = "";
		local z_li ="";
		local z_re ="";

		if zpos > 1 then 
			t_li = mw.ustring.sub(text,1, zpos-1);
		else
			t_li="";
		end

		if len-zpos > 0 then 
			t_re = mw.ustring.sub(text,zpos+1,-1);
		else
			t_re="";
		end

		zl = i_li -  mw.ustring.len(t_li);
		if zl < 1 then
			zl = 0;
			z_li = "";
		else
			z_li = '<span style="visibility:hidden;">' .. mw.ustring.sub(zeroes,1,zl) .. '</span>';
		end

		zr = i_re -  mw.ustring.len(t_re);
		if zr < 1 then
			zr = 0;
			z_re ="";
		else
			z_re ='<span style="visibility:hidden;">' ..  mw.ustring.sub(zeroes,1,zr) .. '</span>';
		end
		ausgabe = z_li .. t_li  .. sign .. t_re .. z_re;
		return ausgabe;
	end

-- Konvertierung von Mathe-Minus, Geviert-, Halbgeviert- und Viertelgeviertstrich, sowie U+2012 ins ASCII-Minus.
function Str.minus(frame)
	local s = frame.args[1] or "";
	s = mw.ustring.gsub(s,'−','-'); -- Erstes Zeichen ist U+2212 (Mathe-Minus)
	s = mw.ustring.gsub(s,'‐','-'); -- Erstes Zeichen ist U+2010 (Viertelgeviertstrich)!
	s = mw.ustring.gsub(s,'‒','-'); -- Erstes Zeichen ist U+2012 (Figure dash)!
	s = mw.ustring.gsub(s,'–','-'); -- Erstes Zeichen ist U+2013 (Halbgeviertstrich)!
	s = mw.ustring.gsub(s,'—','-'); -- Erstes Zeichen ist U+2014 (Geviertstrich)!
	return s;
end

-- Die folgende Stringfunktion rundet Zahlen und gibt im Unterschied zu 
-- "round" im Modul FormatNum auch nachfolgende Nullen aus.
--  So wird "1.12" bei drei Nachkommastellen als "1.120" zurückgegeben.
function Str.round(frame)
	local num  = tonumber(frame.args[1] or '') or 'NaN'; -- zu rundende Zahl
	local prec = tonumber(frame.args[2] or '') or 'NaN'; -- Dezimalstellen
	if num == 'NaN' or prec =='NaN' then
		return "NaN";
	end
	prec = math.floor(prec);  
	local out = "";
	local rnd = 10;
	if prec > 0 then
		local fmt = "%." .. tostring(prec) .. "f";
		out = string.format(fmt,num); -- Zahlen haben nur ASCII-Zeichen
	else
		rnd = 10^(-prec);
		num = math.floor(num/rnd + 0.5) * rnd;
		out = string.format("%d",num); -- Zahlen haben nur ASCII-Zeichen
	end
	return out;
end

return Str