
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