Modul:Gebäude

Version vom 12. Oktober 2025, 10:12 Uhr von HeikoBot (Diskussion | Beiträge) (Geo anstelle Geocode)
local p = {} --p stands for package
local com = require("Modul:Common")
local dev = require("Modul:Development")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local geo = require("Modul:Geo")
local kat = require("Modul:Kategorie")
local que = require("Modul:Queries")
local fab = require("Modul:Faktenbox")
local formular = "Gebäude" -- ggf. "Gebäude/Work"

function p.Faktenbox(frame)
--	mw.log("Faktenbox(frame)")
--	mw.logObject(frame)

	-- Konsolenzeile zum Debuggen:
	-- =p.Faktenbox({parentargs={Bild="Schwabacher Straße 12 Dez 2020 1.jpg",["Straße"]="Erlanger Straße",Hausnummer=" 11; 13 ;"}})
	local args, noframe = dev.GetParentArgs(frame)

	-- Klasse/Kategorie setzen
	local klasse = "Gebäude"
	local kategorie = kat.mehrzahl(klasse)
	mw.smw.set("KlassenName = " .. klasse)

	-- Straße/Hausnummer Formular-Eingaben analysieren, Postleitzahl ermitteln
	local strasse_hnr = p.strasseHnrParser(args)
	local plz = p.getPlz(strasse_hnr)

	-- Tabs einsammeln
	local bild_tab = fab.bildTab(args["Bild"])
	local karten_tab = p.kartenTab{frame = frame, args = args, plz = plz, noframe = noframe}
	local daten_tab = p.datenTab{
		frame = frame,	args = args,				klasse = klasse,	kategorie = kategorie,
		plz = plz,		strasse_hnr = strasse_hnr,	geo = true,			noframe = noframe
	}
	local personen_tab = p.residenzTab("Personen, die hier wohnen bzw. gewohnt haben:", "Person", "Personen")
	local unternehmen_tab = p.residenzTab("Unternehmen, die hier ansässig sind/waren:", "Unternehmen", "Unternehmen")

	-- Tabs zusammenfügen
	local box = 
		"<div class = factbox><tabs>" ..
		bild_tab ..
		karten_tab ..
		daten_tab ..
		personen_tab ..
		unternehmen_tab ..
		"</tabs></div>"

	-- Sonstige gemeinsame Dinge anfügen (Formular, Kategorien, Wartung, ...)
	box = box .. fab.common{
		klasse = klasse,		kategorie = kategorie,		denkmalstatusbesteht = args["DenkmalstatusBesteht"],
		bild = args["Bild"],	strasse_hnr = strasse_hnr,	positionscheck = true,	formular = formular
	}
--	mw.log("box = " .. box)

	-- Pre-Rendern und String-Länge checken
	if not noframe then
		box = frame:preprocess(box)
	end
	box = box .. com.returnStringCheck(box)
--	mw.log("box = " .. box)
	return box
end

function p.datenTab(args)
--	mw.log("datenTab(args)")
--	mw.logObject(args)
	-- Konsolenzeile zum Debuggen:
	-- =p.datenTab({noframe=true,klasse="Gebäude",kategorie="Gebäude",positionscheck=true,work=true,args={},strasse_hnr={strasse={}}})
	local t = ""

	-- Teil Des Gebäude Komplexes ermitteln und mergen
	local teil_des_gebaeude_komplexes = args.args["TeilDesGebäudeKomplexes"] or ""
	teil_des_gebaeude_komplexes = str.splitAndStrip(teil_des_gebaeude_komplexes, ";")
	local query = "[[:+]][[!" .. wik.pagename() .. "]][[Kategorie:Gebäude]][[StraßeHnr::" .. wik.subpagename() .. "]] [[AnzahlGebäude::>2]]"
--	mw.log("query = " .. query)
	local query_result = que.getPages(query, true)
--	mw.logObject(query_result)
	teil_des_gebaeude_komplexes = com.append_tables(teil_des_gebaeude_komplexes, query_result)

	-- Zusammenbau
	t = t .. "<dl class = 'dataTable'>"
	t = t .. fab.zeileKategorieSeite(args.klasse, args.kategorie)
	t = t .. fab.zeileStrasseHnr(args.strasse_hnr)
	t = t .. fab.zeile("PLZ",						args.plz)
	t = t .. fab.zeile("Objekt",					args.args["Objekt"])
	t = t .. fab.zeile("TeilDesEnsembles",			args.args["TeilDesEnsembles"],	"Teil des Ensembles")
	t = t .. fab.zeile("TeilDesAreals", 			args.args["TeilDesAreals"], 	"Teil des Areals")
	t = t .. fab.zeile("TeilDesGebäudeKomplexes",	teil_des_gebaeude_komplexes, 	"Teil des Gebäude-Komplexes")
	t = t .. fab.zeile("Baujahr",					args.args["Baujahr"])
	t = t .. fab.zeile("Ehemals",					args.args["Ehemals"])
	t = t .. fab.zeilenDenkmalschutz(args.args["DenkmalstatusBesteht"], args.args["AktenNr"])
	t = t .. fab.zeile("Abbruchjahr",				args.args["Abbruchjahr"])
	t = t .. fab.zeile("Baustil",					args.args["Baustil"])
	t = t .. fab.zeile("Bauherr",					args.args["Bauherr"])
	t = t .. fab.zeile("Architekt", 				args.args["Architekt"])
	t = t .. fab.zeile("Maurermeister", 			args.args["Maurermeister"])
	t = t .. fab.zeile("Quellangaben",				args.args["Quellangaben"])
	t = t .. fab.zeileGeokoordinate(args.frame, args.noframe)
	t = t .. "</dl>"
	t = t .. fab.faktenboxSemantikBrowsen()

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

function p.kartenTab(args)
--	mw.log("kartenTab(frame, args)")
--	mw.logObject(frame)
--	mw.logObject(args)
	t = ""
	local pagename = wik.pagename()
	if string.find(pagename, ";") ~= nil then
		t = "Semikolon im Artikel-/Seitennamen für korrekte Kartendarstellung nicht erlaubt!"
	elseif args.noframe then
		t = "Dummy-Karten-Tab (noframe)" ..
			",lat=" .. (lat or "nil") ..
			",lon=" .. (lon or "nil") ..
			",location=" .. (location or "nil") ..
			",geojson=" .. (geojson or "nil") ..
			",GeoJsonKarte=" .. (GeoJsonKarte or "nil")
	else
		local args_karte = com.shallowcopy(args.args)
		args_karte["PLZ"] = args.plz
		t = args.frame:expandTemplate{title = 'Gebäude/Karte', args = args_karte}
	end

	-- Tab draus machen
	t = fab.tab(t, "Karte")
--	mw.log("t = " .. t)
	return t
end

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

	local strasse_hnr = {
		{args["Straße"]  or "", args["Hausnummer"]  or ""},
		{args["Straße2"] or "", args["Hausnummer2"] or ""},
		{args["Straße3"] or "", args["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)
	return result
end

function p.residenzTab(ueberschrift, klasse, kategorie)
--	mw.log("residenzTab(" .. (klasse or "nil") .. ")")
	local t = ""
	-- DB-Abfrage
	local query = "[[:+]][[-Has subobject::+]][[SubObjektTyp::Adresse]][[VonObjekt::" .. wik.subpagename() .. "]][[-Has subobject.KlassenName::" .. klasse .. "]]"
	query = query .. "|?-has subobject.Seite = Seite|?Adressart|?AdresseVon#-F[j. F Y]|?AdresseBis#-F[j. F Y]|mainlabel = -|limit = 100"
	local ask_result = mw.smw.ask(query)
--	mw.logObject(ask_result)

	-- Zeilen zusammenbauen
	if ask_result ~= nil then
		for i, z in ipairs(ask_result) do -- Ergebniszeile durchiterieren
			if i == 1 then
				t = t .. 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
	end

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

function p.getPlz(strasse_hnr)
--	mw.log("getPlz(strasse_hnr)")
--	mw.logObject(strasse_hnr)
	-- Konsolenzeile zum Debuggen:
	-- =p.getPlz({strasse = {{name = "Erlanger Straße", hausnummer = {"11", "13"}}, {name = "XY Straße" , hausnummer = {}}}})
	local plz = ""
	if #strasse_hnr.strasse > 0 and not 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(strasse_hnr.strasse[1].name, strasse_hnr.strasse[1].hausnummer[1])
		else
	end
--	mw.log("plz = " .. plz)
	return plz
end

return p