Modul:Faktenbox/Tabs

< Modul:Faktenbox
Version vom 3. November 2025, 13:30 Uhr von HeikoBot (Diskussion | Beiträge) (adressenTab_(fbdata) => lua)

Seiten-Übersicht

Zur Klasse Faktenbox gehörende Seiten:
Hauptseite Unterseiten
Allgemein
Faktenbox Vorlagen
Formulare
Module
Abfrage Vorlagen


Formulare


Sonstige


Dieses Modul enthält gemeinsame Funktionen, um eine Faktenbox zu füllen

Funktionen Modul:Faktenbox

Faktenbox()

Universelle Faktenbox ohne Formular/Klasse/Gebäude. Sie kann als zusätzliche Faktenboxen auf einer Seite eingebaut werden ähnlich Vorlage:Tabbox. Sie setzt ebenso Attribute wie die regulären Faktenboxen z.B. von Gebäuden, Straßen, Personen usw.

Funktionen Modul:Faktenbox/Tabs

universalDatenTab()

Universeller Daten-Tab zeigt alle seine übergebenen Parameter außer die für Karte und Bild an.

bildTab()

Selbsterklärend...

benennungenTab()

Tab mit Liste der Benennungen.

tab()

Vervollständigt Tab-Inhalt zu einem Tab.

Funktionen Modul:Faktenbox/Tabs/Karte

kartenTab()

Selbsterklärend...

getKartenArgs()

Karten-Argumente übernehmen und aufbereiten.

Funktionen Modul:Faktenbox/Tabs/Adressen

adressenTab()

Tab mit Liste der Adressen. Die Adressen werden bestmöglich chronologisch aufsteigend sortiert.

p.sortIndex() und p.smwDate2SortIndex()

Erstellen Sortierindizes anhand Datum und Schlüsselwörtern (z.B. Geburtshaus ganz oben) für chronologische Sortierung.

Funktionen Modul:Faktenbox/Zeilen

zeileKategorieSeite()

Diese Zeile ist die oberste Zeile eines Daten-Tabs, welche nochmal den Namen des Objekts und einen Link zur Klassen-Kategorie anzeigt und das Attribut:Seite setzt.

zeileStrasseHnr()

Wie zeile(attr, attrText, val), aber speziell ausgrichtet, um Attribut:Straße, Attribut:Hausnummer, Attribut:StraßeHnr und Attribut:AnzahlGebäude zu setzen und anzuzeigen.

zeileAktenNr()

Wie zeile(attr, attrText, val), aber speziell ausgrichtet, um Attribut:AktenNr zu setzen und anzuzeigen. Die AktenNr werden als Query-Link und mit Seitenanzahl mit dieser AktenNr angezeigt.

zeileGeoDaten()

Zeile um alle Attribut:Geokoordinaten mit OSM-Link und die Attribut:GeoJson-Karte zu anzuzeigen.

zeileDatum()

Zeile um ein Datum standardisiert per linkFormDate() anzuzeigen.

zeileSemantikBrowsenAbfrage()

Zeile mit Link zum semantischen Browsen (Datensicht) und zur Abfrage.

zeile()

Standard-Zeile um ein Attribut zu setzen und anzuzeigen. Wenn es sich beim Attribut-Wert um eine Liste mit mehreren Elementen handelt, wird vom Attribut-Anzeigetext automatisch die Mehrzahl gebildet.

Parameter Beschreibung
attr_name Attribut-Name
attr_text Optionaler Attribut-Anzeigetext. Default: attr_name. Siehe auch attr_text_anzeige
attr_val Attribut-Wert. Wenn nicht übergeben, werden die von der #invoke:-Vorlage übergegebenen Parameter (fbdata.pargs) verwendet.
fbdata fbdata-Daten-table mit von der #invoke:-Vorlage übergegebenen Parameter (fbdata.pargs).
delimiter Trennzeichen bei Werte-Listen. Bei Nicht-Übergabe wird Attribut-Wert auch nicht als Liste behandelt.
val_prefix Attribut-Wert-Prefix z.B. "ca."
val_postfix Attribut-Wert-Postfix z.B. "km"
val_show_only Attribut-Wert nur anzeigen, aber nicht setzen

setPageAttr()

Setzen eines Attributs vom Datentyp Seite in folgender Prüf- und Setzreihenfolge:

  1. Wenn val problematische Wikitext/HTML-Inhalte enthält, dann wird
    • val 1:1 angezeigt und ggf. gerendert (nicht innerhalb [[Attribut::Wert]])
    • Attribut name mit val per {{#set:Attribut=Wert}} unsichtbar im Hintergrund gesetzt, auch wenn das Verarbeitungsfehler provoziert (gewollt)
  2. Ansonsten wenn val als Seite existiert, wird diese 1:1 gesetzt und angezeigt ([[Attribut::Wert]])
  3. Ansonsten wenn val Klammerungen am Anfang oder am Ende enthält (Beispiel: "(BlaBlub) Rathaus (BlaBla)"), wird geprüft, ob eine Seite ohne die Klammerungen (also Rathaus) existiert. Wenn ja, wird "(BlaBlub) Rathaus (BlaBla)" angezeigt und das Attribut mit nur "Rathaus" gesetzt.
  4. Ansonsten wird
    • val 1:1 angezeigt und ggf. gerendert (nicht innerhalb [[Attribut::Wert]])
    • Attribut name mit val per {{#set:Attribut=Wert}} unsichtbar im Hintergrund gesetzt, auch wenn das Verarbeitungsfehler provoziert (gewollt)

setStandardAttr()

Setzen eines Standard-Attributs (nicht Datentyp Seite). Klammerwerte werden optional abgetrennt und Attribut-Wert wird optional nur angezeigt, aber nicht gesetzt.

Funktionen Modul:Faktenbox/Common

common()

Sonstige gemeinsame Dinge anfügen

  • Klasse
  • Formular
  • Kategorien
  • Wartung

fbdata()

Erstellt Faktenbox-Daten-Tabelle.

fbdata-Daten-table

Um die Parameter-Übergabe zu obigen Funktionen zu vereinfachen wird die fbdata-Daten-table verwendet, in der folgende Daten abgelegt werden:

  • fbdata.frame = frame von Faktenbox(frame)
  • fbdata.pargs = frame:getParent().args. Beispiel: fbdata.pargs["Ehemals"] oder fbdata.pargs.Ehemals
  • fbdata.klasse Klassen-table. Beispiel Kirche: fbdata.klasse = {"Kirche", "Gebäude"} ("Kirche" ist primäre und "Gebäude" sekundäre Klasse)
  • fbdata.kategorie Kategorien-table. Beispiel Kirche: fbdata.kategorie = {"Kirchen", "Gebäude"} ("Kirchen" ist primäre und "Gebäude" sekundäre Kategorie)
  • fbdata.kategorie_einzahl Einzahl-Kategorien-table als Alternative zu fbdata.klasse. Beispiel Kirche: fbdata.kategorie_einzahl = {"Kirche", "Gebäude"} ("Kirche" ist primäre und "Gebäude" sekundäre Kategorie)
  • fbdata.formular Formular
  • Pagesnames
    • frame.fullpagename
    • frame.pagename
    • frame.subpagename
  • frame.strasse_hnr Untertabelle für Straße/Hausnummer-Daten
    • frame.strasse_hnr.strasse Untertabelle für Straßen
      • frame.strasse_hnr.strasse.name Straßenname
      • frame.strasse_hnr.strasse.hausnummer Hausnummern-table dieser Straße
      • frame.strasse_hnr.strasse.suspekt Suspekte Formular-Werte dieser Straße
    • frame.strasse_hnr.suspekt Suspekte Formular-Werte aller Straßen
    • frame.strasse_hnr.anzahlGebaeude Anzahl aller gültigen Straße/Hausnummer-Kombinationen
  • Ggf. weitere Klassen-abhängige Einträge

attr_text_anzeige

Sofern kein attr_text angegeben, wird i. A. attr_name angezeigt. Jedoch wird bei manchen attr_name-Attributen stattdessen automatisch die ausgeschriebene Version angezeigt.

Beispiel: Beim Attribut:TeilDesEnsembles wird anhand der table attr_text_anzeige "Teil des Ensembles" angezeigt.

Diese Übersetzung von attr_name zur Anzeige-Version ist in attr_text_anzeige abgelegt und erfolgt global bei allen Faktenboxen.

Unterseiten

Siehe auch


local p = {}

local com = require("Modul:Common")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local que = require("Modul:Queries")
local lfd = require("Modul:LinkFormDatum")

local fab_zeilen = require("Modul:Faktenbox/Zeilen")
local fab_common = require("Modul:Faktenbox/Common")

function p.universalDatenTab_(fbdata)
--	mw.log("datenUniversalTab_(fbdata)")
--	mw.logObject(fbdata)
	-- Konsolenzeile zum Debuggen (Achtung! Bug in Fehlerbereinigungskonsole! Kann nur 1x ausgeführt werden!):
	-- fab=require("Modul:Faktenbox/Work"); fab_common = require("Modul:Faktenbox/Common"); fbdata=fab_common.fbdata_{pargs={lat="Bla", Objekt="Häusle", Test="BlaBla"}}; print(p.datenUniversalDatenTab_(fbdata))
	local t = ""
	local no_show_attr = {
		["Bild"] = true, 
		["lat"] = true,	["lon"] = true,	["location"] = true,["locationlist"] = true, ["geojson"] = true,
		["zoom"] = true, ["popuptitle"] = true, ["popuptext"] = true
	}

	-- Zusammenbau
	t = t .. "<dl class = 'dataTable'>"
	for a, _ in pairs(fbdata.pargs) do
		if not com.isTrue(no_show_attr[a]) then
			t = t .. fab_zeilen.zeile_{attr_name = a, fbdata = fbdata, delimiter = ";"}
		end
	end
	t = t .. "</dl>"
	t = t .. fab_zeilen.zeileSemantikBrowsenAbfrage_(fbdata)

	-- Tab draus machen
	t = p.tab_(t, "Daten")
--	mw.log("t = " .. t)
    return t
end

function p.bildTab_(fbdata, seite)
--	mw.log("bildTab_(fbdata, " .. (seite or "nil") .. ")")
--	mw.logObject(fbdata.pargs)
	-- Konsolenzeile zum Debuggen:
	-- =p.bildTab_{pargs={Bild="Erloeserkirche.jpg"}}
	local t = ""
	local beschreibung = que.getValues("Datei:" .. (fbdata.pargs["Bild"] or ""), "Beschreibung")
	local beschreibung = beschreibung[1] or ""
	if (fbdata.pargs["Bild"] or "") ~= "" and wik.pageExists("Bild:" .. fbdata.pargs["Bild"]) then
		t = t .. '{| class = "factbox_imagetable" border = "0" cellpadding = "0" cellspacing = "0" width = "100%"\n'
		t = t .. '|-\n'
		t = t .. '|[[Bild::Datei:' .. fbdata.pargs["Bild"] .. '|768px|link=' .. (seite or '') .. ']]\n'
		if beschreibung ~= "" then
			t = t .. '|-\n'
			t = t .. '|' .. beschreibung .. '\n'
		end
		t = t .. '|}'
	end
	-- Tab draus machen
	t = p.tab_(t, "Bild")
--	mw.log("t = " .. t)
	return t
end

function p.kartenTab_(fbdata)
--	mw.log("kartenTab_(fbdata)")
--	mw.logObject(fbdata)
	-- Konsolenzeile zum Debuggen:
	-- fab=require("Modul:Faktenbox/Work"); fab_common = require("Modul:Faktenbox/Common"); fbdata=fab_common.fbdata_{pargs={["location"]="Erlanger Straße 11, Fürth, Bayern, Deutschland",Debug="ja"}}; print(p.kartenTab_(fbdata))
	-- fab=require("Modul:Faktenbox/Work"); fab_common = require("Modul:Faktenbox/Common"); fbdata=fab_common.fbdata_{pargs={["Gebäude"]="Erlanger Straße 11;Erlanger Straße 12",Debug="ja"}}; print(p.kartenTab_(fbdata))
	t = ""
	if string.find(fbdata.pagename, ";") ~= nil then
		t = "Semikolon im Artikel-/Seitennamen für korrekte Kartendarstellung nicht erlaubt!"
	else
		local args = {
			lat		= fbdata.pargs["lat"] or "",		location		= fbdata.pargs["location"] or "",
			lon		= fbdata.pargs["lon"] or "",		locationlist	= fbdata.pargs["locationlist"] or "",
			geojson	= fbdata.pargs["geojson"] or "",	zoom			= fbdata.pargs["zoom"] or "18",	-- 18 ist default-zoom
			Debug	= fbdata.pargs["Debug"] or "",
			width	= "",								height			= "",	-- passt sich beides automatisch an die Box an
			box		= "nein",							form			= "ja"	-- keine eigene Box; Seite hat Formular
			}
		-- Wenn kein geojson-Formular-Wert vorgegeben, prüfen,
		-- ob sich hinter der Artikelseite eine gleichnamige GeoJson-Karte versteckt oder
		-- über Formular-Wert GeoJsonKarte eine Karte aktiviert ist
		if args.geojson == "" then
			if wik.pageExists("GeoJson:" .. fbdata.pagename) or com.isTrue(fbdata.pargs["GeoJsonKarte"]) then
				args.geojson = fbdata.pagename
			end
		end
		-- Verwende Geolokation des Gebäudes, sofern vorhanden und wenn keine location oder locationlist übergeben
		if args.location == "" and args.locationlist == "" then
			local gebaeude = str.splitAndStrip(fbdata.pargs["Gebäude"] or "", ";")
			if #gebaeude > 0 then -- Gebäude angegeben?
				args.locationlist = ""
				local first = true
				for _, g in ipairs(gebaeude) do -- alle Gebäude durchiterieren
					local seite = que.getValues(g, "Seite", true)
					if seite[1] ~= fbdata.pagename then -- Weiterleitung auf sich selbst rausfiltern
						local geolokation = que.getValues(g, "Geolokation", true)
						for _, l in ipairs(geolokation) do -- alle Geolokationen eines Gebäudes durchiterieren
							if first then
								first = false
							else
								args.locationlist = args.locationlist .. ";"
							end
							args.locationlist = args.locationlist .. l
						end
					end
				end
			end
		end
		-- Karte-Vorlage einbinden
--		mw.logObject(args)
		if (args.lat ~= "" and args.lon ~= "") or args.location ~= "" or args.locationlist ~= "" or args.geojson ~= "" then
			t = fbdata.frame:expandTemplate{title = "Karte", args = args}
		end
	end
	-- Tab draus machen
	t = p.tab_(t, "Karte")
--	mw.log("t = " .. t)
	return t
end

function p.benennungenTab_(fbdata)
--	mw.log("benennungenTab_()")
--	mw.logObject(fbdata)
	-- Konsolenzeile zum Debuggen:
	-- =p.benennungenTab_({fullpagename="Engelhardtsteg"})
	-- =p.benennungenTab_({fullpagename="Jakob-Henle-Straße"})
	-- =p.benennungenTab_({fullpagename="Eichhornstraße"})
	-- =p.benennungenTab_({fullpagename="Georg-Brandstätter-Straße"})
	local t = ""

	-- DB-Abfrage
	local query = "[[-Has subobject::".. fbdata.fullpagename .. "]][[SubObjektTyp::Benennung]]|?Benennung|?Benennungsdatum|?BenanntNach|?Bemerkung|limit=100"
	local ask_result = mw.smw.ask(query)
--	mw.logObject(ask_result)

	-- Zeilen zusammenbauen
	local first = true
	if ask_result ~= nil then
		for i, z in ipairs(ask_result) do -- Ergebniszeile durchiterieren
			if (z.Benennung or "") ~= "" or (z.BenanntNach or "") ~= "" then
				if first then
					t = t .. "<nowiki></nowiki>\n" -- nötig, warum auch immer, damit erster Listeeintrag richtig gerendert wird
					first = false
				end
				t = t .. "* "
				if z.Benennung ~= nil then
					t = t .. "[[" .. z.Benennung .. "]]"
				end
				if z.Benennung ~= nil and z.BenanntNach ~= nil then
					t = t .. ", "
				end
				if z.BenanntNach ~= nil then
					t = t .. "benannt nach " .. z.BenanntNach
				end
				if z.Benennungsdatum ~= nil then
					t = t .. ", " .. z.Benennungsdatum
				end
				if z.Bemerkung ~= nil then
					t = t .. " (" .. z.Bemerkung .. ")"
				end
				t = t .. "\n"
			end
		end
	end

	-- Tab draus machen
	t = p.tab_(t, "Benennungen")
--	mw.log("t = " .. t)
	return t
end

function p.adressenTab_(fbdata)
--	mw.log("adressenTab_()")
--	mw.logObject(fbdata)
	-- Konsolenzeile zum Debuggen:
	-- =p.adressenTab_({fullpagename="Jakob Bock"})
	-- =p.adressenTab_({fullpagename="Ludwig Erhard"})
	-- =p.adressenTab_({fullpagename="Druck & Kopie Hartmann KG"})
	-- =p.adressenTab_({fullpagename="Rathaus"})
	-- =p.adressenTab_({fullpagename="E-Tankstelle Hochstraße"})
	-- =p.adressenTab_({fullpagename="TestPerson2"})
	local t = ""

	-- Attribute-Liste
	local attr = {
		["Adressart"]	= { querypostfix = "",		default = ""},
		["Straße"] 		= { querypostfix = "#-",	default = ""},
		["Hausnummer"]	= { querypostfix = "",		default = 0},
		["StraßeHnr"]	= { querypostfix = "#-",	default = ""},
		["VonObjekt"]	= { querypostfix = "#-",	default = ""},
		["AdresseVon"]	= { querypostfix = "",		default = ""},
		["AdresseBis"]	= { querypostfix = "",		default = ""},
		["Index"]		= { querypostfix = "",		default = 0} }

	-- DB-Abfrage
	local query = "[[-Has subobject::".. fbdata.fullpagename .. "]][[SubObjektTyp::Adresse]]|?#-|limit=100"
	for i, a in pairs(attr) do
		query = query .. "|?" .. i .. a.querypostfix
	end
	local addresses = mw.smw.ask(query)

	if addresses ~= nil then

		-- defaults fehlender Attribute setzen
		for i, _ in pairs(addresses) do
			for j, a in pairs(attr) do
				addresses[i][j] = addresses[i][j] or a.default
			end
		end

		-- Tabelle sortieren
		table.sort(addresses, function (k1, k2) return k1["Index"] < k2["Index"] end)

		-- Liste erstellen
		t = t .. "<nowiki></nowiki>\n"												-- nötig, warum auch immer, damit erster Listeeintrag richtig gerendert wird
		for _, e in ipairs(addresses) do
			t = t .. "* "															-- Zeilenanfang Liste

			-- Straße/Hausnummer ausgeben
			if wik.pageExists(e["StraßeHnr"]) then									-- Link zu Einzel-Gebäude-Seite
				t = t .. "[[" .. e["StraßeHnr"] .. "]]"
			elseif wik.pageExists(e["VonObjekt"]) then								-- alternativ Link zu Gebäude-Komplex-Seite
				t = t .. "[[" .. e["VonObjekt"] .. "|" .. e["StraßeHnr"] .. "]]"
			elseif wik.pageExists(e["Straße"]) then									-- alternativ Link zu Straße-Seite
				t = t .. "[[" .. e["Straße"] .. "]] " .. tostring(e["Hausnummer"])
			else
				t = t .. "'''" .. e["StraßeHnr"] .. "'''"							-- alternativ nur fetter Text
			end

			-- Zusatzinfos in Klammern anfügen
			local bracket = {}
			if e["Adressart"] ~= "" then
				table.insert(bracket, e["Adressart"])
			end
			if e["AdresseVon"] ~= "" then
				table.insert(bracket, "von " .. lfd.formatDate(e["AdresseVon"]))
			end
			if e["AdresseBis"] ~= "" then
				table.insert(bracket, "bis " .. lfd.formatDate(e["AdresseBis"]))
			end
			if #bracket > 0 then
				t = t .. " (" .. table.concat(bracket, " ") ..")"
			end
			t = t .. "\n"
		end
	end

	-- Tab draus machen
	t = p.tab_(t, "Adressen")
--	mw.log("t = " .. t)
	return t
end

function p.tab_(t, name)
--	mw.log("tab(t)")
--	mw.logObject(t)
	t = str.strip(t)
	if t ~= "" then
		t = "<tab name = ".. name .. ">" .. t .. "</tab>"
	end
--	mw.log("t = " .. t)
	return t
end

return p