Modul:Faktenbox/Zeilen: Unterschied zwischen den Versionen

Aus FürthWiki
Keine Bearbeitungszusammenfassung
(+ getTelUri())
 
(26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
p = {}
local p = {}
 
local com = require("Modul:Common")
local com = require("Modul:Common")
local str = require("Modul:String")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local wik = require("Modul:Wiki")
local mez = require("Modul:Mehrzahl")
local geo = require("Modul:Geo")
local geo = require("Modul:Geo")
local que = require("Modul:Queries")
local que = require("Modul:Queries")
local lfd = require("Modul:LinkFormDatum")
local lfd = require("Modul:LinkFormDatum")
 
local wob = require("Modul:Wörterbuch")
local attr_text_anzeige = {
["AbweichendeNamensform"] = "Abw. Namen",
["AngebotVegetarisch"] = "Vegetarische Speisen",
["Ausfuehrung"] = "Ausführung",
["BestandArchivFuerthWiki"] = "Bestand Archiv FürthWiki",
["BietetKartenzahlung"] = "Kartenzahlung möglich",
["DenkmalstatusBesteht"] = "Denkmalstatus besteht",
["GastroBetreiber"] = "Betreiber",
["GastroGenre"] = "Genre",
["GewässerlängeStadtgebiet"] = "Länge im Stadtgebiet",
["Gewässermündung"] = "Mündung bzw. Austritt aus Stadtgebiet",
["Gewässerquelle"] = "Quelle bzw. Eintritt ins Stadtgebiet",
["GewässerRegimetyp"] = "Wasserführung",
["Gewässerstatus"] = "Status/Lage",
["Gewässerstellung"] = "Stellung",
["Gewässerursprung"] = "Ursprung",
["HatAußenplätze"] = "Außenplätze vorhanden",
["HatFassbier"] = "Fassbier-Ausschank",
["HatNebenraum"] = "Nebenraum vorhanden",
["ISBNnr"] = "ISBN-Nr.",
["IstBarrierefrei"] = "Barrierefrei",
["Nachfolger"] = "nachher dort",
["PLZ"] = "Postleitzahl",
["StatistischerBezirk"] = "Statistischer Bezirk",
["StatistischerDistrikt"] = "Statistischer Distrikt",
["TeilDesAreals"] = "Teil des Areals",
["TeilDesEnsembles"] = "Teil des Ensembles",
["TeilDesGebäudeKomplexes"] = "Teil des Gebäude-Komplexes",
["Vorgänger"] = "vorher dort"
}


function p.zeileKategorieSeite_(fbdata, kindex)
function p.zeileKategorieSeite_(fbdata, kindex)
-- mw.log("zeileKategorieSeite_(fbdata, " .. (kindex or 1) .. ")")
-- mw.log("zeileKategorieSeite_(fbdata, " .. (kindex or 1) .. ")")
-- mw.logObject(fbdata)
-- mw.logObject(fbdata, "fbdata")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- =p.zeileKategorieSeite_({pagename="fpn",kategorie={"kat1","kat2"},klasse={"kla1","kla2"}}, 2)
-- =p.zeileKategorieSeite_({pagename="fpn",kategorie={"kat1","kat2"},kategorie_einzahl={"k1","k2"},klasse={"kla1","kla2"}}, 2)
local t = ""
local t = ""
t = t .. "<dt>[[:Kategorie:" .. fbdata.kategorie[kindex or 1] .. "|" .. fbdata.klasse[kindex or 1] .. "]]</dt>"
local kategorie_einzahl
if wik.pageexists("Kategorie:" .. fbdata.pagename) then
if fbdata.kategorie_einzahl ~= nil then
kategorie_einzahl = fbdata.kategorie_einzahl[kindex or 1]
else
kategorie_einzahl = fbdata.klasse[kindex or 1]
end
t = t .. "<dt>[[:Kategorie:" .. fbdata.kategorie[kindex or 1] .. "|" .. kategorie_einzahl .. "]]</dt>"
if wik.pageExists("Kategorie:" .. fbdata.pagename) then
t = t .. "<dd>[[:Kategorie:" .. fbdata.pagename .. "|" .. fbdata.pagename .. "]]{{#set:Seite=" .. fbdata.pagename .. "}}</dd>"
t = t .. "<dd>[[:Kategorie:" .. fbdata.pagename .. "|" .. fbdata.pagename .. "]]{{#set:Seite=" .. fbdata.pagename .. "}}</dd>"
else
else
t = t .. "<dd>[[Seite::" .. fbdata.pagename .. "]]</dd>"
t = t .. "<dd>[[Seite::" .. fbdata.pagename .. "]]</dd>"
end
end
-- mw.log("t = " .. t)
-- mw.logObject(t, "t")
return t
return t
end
end
Zeile 57: Zeile 33:
function p.zeileStrasseHnr_(fbdata)
function p.zeileStrasseHnr_(fbdata)
-- mw.log("zeileStrasseHnr_(fbdata)")
-- mw.log("zeileStrasseHnr_(fbdata)")
-- mw.logObject(fbdata.strasse_hnr)
-- mw.logObject(fbdata.strasse_hnr, "fbdata.strasse_hnr")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- =p.zeileStrasseHnr_{strasse_hnr={strasse={{name="Erlanger Straße",hausnummer={"11", "13"}},{name="XY Straße",hausnummer={}}},anzahlGebaeude=3}}
-- =p.zeileStrasseHnr_{strasse_hnr={strasse={{name="Erlanger Straße",hausnummer={"11", "13"}},{name="XY Straße",hausnummer={}}},anzahlGebaeude=3}}
Zeile 68: Zeile 44:
is = "" -- keine 1, aber 2, 3, ... für weitere Verwendung
is = "" -- keine 1, aber 2, 3, ... für weitere Verwendung
end
end
t = t .. "[[Attribut:Straße" .. is .. "|Straße]]"
t = t .. "Straße"
if #sh.hausnummer > 0 then
if #sh.hausnummer > 0 then
t = t .. " / " .. "[[Attribut:Hausnummer" .. is .. "|Hausnummer]]" -- nur wenn Hausnummern vorhanden
t = t .. " / " .. "Hausnummer" -- nur wenn Hausnummern vorhanden
if #sh.hausnummer > 1 then
t = t .. "n" -- Mehrzahl
end
end
end
t = t .. "</dt><dd>[[Straße" .. is .. "::" .. sh.name .. "]]"
t = t .. "</dt><dd>[[Straße" .. is .. "::" .. sh.name .. "]]"
Zeile 78: Zeile 57:
t = t .. "," -- Kommas davor ab 2. Hausnummer
t = t .. "," -- Kommas davor ab 2. Hausnummer
end
end
if wik.pageexists(strasse_hnr_) then -- Link, wenn Seite vorhanden
if wik.pageExists(strasse_hnr_) then -- Link, wenn Seite vorhanden
t = t .. " [[" .. strasse_hnr_ .. "|" .. h .. "]]"
t = t .. " [[" .. strasse_hnr_ .. "|" .. h .. "]]"
else
else
Zeile 88: Zeile 67:
end
end
t = t .. "{{#set:AnzahlGebäude=" .. fbdata.strasse_hnr.anzahlGebaeude .. "}}"
t = t .. "{{#set:AnzahlGebäude=" .. fbdata.strasse_hnr.anzahlGebaeude .. "}}"
-- mw.log("t = " .. t)
-- mw.logObject(t, "t")
return t
return t
end
end
Zeile 94: Zeile 73:
function p.zeileAktenNr_(fbdata)
function p.zeileAktenNr_(fbdata)
-- mw.log("zeileAktenNr_(fbdata)")
-- mw.log("zeileAktenNr_(fbdata)")
-- mw.logObject(fbdata.pargs)
-- mw.logObject(fbdata.pargs, "fbdata.pargs")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- =p.zeileAktenNr_{pargs={AktenNr="D-5-63-000-1464"}}
-- =p.zeileAktenNr_{pargs={AktenNr="D-5-63-000-1464"}}
Zeile 100: Zeile 79:
local aktennr = str.splitAndStrip(fbdata.pargs["AktenNr"] or "", ";")
local aktennr = str.splitAndStrip(fbdata.pargs["AktenNr"] or "", ";")
if #aktennr > 0 then
if #aktennr > 0 then
t = t .. "<dt>" .. "[[Attribut:AktenNr|Akten-Nr.]]</dt><dd>"
t = t .. "<dt>" .. "Akten-Nr.</dt><dd>"
for i, a in ipairs(aktennr) do
for i, a in ipairs(aktennr) do
if i > 1 then
if i > 1 then
Zeile 115: Zeile 94:
t = t .. "</dd>"
t = t .. "</dd>"
end
end
-- mw.log("t=" .. t)
-- mw.logObject(t, "t")
return t
return t
end
end


function p.zeileGeoDaten_(fbdata)
function p.zeileGeoDaten_(fbdata)
-- mw.log("zeileGeoDaten()")
-- mw.log("zeileGeoDaten(fbdata)")
-- mw.logObject(fbdata)
-- mw.logObject(fbdata, "fbdata")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- fab = require("Modul:Faktenbox"); fbdata=fab.fbdata{pargs={}}; fbdata.fullpagename="Isaak-Loewi-Straße 1, 3, 5, 7, 9, Liesl-Kießling-Straße 16"; print(p.zeileGeoDaten_(fbdata))
-- fab = require("Modul:Faktenbox"); fbdata=fab.fbdata{pargs={}}; fbdata.fullpagename="Isaak-Loewi-Straße 1, 3, 5, 7, 9, Liesl-Kießling-Straße 16"; print(p.zeileGeoDaten_(fbdata))
Zeile 127: Zeile 106:
local geokoordinate = que.getValues(fbdata.fullpagename, "Geokoordinate", true)
local geokoordinate = que.getValues(fbdata.fullpagename, "Geokoordinate", true)
local geojson = que.getValues(fbdata.fullpagename, "GeoJson", true)
local geojson = que.getValues(fbdata.fullpagename, "GeoJson", true)
mw.logObject(geojson)
if #geojson > 0 then
if #geokoordinate > 0 or #geojson > 0 then
geojson = geojson[1]
t = t .. "<dt>[[Attribut:Geokoordinate|Geo-Daten]]</dt><dd>"
else
geojson = "GeoJson:" .. fbdata.pagename
if not wik.pageExists(geojson) then
geojson = nil
end
end
if #geokoordinate > 0 or geojson ~= nil then
t = t .. "<dt>Geo-Daten</dt><dd>"
local first = true
local first = true
for _, g in ipairs(geokoordinate) do
for _, g in ipairs(geokoordinate) do
Zeile 139: Zeile 125:
t = t .. geo.osmLink(fbdata.frame, g)
t = t .. geo.osmLink(fbdata.frame, g)
end
end
if #geojson > 0 then
if geojson ~= nil then
if not first then
if not first then
t = t .. ",<br>"
t = t .. ",<br>"
end
end
t = t .. "[[" .. geojson[1] .. "|GeoJson-Karte]]"
t = t .. "[[" .. geojson .. "|GeoJson-Karte]]"
end
end
t = t .. "</dd>"
t = t .. "</dd>"
end
end
-- mw.log("t = " .. t)
-- mw.logObject(t, "t")
return t
return t
end
end
Zeile 153: Zeile 139:
function p.zeileDatum_(args)
function p.zeileDatum_(args)
-- mw.log("zeileDatum_(args)")
-- mw.log("zeileDatum_(args)")
-- mw.logObject(args)
-- mw.logObject(args, "args")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- =p.zeileDatum_{attr_date="Weihedatum",date="1959/11/15",attr_day="Weihetag",attr_year="Weihejahr"}
-- =p.zeileDatum_{attr_date="Weihedatum",date="1959/11/15",attr_day="Weihetag",attr_year="Weihejahr"}
Zeile 159: Zeile 145:
local date = str.strip(args.date or "")
local date = str.strip(args.date or "")
if date ~= "" then
if date ~= "" then
t = t .. "<dt>" .. "[[Attribut:" .. args.attr_date .. "|" .. (args.attr_text or args.attr_date) .. "]]</dt><dd>"
t = t .. "<dt>" .. (args.attr_text or args.attr_date) .. "</dt><dd>"
t = t .. lfd.linkFormDate(date, args.attr_date, args.attr_day, args.attr_year)
if com.isTrue(args.val_show_only) then
t = t .. lfd.linkFormDate(date)
else
t = t .. lfd.linkFormDate(date, args.attr_date, args.attr_day, args.attr_year)
end
t = t .. "</dd>"
t = t .. "</dd>"
end
end
-- mw.log("t = " .. t)
-- mw.logObject(t, "t")
return t
end
 
function p.zeileSemantikBrowsenAbfrage_(fbdata)
-- mw.log("zeileSemantikBrowsenAbfrage_(fbdata)")
-- mw.logObject(fbdata, "fbdata")
-- Konsolenzeile zum Debuggen:
-- =p.zeileSemantikBrowsenAbfrage_{fullpagename="Rathaus"}
local t = ""
t = t .. "&nbsp;"
t = t .. "[[Bild:IconSearch.svg|16px|semantisches Browsen|link=[[Spezial:Durchsuchen/" .. fbdata.fullpagename .. "]]]]"
t = t .. "&nbsp;&nbsp;&nbsp;"
t = t .. "[[Spezial:Durchsuchen/" .. fbdata.fullpagename .. "|Sem. Browsen]]"
if fbdata.kategorie ~= nil and wik.pageExists("Formular:Abfrage " .. fbdata.kategorie[1]) then
t = t .. " / {{#queryformlink:form=Abfrage " .. fbdata.kategorie[1] .. "|link text=Abfrage}}"
end
-- mw.logObject(t, "t")
return t
return t
end
end
Zeile 169: Zeile 176:
function p.zeile_(args)
function p.zeile_(args)
-- mw.log("zeile(args)")
-- mw.log("zeile(args)")
-- mw.logObject(args)
-- mw.logObject(args, "args")
-- Konsolenzeile zum Debuggen:
-- Konsolenzeile zum Debuggen:
-- =p.zeile_{attr_name="Vorgänger",attr_text="t",fbdata={pargs={["Vorgänger"]="; v11 , V12 ; v13 (a(b))"}},attr_val="; v1 ; v2, v3 (a(b))",val_prefix="pre",val_postfix="post",exclude_bracket_values=true,delimiter=","}
-- =p.zeile_{attr_name="Vorgänger",attr_text="t",fbdata={pargs={["Vorgänger"]="; v11 , V12 ; v13 (a(b))"}},attr_val="; v1 ; v2, v3 (a(b))",val_prefix="pre",val_postfix="post",exclude_bracket_values=true,delimiter=","}
Zeile 175: Zeile 182:
-- Attribut-Name/Wert aufbereiten (splitten, in table umwandeln)
-- Attribut-Name/Wert aufbereiten (splitten, in table umwandeln)
local attr_name = args.attr_name
local attr_name = args.attr_name
local attr_val = args.attr_val or args.fbdata.pargs[attr_name] or {}
local attr_val
if args.fbdata ~= nil then
attr_val = args.attr_val or args.fbdata.pargs[attr_name] or {}
else
attr_val = args.attr_val or {}
end
if type(attr_val) ~= "table" then -- Liste in table umwandeln/zerteilen
if type(attr_val) ~= "table" then -- Liste in table umwandeln/zerteilen
if args.delimiter ~= nil then
if args.delimiter ~= nil then
Zeile 188: Zeile 200:
if #attr_val > 0 then
if #attr_val > 0 then
-- Attribut-Text ermitteln und in Zeile übernehmen
-- Attribut-Text ermitteln und in Zeile übernehmen
local attr_text = args.attr_text or attr_text_anzeige[attr_name] or attr_name
local attr_text = args.attr_text or wob.attr_text(attr_name)
if #attr_val > 1 then
if #attr_val > 1 then
attr_text = mez.mehrzahl(attr_text) -- Mehrzahl
attr_text = wob.mehrzahl(attr_text) -- Mehrzahl
end
end
t = t .. "<dt>" .. "[[Attribut:" .. attr_name .. "|" .. attr_text .. "]]</dt>"
t = t .. "<dt>" .. attr_text .. "</dt>"
-- Attribut-Werte in Zeile übernehmen
-- Attribut-Werte in Zeile übernehmen
t = t .. "<dd>"
t = t .. "<dd>"
Zeile 202: Zeile 214:
t = t .. ", " -- Listen-Kommata
t = t .. ", " -- Listen-Kommata
end
end
if mw.smw.getPropertyType(attr_name) == "_wpg" then -- Seiten-Attribute Spezialbehandlung
if mw.smw.getPropertyType(attr_name) == "_wpg" then -- Seiten-Attribute Spezialbehandlung
t = t .. p.setPageAttr(attr_name, val)
t = t .. p.setPageAttr(attr_name, val, args.val_show_only)
else -- alle anderen Attribut-Datentypen
else -- alle anderen Attribut-Datentypen
local val_pre_bracket, val_post_bracket = "", ""
if mw.smw.getPropertyType(attr_name) == "_tel" then -- Telefonnummer Spezialbehandlung
if com.isTrue(args.exclude_bracket_values) then -- Klammer-Text separieren (kein Attribut-Wert)
val = p.getTelUri(val)
val_pre_bracket, val, val_post_bracket = str.bracketSplitAndStrip(val) -- nach Klammern suchen und aufteilen
end
if val_pre_bracket ~= "" then
t = t .. val_pre_bracket .. " "
end
t = t .. "[[" .. attr_name .. "::" .. val .. "]]"
if val_post_bracket ~= "" then
t = t .. " " .. val_post_bracket
end
end
t = t .. p.setStandardAttr(attr_name, val, args.exclude_bracket_values, args.val_show_only)
end
end
end
end
Zeile 223: Zeile 228:
t = t .. "</dd>"
t = t .. "</dd>"
end
end
-- mw.log("t = " .. t)
-- mw.logObject(t, "t")
return t
return t
end
end


function p.setPageAttr(name, val)
function p.setPageAttr(name, val, val_show_only)
local t = ""
local t = ""
if string.find(val, "[#=<>%[%]%|%{%}]") ~= nil then -- problematische Wikitext/HTML-Inhalte vorhanden?
if string.find(val, "[#=<>%[%]%|%{%}]") ~= nil then -- problematische Wikitext/HTML-Inhalte vorhanden?
t = val .. "{{#set:" .. name .. "=" .. val .. "}}" -- ==> kein Link, sondern nur Attribut versteckt setzen
t = t .. val -- ==> kein Link, sondern nur Attribut versteckt setzen
elseif wik.pageexists(val) then -- eine vorhandene Seite regulär setzen
if not val_show_only then
t = "[[" .. name .. "::" .. val .. "]]"
t = t .. "{{#set:" .. name .. "=" .. val .. "}}"
end
elseif wik.pageExists(val) then -- eine vorhandene Seite regulär verlinken bzw. setzen
if val_show_only then
t = t .. "[[" .. val .. "]]"
else
t = t .. "[[" .. name .. "::" .. val .. "]]"
end
else
else
val_pre_bracket, val_without_bracket, val_post_bracket = str.bracketSplitAndStrip(val) -- nach Klammern suchen und aufteilen
val_pre_bracket, val_without_bracket, val_post_bracket = str.bracketSplitAndStrip(val) -- nach Klammern suchen und aufteilen
if not wik.pageexists(val_without_bracket) then -- Seite auch ohne Klammern nicht vorhanden?
if not wik.pageExists(val_without_bracket) then -- Seite auch ohne Klammern nicht vorhanden?
t = val .. "{{#set:" .. name .. "=" .. val .. "}}" -- ==> kein Link, sondern nur Attribut versteckt setzen
t = t .. val -- ==> kein Link, sondern nur Attribut versteckt setzen
if not val_show_only then
t = t .. "{{#set:" .. name .. "=" .. val .. "}}"
end
else
else
if val_pre_bracket ~= "" then -- Klammer-Text vor eigentlicher Seite
if val_pre_bracket ~= "" then -- Klammer-Text vor eigentlicher Seite
t = t .. val_pre_bracket .. " "
t = t .. val_pre_bracket .. " "
end
end
t = t .. "[[" .. name .. "::" .. val_without_bracket .. "]]" -- das eigentliche Attribut-Setzen
if val_show_only then
if val_post_bracket ~= "" then -- Klammer-Text nach eigentlicher Seite
t = t .. "[[" .. val_without_bracket .. "]]" -- das eigentliche Attribut verlinken
else
t = t .. "[[" .. name .. "::" .. val_without_bracket .. "]]" -- das eigentliche Attribut-Setzen
end
if val_post_bracket ~= "" then -- Klammer-Text nach eigentlicher Seite
t = t .. " " .. val_post_bracket
t = t .. " " .. val_post_bracket
end
end
end
end
end
end
-- mw.logObject(t, "t")
return t
end
function p.setStandardAttr(name, val, exclude_bracket_values, val_show_only)
local t = ""
local val_pre_bracket, val_post_bracket = "", ""
if com.isTrue(exclude_bracket_values) then -- Klammer-Text separieren (kein Attribut-Wert)
val_pre_bracket, val, val_post_bracket = str.bracketSplitAndStrip(val) -- nach Klammern suchen und aufteilen
end
if val_pre_bracket ~= "" then
t = t .. val_pre_bracket .. " "
end
if com.isTrue(val_show_only) then
t = t .. val
else
t = t .. "[[" .. name .. "::" .. val .. "]]"
end
if val_post_bracket ~= "" then
t = t .. " " .. val_post_bracket
end
-- mw.logObject(t, "t")
return t
return t
end
function p.getTelUri(val)
local tel = str.strip(val) -- preload default
if mw.ustring.sub(tel, 1, 1) == "0" and -- beginnt mit 0zzz (z = Zahl)
(tonumber(mw.ustring.sub(tel, 2, 2)) or 0) > 0 then
tel = "+49 " .. mw.ustring.sub(tel, 2)
elseif mw.ustring.sub(tel, 1, 3) == "+49" then -- +49 (0) ...
s, e = mw.ustring.find(tel, "%(0%)")
if s ~= nil then
tel = mw.ustring.sub(tel, 1, s - 1) .. " " .. mw.ustring.sub(tel, e + 1)
end
end
-- Alle unerlaubten Zeichen und mehrfache Leerzeichen ausfiltern
local telUri = ""
local previous_char = ""
tel = tel .. " "
for i = 1, mw.ustring.len(tel) do
local char = mw.ustring.sub(tel, i, i)
if tonumber(char) ~= nil or
char == "+" or char == "-" or char == "/" or
(char == " " and previous_char ~= " ") then
telUri = telUri .. previous_char
previous_char = char
end
end
return telUri
end
end


return p
return p

Aktuelle Version vom 27. November 2025, 20:35 Uhr

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 geo = require("Modul:Geo")
local que = require("Modul:Queries")
local lfd = require("Modul:LinkFormDatum")
local wob = require("Modul:Wörterbuch")

function p.zeileKategorieSeite_(fbdata, kindex)
--	mw.log("zeileKategorieSeite_(fbdata, " .. (kindex or 1) .. ")")
--	mw.logObject(fbdata, "fbdata")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeileKategorieSeite_({pagename="fpn",kategorie={"kat1","kat2"},kategorie_einzahl={"k1","k2"},klasse={"kla1","kla2"}}, 2)
	local t = ""
	local kategorie_einzahl
	if fbdata.kategorie_einzahl ~= nil then
		kategorie_einzahl = fbdata.kategorie_einzahl[kindex or 1]
	else
		kategorie_einzahl = fbdata.klasse[kindex or 1]
	end
	t = t .. "<dt>[[:Kategorie:" .. fbdata.kategorie[kindex or 1] .. "|" .. kategorie_einzahl .. "]]</dt>"
	if wik.pageExists("Kategorie:" .. fbdata.pagename) then
		t = t .. "<dd>[[:Kategorie:" .. fbdata.pagename .. "|" .. fbdata.pagename .. "]]{{#set:Seite=" .. fbdata.pagename .. "}}</dd>"
	else
		t = t .. "<dd>[[Seite::" .. fbdata.pagename .. "]]</dd>"
	end
--	mw.logObject(t, "t")
	return t
end

function p.zeileStrasseHnr_(fbdata)
--	mw.log("zeileStrasseHnr_(fbdata)")
--	mw.logObject(fbdata.strasse_hnr, "fbdata.strasse_hnr")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeileStrasseHnr_{strasse_hnr={strasse={{name="Erlanger Straße",hausnummer={"11", "13"}},{name="XY Straße",hausnummer={}}},anzahlGebaeude=3}}
	local t = ""
	for is, sh in ipairs(fbdata.strasse_hnr.strasse) do -- Straßen/Hausnummer-Kombis durchiterieren
		t = t .. "<dt>"
		if is > 1 then
			t = t .. is .. ". " -- Numerierungsanzeige "2., "3." usw.
		else
			is = "" -- keine 1, aber 2, 3, ... für weitere Verwendung
		end
		t = t .. "Straße"
		if #sh.hausnummer > 0 then
			t = t .. " / " .. "Hausnummer" -- nur wenn Hausnummern vorhanden
			if #sh.hausnummer > 1 then
				t = t .. "n" -- Mehrzahl
			end
		end
		t = t .. "</dt><dd>[[Straße" .. is .. "::" .. sh.name .. "]]"
		for ih, h in ipairs(sh.hausnummer) do -- Hausnummern durchiterieren
			local strasse_hnr_ = sh.name .. " " .. h
			if ih > 1 then
				t = t .. "," -- Kommas davor ab 2. Hausnummer
			end
			if wik.pageExists(strasse_hnr_) then -- Link, wenn Seite vorhanden
				t = t .. " [[" .. strasse_hnr_ .. "|" .. h .. "]]"
			else
				t = t .. " " .. h
			end
			t = t .. "{{#set:Hausnummer" .. is .. "=" .. h .. "|StraßeHnr=" .. strasse_hnr_ .. "}}"
		end
		t = t .. "</dd>"
	end
	t = t .. "{{#set:AnzahlGebäude=" .. fbdata.strasse_hnr.anzahlGebaeude .. "}}"
--	mw.logObject(t, "t")
	return t
end

function p.zeileAktenNr_(fbdata)
--	mw.log("zeileAktenNr_(fbdata)")
--	mw.logObject(fbdata.pargs, "fbdata.pargs")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeileAktenNr_{pargs={AktenNr="D-5-63-000-1464"}}
	local t = ""
	local aktennr = str.splitAndStrip(fbdata.pargs["AktenNr"] or "", ";")
	if #aktennr > 0 then
		t = t .. "<dt>" .. "Akten-Nr.</dt><dd>"
		for i, a in ipairs(aktennr) do
			if i > 1 then
				t = t .. ",<br>"
			end
			local p = que.getPages("[[:+]][[AktenNr::" .. a .. "]]", true)
			if #p > 1 then
				t = t .. "{{#queryformlink:form=Abfrage Denkmalschutz|link text=[[AktenNr::" .. a .. "]]|query string=Abfrage Denkmalschutz[AktenNr]=" .. a .. "&_run}}"
			else
				t = t .. "[[AktenNr::" .. a .. "]]"
			end
			t = t .. " (" .. #p .. ")" -- Anzahl der Artikel mit dieser Akten-Nr. in Klammern
		end
		t = t .. "</dd>"
	end
--	mw.logObject(t, "t")
	return t
end

function p.zeileGeoDaten_(fbdata)
--	mw.log("zeileGeoDaten(fbdata)")
--	mw.logObject(fbdata, "fbdata")
	-- Konsolenzeile zum Debuggen:
	-- fab = require("Modul:Faktenbox"); fbdata=fab.fbdata{pargs={}}; fbdata.fullpagename="Isaak-Loewi-Straße 1, 3, 5, 7, 9, Liesl-Kießling-Straße 16"; print(p.zeileGeoDaten_(fbdata))
	local t = ""
	local geokoordinate = que.getValues(fbdata.fullpagename, "Geokoordinate", true)
	local geojson = que.getValues(fbdata.fullpagename, "GeoJson", true)
	if #geojson > 0 then
		geojson = geojson[1]
	else
		geojson = "GeoJson:" .. fbdata.pagename
		if not wik.pageExists(geojson) then
			geojson = nil
		end
	end
	if #geokoordinate > 0 or geojson ~= nil then
		t = t .. "<dt>Geo-Daten</dt><dd>"
		local first = true
		for _, g in ipairs(geokoordinate) do
			if first then
				first = false
			else
				t = t .. ",<br>"
			end
			t = t .. geo.osmLink(fbdata.frame, g)
		end
		if geojson ~= nil then
			if not first then
				t = t .. ",<br>"
			end
			t = t .. "[[" .. geojson .. "|GeoJson-Karte]]"
		end
		t = t .. "</dd>"
	end
--	mw.logObject(t, "t")
	return t
end

function p.zeileDatum_(args)
--	mw.log("zeileDatum_(args)")
--	mw.logObject(args, "args")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeileDatum_{attr_date="Weihedatum",date="1959/11/15",attr_day="Weihetag",attr_year="Weihejahr"}
	local t = ""
	local date = str.strip(args.date or "")
	if date ~= "" then
		t = t .. "<dt>" .. (args.attr_text or args.attr_date) .. "</dt><dd>"
		if com.isTrue(args.val_show_only) then
			t = t .. lfd.linkFormDate(date)
		else
			t = t .. lfd.linkFormDate(date, args.attr_date, args.attr_day, args.attr_year)
		end
		t = t .. "</dd>"
	end
--	mw.logObject(t, "t")
	return t
end

function p.zeileSemantikBrowsenAbfrage_(fbdata)
--	mw.log("zeileSemantikBrowsenAbfrage_(fbdata)")
--	mw.logObject(fbdata, "fbdata")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeileSemantikBrowsenAbfrage_{fullpagename="Rathaus"}
	local t = ""
	t = t .. "&nbsp;"
	t = t .. "[[Bild:IconSearch.svg|16px|semantisches Browsen|link=[[Spezial:Durchsuchen/" .. fbdata.fullpagename .. "]]]]"
	t = t .. "&nbsp;&nbsp;&nbsp;"
	t = t .. "[[Spezial:Durchsuchen/" .. fbdata.fullpagename .. "|Sem. Browsen]]"
	if fbdata.kategorie ~= nil and wik.pageExists("Formular:Abfrage " .. fbdata.kategorie[1]) then
		t = t .. " / {{#queryformlink:form=Abfrage " .. fbdata.kategorie[1] .. "|link text=Abfrage}}"
	end
--	mw.logObject(t, "t")
	return t
end

function p.zeile_(args)
--	mw.log("zeile(args)")
--	mw.logObject(args, "args")
	-- Konsolenzeile zum Debuggen:
	-- =p.zeile_{attr_name="Vorgänger",attr_text="t",fbdata={pargs={["Vorgänger"]="; v11 , V12 ; v13 (a(b))"}},attr_val="; v1 ; v2, v3 (a(b))",val_prefix="pre",val_postfix="post",exclude_bracket_values=true,delimiter=","}
	local t = ""
	-- Attribut-Name/Wert aufbereiten (splitten, in table umwandeln)
	local attr_name = args.attr_name
	local attr_val
	if args.fbdata ~= nil then
		attr_val = args.attr_val or args.fbdata.pargs[attr_name] or {}
	else
		attr_val = args.attr_val or {}
	end
	if type(attr_val) ~= "table" then -- Liste in table umwandeln/zerteilen
		if args.delimiter ~= nil then
			attr_val = str.splitAndStrip(attr_val, args.delimiter or ";")
		elseif attr_val ~= "" then
			attr_val = { attr_val }
		else
			attr_val = {}
		end
	end
	-- Zeile zusammenbauen
	if #attr_val > 0 then
		-- Attribut-Text ermitteln und in Zeile übernehmen
		local attr_text = args.attr_text or wob.attr_text(attr_name)
		if #attr_val > 1 then
			attr_text = wob.mehrzahl(attr_text) -- Mehrzahl
		end
		t = t .. "<dt>" .. attr_text .. "</dt>"
		-- Attribut-Werte in Zeile übernehmen
		t = t .. "<dd>"
		if args.val_prefix ~= nil then
			t = t .. args.val_prefix .. " " -- Prefix
		end
		for idx, val in ipairs(attr_val) do -- Werte-Liste
			if idx > 1 then
				t = t .. ", " -- Listen-Kommata
			end
			if mw.smw.getPropertyType(attr_name) == "_wpg" then 				-- Seiten-Attribute Spezialbehandlung
				t = t .. p.setPageAttr(attr_name, val, args.val_show_only)
			else																-- alle anderen Attribut-Datentypen
				if mw.smw.getPropertyType(attr_name) == "_tel" then 			-- Telefonnummer Spezialbehandlung
					val =  p.getTelUri(val)
				end
				t = t .. p.setStandardAttr(attr_name, val, args.exclude_bracket_values, args.val_show_only)
			end
		end
		if args.val_postfix ~= nil then
			t = t .. " " .. args.val_postfix -- Postfix
		end
		t = t .. "</dd>"
	end
--	mw.logObject(t, "t")
	return t
end

function p.setPageAttr(name, val, val_show_only)
	local t = ""
	if string.find(val, "[#=<>%[%]%|%{%}]") ~= nil then							-- problematische Wikitext/HTML-Inhalte vorhanden?
		t = t .. val															-- ==> kein Link, sondern nur Attribut versteckt setzen
		if not val_show_only then
			t = t .. "{{#set:" .. name .. "=" .. val .. "}}"
		end
	elseif wik.pageExists(val) then												-- eine vorhandene Seite regulär verlinken bzw. setzen
		if val_show_only then
			t = t .. "[[" .. val .. "]]"
		else
			t = t .. "[[" .. name .. "::" .. val .. "]]"
		end
	else
		val_pre_bracket, val_without_bracket, val_post_bracket = str.bracketSplitAndStrip(val)	-- nach Klammern suchen und aufteilen
		if not wik.pageExists(val_without_bracket) then							-- Seite auch ohne Klammern nicht vorhanden?
			t = t .. val														-- ==> kein Link, sondern nur Attribut versteckt setzen
			if not val_show_only then
				t = t .. "{{#set:" .. name .. "=" .. val .. "}}"
			end
		else
			if val_pre_bracket ~= "" then										-- Klammer-Text vor eigentlicher Seite
				t = t .. val_pre_bracket .. " "
			end
			if val_show_only then
				t = t .. "[[" .. val_without_bracket .. "]]"					-- das eigentliche Attribut verlinken
			else
				t = t .. "[[" .. name .. "::" .. val_without_bracket .. "]]"	-- das eigentliche Attribut-Setzen
			end
			if val_post_bracket ~= "" then										-- Klammer-Text nach eigentlicher Seite
				t = t .. " " .. val_post_bracket
			end
		end
	end
--	mw.logObject(t, "t")
	return t
end

function p.setStandardAttr(name, val, exclude_bracket_values, val_show_only)
	local t = ""
	local val_pre_bracket, val_post_bracket = "", ""
	if com.isTrue(exclude_bracket_values) then									-- Klammer-Text separieren (kein Attribut-Wert)
		val_pre_bracket, val, val_post_bracket = str.bracketSplitAndStrip(val)	-- nach Klammern suchen und aufteilen
	end
	if val_pre_bracket ~= "" then
		t = t .. val_pre_bracket .. " "
	end
	if com.isTrue(val_show_only) then
		t = t .. val
	else
		t = t .. "[[" .. name .. "::" .. val .. "]]"
	end
	if val_post_bracket ~= "" then
		t = t .. " " .. val_post_bracket
	end
--	mw.logObject(t, "t")
	return t
end

function p.getTelUri(val)
	local tel = str.strip(val)													-- preload default
	if mw.ustring.sub(tel, 1, 1) == "0" and										-- beginnt mit 0zzz (z = Zahl)
		(tonumber(mw.ustring.sub(tel, 2, 2)) or 0) > 0 then
		tel = "+49 " .. mw.ustring.sub(tel, 2)
	elseif mw.ustring.sub(tel, 1, 3) == "+49" then								-- +49 (0) ...
		s, e = mw.ustring.find(tel, "%(0%)")
		if s ~= nil then
			tel = mw.ustring.sub(tel, 1, s - 1) .. " " .. mw.ustring.sub(tel, e + 1)
		end
	end
	-- Alle unerlaubten Zeichen und mehrfache Leerzeichen ausfiltern
	local telUri = ""
	local previous_char = ""
	tel = tel .. " "
	for i = 1, mw.ustring.len(tel) do
		local char = mw.ustring.sub(tel, i, i)
		if tonumber(char) ~= nil or
			char == "+" or char == "-" or char == "/" or 
			(char == " " and previous_char ~= " ") then
			telUri = telUri .. previous_char
			previous_char = char
		end
	end
	return telUri
end

return p