Modul:SMW: Unterschied zwischen den Versionen

Aus FürthWiki

(uniFilter() optimiert)
(ask() + Rückformen ["?..."]="..." zu "?...=...")
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


local com = require("Modul:Common")
local com = require("Modul:Common")
local dev = require("Modul:Development")
local str = require("Modul:String")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local atr = require("Modul:Attribut")


function p.GetValues(frame)
function p.GetValues(frame)
Zeile 135: Zeile 138:
end
end
end
end
end
function p.Ask(frame)
-- Kommandozeile zum Debuggen:
-- p.Ask{pargs={" a "," ? b "," ? c1 # c2 "," ? d1 # d2 = d3 "," ? e1 = e3 ", " ? Ehemals ", " ? Ehemals = Test ", " ? Ehemals # tick ", " ? Ehemals # tick = Test", " ? Ehemals # tick =", Klasse="Straße"}}
local frame, pargs = dev.GetFrameAndParentArgs(frame)
local args = com.shallowcopy(pargs)
return p.ask(frame, args)
end
function p.ask(frame, args)
local t = ""
-- defaults setzen
if args.format == nil or args.format == "table" then
args.headers = args.headers or "plain"
-- args.class = args.class or "wikitable sortable"
end
-- args.sep = args.sep or ", "
-- Klasse extrahieren
local klasse = args["Klasse"]
args["Klasse"] = nil
-- newlines und Leerzeichen an Anfang/Ende ausfiltern
for i, _ in ipairs(args) do
args[i] = str.strip(string.gsub(args[i], "\n", ""))
end
-- Rückformen ["?..."]="..." zu "?...=..."
args_temp = com.shallowcopy(args)
for i, a in pairs(args) do
if string.sub(i, 1, 1) == "?" then
table.insert(args_temp, i .. "=" .. a) -- ["?..."]="..." durch "?...=..." ersetzen
args_temp[i] = nil
end
end
args = args_temp
-- query-args aufbereiten
for i, _ in ipairs(args) do
if string.sub(args[i], 1, 1) == "?" then
-- aufteilen in  ?attr#format=attr_text
local a = string.sub(args[i], 2)
a = str.split(a, "=")
local attr_text = a[2]
a = str.split(a[1], "#")
local format = a[2]
local attr = str.strip(a[1])
-- Attribute des Attributs attr abfragen
attr_attr = atr.getAttrAttributes(attr, klasse)
if attr_attr ~= nil then
format = format or attr_attr["Anzeigeformat"] -- Anzeigeformat übernehmen
if attr_text == "Mehrzahl" then -- Schlüsselwort "Mehrzahl"
attr_text = attr_attr["Mehrzahl"] -- Anzeigetext Mehrzahl übernehmen
else
attr_text = attr_text or attr_attr["Einzahl"] -- Anzeigetext Einzahl übernehmen
end
end
-- jetzt wieder alles zusammenbauen ?...#...=...
local query = "?" .. attr
if format ~= nil then
query = query .. "#" .. str.strip(format)
end
if attr_text ~= nil then
query = query .. "=" .. str.strip(attr_text)
end
args[i] = query
end
end
-- nun #ask final aufrufen
-- mw.logObject(args, "args")
t = t .. frame:callParserFunction("#ask", args)
return t
end
end


return p
return p

Aktuelle Version vom 12. Februar 2026, 19:24 Uhr

Dieses Modul enthält Semantic Mediawiki Funktionen.

getValues() / GetValues()

  • lua: getValues(page, attr, plain) gibt Werte des Attributs attr der Seite page (immer) als table mit Strings zurück.
  • Wikitext: GetValues(frame) gibt Werte des Attributs attr der Seite page als durch Semikolon (optional anderen Wert) getrennte Werte als String zurück.

Die Funktion GetValues() ist ähnlich {{#show}}, welches aber leider nur durch Komma getrennte Werte zurückgibt. Das ist ein Problem, denn in diesem Wiki werden Werte durch Semikolon getrennt da das Komma in allen Formularen als Satzzeichen gehandhabt wird.

Parameter

Variable Beschreibung Typ Required/Optional Default
page Seite, auf welcher sich das Attribut befindet string required
attr Name des Attributs, welches ausgelesen werden soll string required
sep Separator (nur bei GetValues()) string optional, default=";"
plain Nur-Text-Flag. Rückgabe-Wert ohne HTML. boolean optional, default=false

Test

lua Wikitext Ergebnis
getValues("Rathaus", "StraßeHnr") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=StraßeHnr}}- -Königstraße 86;Königstraße 88-
getValues("Rathaus", "BlaBla") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=BlaBla}}- -- (lua:nil bzw. Wiki:"nix")
getValues("Rathaus", "Bahnlinie") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=Bahnlinie}}- -- (lua:nil bzw. Wiki:"nix")
getValues("RathausBlaBla", "StraßeHnr") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=RathausBlaBla|attr=StraßeHnr}}- -- (lua:nil bzw. Wiki:"nix")
getValues("Rathaus", "Hausnummer") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=Hausnummer}}- -86;88-
getValues("Rathaus", "Seite") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=Seite}}- -Rathaus-
getValues("Rathaus", "Seite", true) -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=Seite|plain=Ja}}- -Rathaus-
getValues("Rathaus", "StraßeHnr") -{{#invoke:{{#replace:{{PAGENAME}}|/Doku|}}|GetValues|page=Rathaus|attr=StraßeHnr}}- -Königstraße 86;Königstraße 88-

getPages()

Gibt Seiten von der Query query als table zurück.

Parameter

Variable Beschreibung Typ Required/Optional Default
query Abfrage string required
plain Nur-Text-Flag. Rückgabe-Wert ohne HTML. boolean optional, default=false

uniFilter() / UniFilter()

Gibt für eine Attribut-Query einen universellen Filter zurück. Der Suchbegriff wird gesucht:

  1. als Ganzes
  2. als Volltextsuche
  3. wenn Semikolons vorhanden, dann außerdem als Liste von Einzelbegriffen
  4. wenn Suchtext leer, Vorhandensein irgendeines Wortes

Beispiele:

  • {{#invoke:SMW|UniFilter|Wort1}} bzw. uniFilter("Wort1") ergibt ~*wort1*||wort1||~*Wort1*||Wort1
  • {{#invoke:SMW|UniFilter|Wort1 Wort2 Wort3}} bzw. uniFilter("Wort1 Wort2 Wort3") ergibt ~*wort1 Wort2 Wort3*||wort1 Wort2 Wort3||~*Wort1 Wort2 Wort3*||Wort1 Wort2 Wort3
  • {{#invoke:SMW|UniFilter|Wort1;Wort2;Wort3}} bzw. uniFilter("Wort1;Wort2;Wort3") ergibt ~*wort1;Wort2;Wort3*||wort1;Wort2;Wort3||~*Wort1;Wort2;Wort3*||Wort1;Wort2;Wort3||~*wort1*||wort1||~*Wort1*||Wort1||~*wort2*||wort2||~*Wort2*||Wort2||~*wort3*||wort3||~*Wort3*||Wort3
  • {{#invoke:SMW|UniFilter|Wort1;Wort2;}} bzw. uniFilter("Wort1;Wort2;") ergibt ~*wort1;Wort2;*||wort1;Wort2;||~*Wort1;Wort2;*||Wort1;Wort2;||~*wort1*||wort1||~*Wort1*||Wort1||~*wort2*||wort2||~*Wort2*||Wort2
  • {{#invoke:SMW|UniFilter|Wort1;;Wort3}} bzw. uniFilter("Wort1;;Wort3") ergibt ~*wort1;;Wort3*||wort1;;Wort3||~*Wort1;;Wort3*||Wort1;;Wort3||~*wort1*||wort1||~*Wort1*||Wort1||~*wort3*||wort3||~*Wort3*||Wort3
  • {{#invoke:SMW|UniFilter|Wort1; ;Wort3}} bzw. uniFilter("Wort1; ;Wort3") ergibt ~*wort1; ;Wort3*||wort1; ;Wort3||~*Wort1; ;Wort3*||Wort1; ;Wort3||~*wort1*||wort1||~*Wort1*||Wort1||~*wort3*||wort3||~*Wort3*||Wort3
  • {{#invoke:SMW|UniFilter|Wort1;Wort2 Wort3}} bzw. uniFilter("Wort1;Wort2 Wort3") ergibt ~*wort1;Wort2 Wort3*||wort1;Wort2 Wort3||~*Wort1;Wort2 Wort3*||Wort1;Wort2 Wort3||~*wort1*||wort1||~*Wort1*||Wort1||~*wort2 Wort3*||wort2 Wort3||~*Wort2 Wort3*||Wort2 Wort3
  • {{#invoke:SMW|UniFilter| Wort1 ; Wort2 ; Wort3 }} bzw. uniFilter(" Wort1 ; Wort2 ; Wort3 ") ergibt ~*wort1 ; Wort2 ; Wort3*||wort1 ; Wort2 ; Wort3||~*Wort1 ; Wort2 ; Wort3*||Wort1 ; Wort2 ; Wort3||~*wort1*||wort1||~*Wort1*||Wort1||~*wort2*||wort2||~*Wort2*||Wort2||~*wort3*||wort3||~*Wort3*||Wort3
  • {{#invoke:SMW|UniFilter|}} bzw. uniFilter("") ergibt
  • {{#invoke:SMW|UniFilter}} ergibt

dateLastDayCompleter()

Vervollständigt ein unvollständiges Abfrage-bis-Datum zu entweder dem letzten des Monats oder des Jahres.

Anwendung: Wenn man im Formular z.B. von 2020 bis 2020 einträgt, dann wird bis 31.12.2020 gesucht.

Unterseiten

Siehe auch


local p = {}

local com = require("Modul:Common")
local dev = require("Modul:Development")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local atr = require("Modul:Attribut")

function p.GetValues(frame)
	-- Gets the values from an attribute on a page to be called from Wikitext by #invoke
--	mw.log("GetValues(frame)")
--	mw.logObject(frame)
	local page = frame.args.page or ""
	local attr = frame.args.attr or ""
	local sep = frame.args.sep or ";"
	local plain = frame.args.plain or false

	local values = p.getValues(page, attr, plain)
	local vallist = table.concat(values, sep)
--	mw.logObject(vallist)
	return vallist
end

function p.getValues(page, attr, plain)
	-- Gets the values from an attribute on a page to be called inside lua
--	mw.log("getValues(" .. page .. ", " ..  attr .. ", " ..  tostring(plain) .. ")")
	local query = "[[:" .. page .."]]|?" .. attr -- selektiert nur die Seite selbst
	if plain then
		query = query .. "#-"
	end
	query = query  .. "|mainlabel=-|limit=1"
	
	local ask_result = mw.smw.ask(query)
	local values = {}
	if not com.isEmpty(ask_result) then
		values = ask_result[1][attr] -- Erste Ergebnis-Zeile, attr-Spalte
		if type(values) ~= "table" then -- Immer als table rückgeben, auch wenn keine (dann umformen)
			values = { [1]=values }
		end
	end
--	mw.logObject(values)
	return values
end

function p.getPages(query, plain)
--	mw.log("getPages(" .. query .. ", " ..  tostring(plain) .. ")")
	if plain then
		query = query .. "|?#-"
	end
	query = query .. "|mainlabel=-"

	local ask_result = mw.smw.ask(query)
	local values = {}
	if not com.isEmpty(ask_result) then
		for _, v  in pairs(ask_result) do
			table.insert(values, v[1]) -- jede Zeile, 1. Spalte
		end
	end
--	mw.logObject(values)
	return values
end

function p.UniFilter(frame)
--	mw.log("UniFilter(frame)")
--	mw.logObject(frame)
	local suchtext = frame.args[1] or ""
	local filter = p.uniFilter(suchtext)
--	mw.log(filter)
	return filter
end

function p.uniFilter(suchtext)
--	mw.log("uniFilter(" .. suchtext .. ")")
	local filter = ""
	if not com.isEmpty(suchtext) and type(suchtext) ~= "table" then
		suchtext = tostring(suchtext)											-- Suchtext bereinigen
		suchtext = string.gsub(suchtext, "%[", "")								-- Link-Klammern rauslöschen
		suchtext = string.gsub(suchtext, "%]", "")
		suchtext = string.gsub(suchtext, "|", " ")
		suchtext = str.strip(suchtext)
		if suchtext == "*" or suchtext == "" then								-- Filter irgendein Wert
			filter = "+"
		else
			filter = uniFilterAddGrossKlein(suchtext)							-- Suchtext in Gänze
			local suchtext = str.splitAndStrip(suchtext, ";")					-- Suchbegriffsliste hinzufügen
			if #suchtext > 1 then
				for _, st in ipairs(suchtext) do
					filter = filter .. "||" .. uniFilterAddGrossKlein(st)
				end
			end
		end
	end
--	mw.log(filter)
	return filter
end

function uniFilterAddGrossKlein(suchtext)
	local filter = ""
		suchtext =																-- zuerst klein geschrieben
			string.lower(string.sub(suchtext, 1, 1)) .. string.sub(suchtext, 2)
		filter = filter ..
			"~*" .. suchtext .. "*" .. "||" .. suchtext
		local suchtext_gross =													-- dann groß geschrieben
			string.upper(string.sub(suchtext, 1, 1)) .. string.sub(suchtext, 2)
		if suchtext_gross ~= suchtext then
			filter = filter ..
				"||~*" .. suchtext_gross .. "*" .. "||" .. suchtext_gross
		end
	return filter
end

function p.subobjectIdCleaner(id)
	local id_clean = ""
	for i = 1, mw.ustring.len(id) do
		local char = mw.ustring.sub(id, i, i)
		if char == "." then
			id_clean = id_clean .. "_"
		else
			id_clean = id_clean .. char
		end
	end
	return id_clean
end

function p.addAttrToList(attrlist, attr, val)
	-- Kommandozeile zum Debuggen:
	-- attrlist={["t"]={"1","2"}}; p.addAttrToList(attrlist, "t", {"3", "4"}); mw.logObject(attrlist)
	if val ~= nil then
		if type(val) ~= "table" then
			val = {val}
		end
		if attrlist[attr] == nil then
			attrlist[attr] = val
		else
			for _, v in ipairs(val) do
				table.insert(attrlist[attr], v)
			end
		end
	end
end

function p.Ask(frame)
	-- Kommandozeile zum Debuggen:
	-- p.Ask{pargs={" a "," ? b "," ? c1 # c2 "," ? d1 # d2 = d3 "," ? e1 = e3 ", " ? Ehemals ", " ? Ehemals = Test ", " ? Ehemals # tick ", " ? Ehemals # tick = Test", " ? Ehemals # tick =", Klasse="Straße"}}
	local frame, pargs = dev.GetFrameAndParentArgs(frame)
	local args = com.shallowcopy(pargs)
	return p.ask(frame, args)
end

function p.ask(frame, args)
	local t = ""
	-- defaults setzen
	if args.format == nil or args.format == "table" then
		args.headers = args.headers or "plain"
--		args.class = args.class or "wikitable sortable"
	end
--	args.sep = args.sep or ", "
	-- Klasse extrahieren
	local klasse = args["Klasse"]
	args["Klasse"] = nil
	-- newlines und Leerzeichen an Anfang/Ende ausfiltern
	for i, _ in ipairs(args) do
		args[i] = str.strip(string.gsub(args[i], "\n", ""))
	end
	-- Rückformen ["?..."]="..." zu "?...=..."
	args_temp = com.shallowcopy(args)
	for i, a in pairs(args) do
		if string.sub(i, 1, 1) == "?" then
			table.insert(args_temp, i .. "=" .. a)								-- ["?..."]="..." durch "?...=..." ersetzen
			args_temp[i] = nil
		end
	end
	args = args_temp
	-- query-args aufbereiten
	for i, _ in ipairs(args) do
		if string.sub(args[i], 1, 1) == "?" then
			-- aufteilen in  ?attr#format=attr_text
			local a = string.sub(args[i], 2)
			a = str.split(a, "=")
			local attr_text = a[2]
			a = str.split(a[1], "#")
			local format = a[2]
			local attr = str.strip(a[1])
			-- Attribute des Attributs attr abfragen
			attr_attr = atr.getAttrAttributes(attr, klasse)
			if attr_attr ~= nil then
				format = format or attr_attr["Anzeigeformat"]					-- Anzeigeformat übernehmen
				if attr_text == "Mehrzahl" then									-- Schlüsselwort "Mehrzahl"
					attr_text = attr_attr["Mehrzahl"]							-- Anzeigetext Mehrzahl übernehmen
				else
					attr_text = attr_text or attr_attr["Einzahl"]				-- Anzeigetext Einzahl übernehmen
				end
			end
			-- jetzt wieder alles zusammenbauen ?...#...=...
			local query = "?" .. attr
			if format ~= nil then
				query = query .. "#" .. str.strip(format)
			end
			if attr_text ~= nil then
				query = query .. "=" .. str.strip(attr_text)
			end
			args[i] = query
		end
	end
	-- nun #ask final aufrufen
--	mw.logObject(args, "args")
	t = t .. frame:callParserFunction("#ask", args)
	return t
end

return p