Modul:Gebäude: Unterschied zwischen den Versionen

Aus FürthWiki

(if t ~= "" then t = t .. fab.zeileSemantikBrowsenAbfrage(fbdata))
(fix #LOCL AdresseVon AdresseBis)
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 194: Zeile 194:
-- DB-Abfrage
-- DB-Abfrage
local query = "[[:+]][[-Has subobject::+]][[SubObjektTyp::Adresse]][[VonObjekt::" .. fbdata.subpagename.. "]][[-Has subobject.KlassenName::" .. args.klasse .. "]]"
local query = "[[:+]][[-Has subobject::+]][[SubObjektTyp::Adresse]][[VonObjekt::" .. fbdata.subpagename.. "]][[-Has subobject.KlassenName::" .. args.klasse .. "]]"
query = query .. "|?-has subobject.Seite#-=Seite|?Adressart|?AdresseVon#-F[j. F Y]|?AdresseBis#-F[j. F Y]|mainlabel=-|limit=100"
query = query .. "|?-has subobject.Seite#-=Seite|?Adressart|?AdresseVon#LOCL|?AdresseBis#LOCL|mainlabel=-|limit=100"
local ask_result = mw.smw.ask(query)
local ask_result = mw.smw.ask(query)
-- mw.logObject(ask_result, "ask_result")
-- mw.logObject(ask_result, "ask_result")
Zeile 249: Zeile 249:


if t ~= "" then
if t ~= "" then
t = t .. fab.zeileSemantikBrowsenAbfrage(fbdata)
t = t .. "<br>" .. fab.zeileSemantikBrowsenAbfrage(fbdata)
end
end



Aktuelle Version vom 1. Dezember 2025, 09:41 Uhr

local p = {} --p stands for package
local com = require("Modul:Common")
local str = require("Modul:String")
local geo = require("Modul:Geo")
local que = require("Modul:Queries")
local wik = require("Modul:Wiki")
local fab = require("Modul:Faktenbox")

function p.Faktenbox(frame)
--	mw.log("Faktenbox(frame)")
--	mw.logObject(frame, "frame")
	-- Konsolenzeile zum Debuggen:
	-- =p.Faktenbox{pargs={Bild="Schwabacher Straße 12 Dez 2020 1.jpg",["Straße"]="Schwabacher Straße",Hausnummer="12",["TeilDesGebäudeKomplexes"]="TDGK",AktenNr="D-5-63-000-1464",Objekt="Häusle"}}
	local t = ""

	-- Basis-Faktenbox-Daten (Klasse/Kategorie/Formular)
	local fbdata = fab.fbdata(frame)
	fbdata.klasse = {"Gebäude"}
	fbdata.kategorie = {"Gebäude"}
	fbdata.formular = "Gebäude" -- ggf. "Gebäude/Work"
	fbdata.positionscheck = true

	if com.isTrue(fbdata.pargs["WeiterleitungGebäudeKomplex"]) then
		t = p.weiterleitung(fbdata)
	else
		-- Straße/Hausnummer Formular-Eingaben analysieren, Postleitzahl ermitteln
		fbdata.strasse_hnr = p.strasseHnrParser(fbdata)
		fbdata.plz = p.getPlz(fbdata)

		-- Shoah-Abfrage
		fbdata.shoah = p.opferShoah(fbdata)

		-- Tabs einsammeln und zusammenfügen
		t =	"<div class = factbox><tabs>" ..
			fab.bildTab(fbdata) ..
			p.kartenTab(fbdata) ..
			p.datenTab(fbdata) ..
			p.residenzTab(fbdata, {ueberschrift = "Personen, die hier wohnen bzw. gewohnt haben:",	klasse = "Person",		kategorie="Personen"}) ..
			p.residenzTab(fbdata, {ueberschrift = "Unternehmen, die hier ansässig sind/waren:", 	klasse = "Unternehmen",	kategorie="Unternehmen"}) ..
			"</tabs></div>"
	end

	-- Sonstige gemeinsame Dinge anfügen (Klasse, Formular, Kategorien, Wartung, ...)
	t = t .. fab.common(fbdata)
--	mw.logObject(t, "t")

	-- Pre-Processing und String-Länge checken
	t = fbdata.frame:preprocess(t)
	t = t .. com.returnStringCheck(t)
--	mw.logObject(t, "t")
	return t
end

function p.datenTab(fbdata, args)
--	mw.log("datenTab(fbdata, args)")
--	mw.logObject(fbdata, "fbdata")
--	mw.logObject(args, "args")
	--[[ Konsolenzeile zum Debuggen (Achtung! Bug in Fehlerbereinigungskonsole! Kann nur 1x ausgeführt werden!):
	fab=require("Modul:Faktenbox/Work");
	fbdata=fab.fbdata{pargs={
		["Straße"]="Elanger Straße",
		Hausnummer="11;13",
		["TeilDesGebäudeKomplexes"]="TDGK",
		AktenNr="D-5-63-000-1464",
		Objekt="Häusle"
	}};
	fbdata.klasse={"Kirche","Gebäude"};
	fbdata.kategorie={"Kirchen","Gebäude"};
	fbdata.fullpagename="Isaak-Loewi-Straße 1";
	fbdata.subpagename="Isaak-Loewi-Straße 1";
	fbdata.strasse_hnr={strasse={{name="Erlanger Straße",hausnummer={"11", "13"}},{name="XY Straße",hausnummer={}}},anzahlGebaeude=3};
	fbdata.plz=90765;
	print(p.datenTab(fbdata,{kindex=2,tabname="Tabname"}))
	]]
	local t = ""
	args = args or {}

	-- Teil des Gebäude Komplexes ermitteln
	local teil_des_gebaeude_komplexes = p.teilDesGebaeudeKomplexes(fbdata)

	-- Teil des Ensembles um "Ensemble " ergänzen
	local teil_des_ensembles = str.splitAndStrip(fbdata.pargs["TeilDesEnsembles"] or "", ";")
	for i = 1, #teil_des_ensembles do
		teil_des_ensembles[i] = "Ensemble " .. teil_des_ensembles[i]
	end

	-- Zusammenbau
	t = t .. "<dl class = 'dataTable'>"
	t = t .. fab.zeileKategorieSeite(fbdata, args.kindex)
	t = t .. fab.zeileStrasseHnr(fbdata)
	t = t .. fab.zeile{attr_name = "PLZ",						attr_val = fbdata.plz}
	t = t .. fab.zeile{attr_name = "Objekt",					fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "TeilDesEnsembles",			attr_val = teil_des_ensembles,		 	delimiter = ";"}
	t = t .. fab.zeile{attr_name = "TeilDesAreals",				fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "TeilDesGebäudeKomplexes",	attr_val = teil_des_gebaeude_komplexes,	delimiter = ";", attr_text = "Teil des Gebäude-Komplexes"}
	t = t .. fab.zeile{attr_name = "Baujahr",					fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "DenkmalstatusBesteht",		fbdata = fbdata}
	t = t .. fab.zeileAktenNr(fbdata)
	t = t .. fab.zeile{attr_name = "Quellangaben",				fbdata = fbdata,						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "Ehemals",					fbdata = fbdata,										 attr_text = "Ehemals (abgerissen)"}
	t = t .. fab.zeile{attr_name = "Abbruchjahr",				fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "Baustil",					fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "Bauherr",					fbdata = fbdata,						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "Architekt",					fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeile{attr_name = "Maurermeister",				fbdata = fbdata, 						delimiter = ";"}
	t = t .. fab.zeileGeoDaten(fbdata)
	t = t .. "</dl>"
	t = t .. fab.zeileSemantikBrowsenAbfrage(fbdata)

	-- Tab draus machen
	t = fab.tab(t, args.tabname or "Daten")
--	mw.logObject(t, "t")
    return t
end

function p.kartenTab(fbdata)
--	mw.log("kartenTab(fbdata)")
--	mw.logObject(fbdata, "fbdata")
	-- Konsolenzeile zum Debuggen:
	-- fab=require("Modul:Faktenbox/Work"); fbdata=fab.fbdata{pargs={["Straße"]="Erlanger Straße",["Hausnummer"]="11"}}; fbdata.plz=90765; 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_karte = com.shallowcopy(fbdata.pargs)
		args_karte["PLZ"] = fbdata.plz
		args_karte["Debug"] = "Nein"
		t = fbdata.frame:expandTemplate{title = 'Gebäude/Karte', args = args_karte}
	end
	-- Tab draus machen
	t = fab.tab(t, "Karte")
--	mw.logObject(t, "t")
	return t
end

function p.strasseHnrParser(fbdata)
--	mw.log("strasseHnrProcessor(fbdata)")
--	mw.logObject(fbdata.pargs, "fbdata.pargs")
	-- Konsolenzeile zum Debuggen:
	-- p.strasseHnrParser{pargs={["Straße"]="Elanger Straße",["Hausnummer"]="11;13",["Straße2"]="Frühlingstraße",["Hausnummer2"]="",["Straße3"]="",["Hausnummer3"]=""}}
	local result = {}
	result.strasse = {}
	result.suspekt = false
	result.anzahlGebaeude = 0

	local strasse_hnr = {
		{fbdata.pargs["Straße"]  or "", fbdata.pargs["Hausnummer"]  or ""},
		{fbdata.pargs["Straße2"] or "", fbdata.pargs["Hausnummer2"] or ""},
		{fbdata.pargs["Straße3"] or "", fbdata.pargs["Hausnummer3"] or ""}
	}

	for _, sh in ipairs(strasse_hnr) do 										-- Straße/Hausnummern-Kombis durchitereieren
		local s = str.strip(sh[1])												-- Straße
		local hl = str.strip(sh[2])												-- Hausnummernliste
		if s == "" then															-- kein Problem, wenn eine Straße/Hausnummer-Kombi komplett fehlt (nicht im Formular angegeben)
			if hl ~= "" then													-- aber Problem bei fehlender Straße, aber Hausnummernliste vorhanden
				result.suspekt = true
			end
		else
			local entry = {}
			entry.name = s
			entry.hausnummer = {}
			entry.suspekt = false
			if hl == "" then													-- leere Hausnummernliste
				result.suspekt = true
				entry.suspekt = true
			else
				hl = str.splitAndStrip(hl, ";") 								-- Liste in table umwandeln
				for _, h in ipairs(hl) do										-- Hausnummern durchitereieren
					if h == "" then 											-- leere Hausnummer
						result.suspekt = true
						entry.suspekt = true
					else
						table.insert(entry.hausnummer, h)
						result.anzahlGebaeude = result.anzahlGebaeude + 1
					end
				end
			end
			table.insert(result.strasse, entry)
		end
	end
--	mw.logObject(result, "result")
	return result
end

function p.residenzTab(fbdata, args)
--	mw.log("residenzTab(fbdata, args)")
--	mw.logObject(fbdata, "fbdata")
--	mw.logObject(args, "args")
	-- Konsolenzeile zum Debuggen:
	-- =p.residenzTab({subpagename="Schwabacher Straße 12",fullpagename="Schwabacher Straße 12",strasse_hnr={strasse={{name="Schwabacher Straße",hausnummer={"12"}}}}}, "Unternehmen, die hier ansässig sind/waren:", "Unternehmen", "Unternehmen")
	local t = ""

	-- DB-Abfrage
	local query = "[[:+]][[-Has subobject::+]][[SubObjektTyp::Adresse]][[VonObjekt::" .. fbdata.subpagename.. "]][[-Has subobject.KlassenName::" .. args.klasse .. "]]"
	query = query .. "|?-has subobject.Seite#-=Seite|?Adressart|?AdresseVon#LOCL|?AdresseBis#LOCL|mainlabel=-|limit=100"
	local ask_result = mw.smw.ask(query)
--	mw.logObject(ask_result, "ask_result")

	-- Zeilen zusammenbauen
	for i, z in ipairs(ask_result or {}) do										-- Ergebniszeile durchiterieren
		if i == 1 then
			t = t .. args.ueberschrift .. "\n"									-- Text vor der eigentlichen Liste
		end
		t = t .. "* [[" .. z.Seite .. "]]"										-- immer vorhanden
		z.Adressart = z.Adressart or ""											-- nicht immer vorhanden (nil)
		z.AdresseVon = z.AdresseVon or ""										-- nicht immer vorhanden (nil)
		z.AdresseBis = z.AdresseBis or ""										-- nicht immer vorhanden (nil)
		-- jede Kombination kann vorkommen
		if z.Adressart ~= "" or z.AdresseVon ~= "" or z.AdresseBis ~= "" then
			t = t .. " (" .. z.Adressart										-- kein Problem, wenn leer
			if z.Adressart ~= "" and (z.AdresseVon ~= "" or z.AdresseBis ~= "") then
				t = t .. " "
			end
			if z.AdresseVon ~= "" then
				t = t .. "von " .. z.AdresseVon
			end
			if (z.Adressart ~= "" or z.AdresseVon ~= "") and z.AdresseBis ~= "" then
				t = t .. " "
			end
			if z.AdresseBis ~= "" then
				t = t .. "bis " .. z.AdresseBis
			end
			t = t .. ")"
		end
		t = t .. "\n"
	end

	-- Shoah-Opfer
	if args.klasse == "Person" and com.isTrue(fbdata.pargs["ShoahTest"]) and fbdata.shoah ~= nil then
		for _, s in ipairs(fbdata.shoah) do
			local name = (s["Vorname"] or "") .. " " .. (s["Nachname"] or "")
			if wik.pageExists(name) then
				local found = false
				for _, a in ipairs(ask_result or {}) do							-- prüfen, ob oben bereits aufgelistet
					if a.Seite == name then
						found = true
						break
					end
				end
				if not found then
					t = t .. "* [[" .. name .. "]]\n"
				end
			else
				t = t .. "* " .. name .. "\n"
			end
		end
	end

	if t ~= "" then
		t = t .. "<br>" .. fab.zeileSemantikBrowsenAbfrage(fbdata)
	end

	-- Tab draus machen
	t = fab.tab(t, args.kategorie)
--	mw.logObject(t, "t")
	return t
end

function p.opferShoah(fbdata)
--	mw.log("opferShoah(fbdata)")
--	mw.logObject(fbdata, "fbdata")
	-- Konsolenzeile zum Debuggen:
	-- fbdata={pagename="Hallemannstraße 2, 2a"}; mw.logObject(p.opferShoah(fbdata))

	-- DB-Abfrage
	local query = "[[SubObjektTyp::Opfer der Shoah]]"
	query = query .. "[[VonObjekt::" .. fbdata.pagename .. "]]"
	query = query .. "|?Vorname"
	query = query .. "|?Nachname"
	query = query .. "|mainlabel=-"
	query = query .. "|limit=100"
	local ask_result = mw.smw.ask(query)
--	mw.logObject(ask_result, "ask_result")
    return ask_result
end

function p.getPlz(fbdata)
--	mw.log("getPlz(fbdata)")
--	mw.logObject(fbdata.strasse_hnr, "fbdata.strasse_hnr")
	-- Konsolenzeile zum Debuggen:
	-- =p.getPlz{strasse_hnr={strasse={{name="Erlanger Straße",hausnummer={"11","13"},suspekt=false},{name="Schwabacher Straße",hausnummer={1}}}}}
	local plz = ""
	if #fbdata.strasse_hnr.strasse > 0 and not fbdata.strasse_hnr.strasse[1].suspekt then
		-- Es wird angenommen, dass alle Gebäude die gleiche PLZ haben. Hausnummer muss nicht vorhanden sein
		plz = geo.getPLZ(fbdata.strasse_hnr.strasse[1].name, fbdata.strasse_hnr.strasse[1].hausnummer[1])
		else
	end
--	mw.log(plz, "plz")
	return plz
end

function p.teilDesGebaeudeKomplexes(fbdata)
--	mw.log("teilDesGebaeudeKomplexes(fbdata)")
--	mw.logObject(fbdata.pargs, "fbdata.pargs")
	-- Konsolenzeile zum Debuggen:
	-- =p.teilDesGebaeudeKomplexes{pargs={["TeilDesGebäudeKomplexes"]="Rathaus"},fullpagename="Badstraße 15",subpagename="Badstraße 15"}
	local teil_des_gebaeude_komplexes = fbdata.pargs["TeilDesGebäudeKomplexes"] or ""
	teil_des_gebaeude_komplexes = str.splitAndStrip(teil_des_gebaeude_komplexes, ";")
	local query = "[[:+]][[!" .. fbdata.fullpagename .. "]][[Kategorie:Gebäude]][[StraßeHnr::" .. fbdata.subpagename .. "]] [[AnzahlGebäude::>2]]"
--	mw.log(query, "query")
	local query_result = que.getPages(query, true)
--	mw.logObject(query_result, "query_result")
	teil_des_gebaeude_komplexes = com.append_tables(teil_des_gebaeude_komplexes, query_result)
--	mw.logObject(teil_des_gebaeude_komplexes, "teil_des_gebaeude_komplexes")
	return teil_des_gebaeude_komplexes
end

function p.weiterleitung(fbdata)
--	mw.log("weiterleitung(fbdata)")
--	mw.logObject(fbdata.pargs, "fbdata.pargs")
	-- Konsolenzeile zum Debuggen:
	-- fab=require("Modul:Faktenbox/Work"); fbdata=fab.fbdata{pargs={location="Badstraße 15,Fürth,Bayern,Deutschland",["TeilDesGebäudeKomplexes"]="Badstraße 13, 15, 18, Pfisterstraße 50, 52"}}; print(p.weiterleitung(fbdata))
	local t = "\n'''Dieses ist eine Gebäude-Weiterleitungs-Seite zum zugehörigen Gebäude-Komplex'''\n"

	-- Geolokation location ermitteln	
	local location = fbdata.pargs["location"] or ""								-- location vorhanden?
	if location == "" then
		local lat = fbdata.pargs["lat"] or ""									-- lat/lon vorhanden?
		local lon = fbdata.pargs["lon"] or ""
		if lat ~= "" and lon ~= "" then
			location = lat .. "," .. lon
		end
	end
	if location == "" then														-- im Zweifelsfall generische location mittels Seitennamen
		location = wik.pagename() .. ",Fürth,Bayern,Deutschland"
	end
	t = t .. "* Geolokation: " .. location .. "\n"
--	mw.log(location, "location")

	-- Koordinate per #geocode ermitteln
	local geocode = fbdata.frame:callParserFunction( "#geocode", location )
--	mw.log(geocode, "geocode")
	if geocode == "Geocoding failed" then
		t = t .. "Geokoordinate konnte nicht ermittelt werden<br>"
	else
		t = t .. "* Geokoordinate: [[Geokoordinate::" .. geocode .. "]]{{#set:Geolokation=" .. location .. "}}\n"

		-- Teil des Gebäude Komplexes ermitteln
		local teil_des_gebaeude_komplexes = p.teilDesGebaeudeKomplexes(fbdata)
		if #teil_des_gebaeude_komplexes == 0 then
			t = t .. "Fehler: Fehlende Angabe zum Gebäude-Komplex!<br>"
		else
			t = t .. "* Teil des Gebäude-Komplexes: "
			for i, k in ipairs(teil_des_gebaeude_komplexes) do
				if i > 1 then
					t = t .. ", "
				end
				t = t .. "[[TeilDesGebäudeKomplexes::" .. k .. "]]"
			end
			t = t .. "\n\n{{#widget:Redirect|to=" .. teil_des_gebaeude_komplexes[1] .. "}}\n\n"
			t = t .. "... erfolgt in wenigen Sekunden.\n\n"
			t = t .. "'''Die Weiterleitung kann im Formular deaktiviert werden.'''\n\n\n"

			-- Sonstige gemeinsame Dinge anfügen (Klasse, Formular, Kategorien, Wartung, ...)
			t = t .. "{{#set:Seite=" .. fbdata.fullpagename .. "}}"
			t = t .. fab.common(fbdata)
		end
	end
--	mw.logObject(t, "t")
	return t
end

return p