Modul:Hilfsfunktionen: Unterschied zwischen den Versionen

Aus GaretienWiki
Zur Navigation springen Zur Suche springen
VolkoV (D | B)
VolkoV (D | B)
 
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
-- Macht einen Trim in Kombination mit dem Entfernen der SMW-Tags
+
-- Macht einen Trim in Kombination mit dem Entfernen der SMW-Tags, verwandelt nils in Strings
 
function robusttrim(s)
 
function robusttrim(s)
 
if s==nil then return '' end
 
if s==nil then return '' end
Zeile 20: Zeile 20:
 
end
 
end
  
-- Parsing einer XML-Antwort von SMW
+
-- Ausgabe einer beliebig geschachtelten Tabelle oder Variable
function parse(xml)
+
-- i muss wegen Rekursion auf "" gesetzt werden
--Lexer
+
function dump(o,i)
local lex={}
+
if type(o)=='table' then
for l1,l2,l3 in mw.ustring.gmatch(xml,'<([/]?)span([^>]*)>([^<]*)') do
+
local tkeys=getSortKeys(o)
if l1=='' then
+
local s='\n'..i..'{ '
table.insert(lex,{t='SO',a=robusttrim(l2)})
+
for _,k in ipairs(tkeys) do
else
+
s=s..'\n'..i..'['..k..']='..dump(o[k],i.."  ")..','
table.insert(lex,{t='SC',a=''})
 
end
 
if l3~='' then
 
table.insert(lex,{t='TX',a=robusttrim(l3)})
 
 
end
 
end
 +
return s..'\n'..i..'}'
 +
else
 +
return tostring(o)
 +
end
 +
end
 +
 +
-- Umwandlung eines Parameters in eine Tabelle, bei nil leer
 +
function noniltable(s)
 +
if s==nil then
 +
return {}
 +
elseif type(s)=="table" then
 +
return s
 +
else
 +
return {s}
 +
end
 +
end
 +
 +
-- Umwandlung eines Parameters in einen String, bei nil leer
 +
function nonilstring(s)
 +
if s==nil then
 +
return ""
 +
else
 +
return s
 +
end
 +
end
 +
 +
--Sortierfunktion, die numerische Werte zuerst, dann Strings sortiert
 +
function sorter(k1, k2)
 +
if(type(k1)~=type(k2)) then
 +
return type(k1)=="number"
 +
end
 +
return k1<k2
 +
end
 +
 +
--gibt einen Iterator für Tabellen mit sortierten keys zurück
 +
--eine optionale mitgegebene Funktion akzeptiert die Werte table,keya,keyb
 +
function spairs(t, order)
 +
    -- collect the keys
 +
    local keys = {}
 +
    for k in pairs(t) do keys[#keys+1] = k end
 +
-- if order function given, sort by it by passing the table and keys a, b,
 +
    -- otherwise just sort the keys
 +
    if order then
 +
        table.sort(keys, function(a,b) return order(t, a, b) end)
 +
    else
 +
        table.sort(keys)
 +
    end
 +
-- return the iterator function
 +
    local i = 0
 +
    return function()
 +
        i = i + 1
 +
        if keys[i] then
 +
            return keys[i], t[keys[i]]
 +
        end
 +
    end
 +
end
 +
 +
 +
--Funktion gibt eine Tabelle mit sortierten Schlüsseln zurück,
 +
--mit der dann in Reihenfolge mittels ipairs über die Tabelle iteriert werden kann
 +
function getSortKeys(o)
 +
local tkeys={}
 +
for k in pairs(o) do
 +
table.insert(tkeys,k)
 
end
 
end
--Parser
+
table.sort(tkeys,sorter)
local rows={}
+
return tkeys
local row={}
+
end
local valg={}
+
 
local val=''
+
--Ausgabe eines Artikels als Link
local level=0
+
function outputlink(artikel)
for k,v in pairs(lex) do
+
local a=mw.text.split(artikel,":",true)[2]
if (v.t=='SO')and(v.a=='class="smw-row"') then
+
if a==nil then
row={}
+
--Hauptnamensraum
level=1
+
a=artikel
elseif (v.t=='SO')and(v.a=='class="smw-field"') then
 
valg={}
 
level=2
 
elseif (v.t=='SO')and(v.a=='class="smw-value"') then
 
val=''
 
level=3
 
end
 
if (v.t=='TX')and(level==3) then
 
val=v.a
 
end
 
if (v.t=='SC')and(level==3) then
 
table.insert(valg,val)
 
level=2
 
elseif (v.t=='SC')and(level==2) then
 
table.insert(row,valg)
 
level=1
 
elseif (v.t=='SC')and(level==1) then
 
table.insert(rows,row)
 
level=0
 
end
 
 
end
 
end
return rows
+
return "[["..artikel.."|"..a.."]]"
 
end
 
end
  
--Ausgabe einer dreifach geschachtelten Tabelle
+
--Ausgabe einer Kategorie zu einem Artikelnamen
function debugLog(rows)
+
function outputkategorie(artikel)
local result=""
+
local a=mw.text.split(artikel,":",true)[2]
for k1,v1 in pairs(rows) do
+
if a==nil then
result=result.."\n "..k1..":("
+
a=artikel
for k2,v2 in pairs(v1) do
 
result=result.."\n  "..k2..":("
 
for k3,v3 in pairs(v2) do
 
result=result.."\n  "..k3..":"..v3..", "
 
end
 
result=result.."\n  ),"
 
end
 
result=result.."\n ),"
 
 
end
 
end
return result
+
return "[[Kategorie:"..a.."]]"
 +
end
 +
 
 +
--Wandelt eine Zahl in einen String mit deutschem Komma um
 +
function tostringd(z)
 +
local s=tostring(z)
 +
s=s:gsub("%.",",")
 +
return s
 
end
 
end

Aktuelle Version vom 16. April 2024, 06:11 Uhr

Dokumentation und Testfälle unter Modul:Hilfsfunktionen/Doku.
-- Macht einen Trim in Kombination mit dem Entfernen der SMW-Tags, verwandelt nils in Strings
function robusttrim(s)
	if s==nil then return '' end
	local p=mw.ustring.gsub(s,'%[%[SMW::on%]%]','')
	p=mw.ustring.gsub(p,'%[%[SMW::off%]%]','')
	return mw.text.trim(p)
end

-- Splittet einen String in einen Array anhand eines Separators
function split(inputstr,sep)
	if sep==nil then sep="%s" end
	local t={}
	local i=1
	for str in mw.ustring.gmatch(inputstr,"([^"..sep.."]+)") do
		t[i]=str
		i=i+1
	end
	if i==1 then t[1]=inputstr end
	return t
end

-- Ausgabe einer beliebig geschachtelten Tabelle oder Variable
-- i muss wegen Rekursion auf "" gesetzt werden
function dump(o,i)
	if type(o)=='table' then
		local tkeys=getSortKeys(o)
		local s='\n'..i..'{ '
		for _,k in ipairs(tkeys) do
			s=s..'\n'..i..'['..k..']='..dump(o[k],i.."   ")..','
		end
		return s..'\n'..i..'}'
	else
		return tostring(o)
	end
end

-- Umwandlung eines Parameters in eine Tabelle, bei nil leer
function noniltable(s)
	if s==nil then
		return {}
	elseif type(s)=="table" then
		return s
	else
		return {s}
	end
end

-- Umwandlung eines Parameters in einen String, bei nil leer
function nonilstring(s)
	if s==nil then
		return ""
	else
		return s
	end
end

--Sortierfunktion, die numerische Werte zuerst, dann Strings sortiert
function sorter(k1, k2)
	if(type(k1)~=type(k2)) then
		return type(k1)=="number"
	end
	return k1<k2
end

--gibt einen Iterator für Tabellen mit sortierten keys zurück
--eine optionale mitgegebene Funktion akzeptiert die Werte table,keya,keyb
function spairs(t, order)
    -- collect the keys
    local keys = {}
    for k in pairs(t) do keys[#keys+1] = k end
	-- if order function given, sort by it by passing the table and keys a, b,
    -- otherwise just sort the keys 
    if order then
        table.sort(keys, function(a,b) return order(t, a, b) end)
    else
        table.sort(keys)
    end
	-- return the iterator function
    local i = 0
    return function()
        i = i + 1
        if keys[i] then
            return keys[i], t[keys[i]]
        end
    end
end


--Funktion gibt eine Tabelle mit sortierten Schlüsseln zurück,
--mit der dann in Reihenfolge mittels ipairs über die Tabelle iteriert werden kann
function getSortKeys(o)
	local tkeys={}
	for k in pairs(o) do
		table.insert(tkeys,k)
	end
	table.sort(tkeys,sorter)
	return tkeys
end

--Ausgabe eines Artikels als Link
function outputlink(artikel)
	local a=mw.text.split(artikel,":",true)[2]
	if a==nil then
		--Hauptnamensraum
		a=artikel
	end
	return "[["..artikel.."|"..a.."]]"
end

--Ausgabe einer Kategorie zu einem Artikelnamen
function outputkategorie(artikel)
	local a=mw.text.split(artikel,":",true)[2]
	if a==nil then
		a=artikel
	end
	return "[[Kategorie:"..a.."]]"
end

--Wandelt eine Zahl in einen String mit deutschem Komma um
function tostringd(z)
	local s=tostring(z)
	s=s:gsub("%.",",")
	return s
end