Modul:Formular/Work: Unterschied zwischen den Versionen

Aus FürthWiki
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 139: Zeile 139:


function p.attrListParser(attr_list, recursion)
function p.attrListParser(attr_list, recursion)
-- Kommandozeile zum Debuggen:
-- mw.logObject(p.attrListParser(";A;{;B;C;};D;"))
local attr_list_parsed = {}
local attr_list_parsed = {}
local loop_count = 0
local loop_count = 0
attr_list = str.strip(attr_list or "")
attr_list = str.strip(attr_list or "")
while loop_count < 100 and attr_list ~= "" do -- Schleifenbegrenzung
while loop_count < 100 and attr_list ~= "" do -- Schleifenbegrenzung
loop_count = loop_count + 1 -- schlägt an auch bei Syntaxfehler
loop_count = loop_count + 1
mw.log(loop_count)
local semicolon = string.find(attr_list, ";")
local semicolon = string.find(attr_list, ";")
local brace_open = string.find(attr_list, "\{")
local brace_open = string.find(attr_list, "\{")
local brace_close = string.find(attr_list, "\}")
local brace_close = string.find(attr_list, "\}")
if brace_open ~= brace_close or -- Klammer nicht paarweise oder
if (brace_open ~= nil and brace_close == nil) or -- Klammer nicht paarweise
(brace_open == nil and brace_close ~= nil) or -- oder
(brace_open or 0) >= (brace_close or 1) then -- in falscher Reihenfolge
(brace_open or 0) >= (brace_close or 1) then -- in falscher Reihenfolge
attr_list = ""
attr_list = "" -- => Abbruch
elseif semicolon == nil and -- letzer Eintrag
elseif semicolon == nil and -- letzer Eintrag
brace_open == nil and brace_close == nil then
brace_open == nil and brace_close == nil then
Zeile 164: Zeile 166:
elseif brace_open ~= nil and brace_close ~= nil and -- eingebettete Klammerung
elseif brace_open ~= nil and brace_close ~= nil and -- eingebettete Klammerung
brace_open < brace_close then
brace_open < brace_close then
if not recursion then -- Rekursionsschutz, nur 2 Ebenen
if not recursion then -- Rekursionsschutz, nur 2 Ebenen bzw. 1 Selbstaufruf
local attr_sublist = -- Klammerinhalt
local attr_sublist = -- Klammerinhalt
string.sub(attr_list, brace_open + 1, brace_close - 1)
string.sub(attr_list, brace_open + 1, brace_close - 1)
attr_sublist = p.attrListParser(attr_sublist, true) -- sich selbst aufrufen
attr_sublist = p.attrListParser(attr_sublist, true) -- sich selbst aufrufen mit recursion = true
if #attr_sublist > 0 then
if #attr_sublist > 0 then
table.insert(attr_list_parsed, attr_sublist)
table.insert(attr_list_parsed, attr_sublist)
Zeile 178: Zeile 180:
attr_list = str.strip(attr_list)
attr_list = str.strip(attr_list)
end
end
mw.logObject(attr_list_parsed, "attr_list_parsed")
return attr_list_parsed
return attr_list_parsed
end
end


return p
return p

Version vom 28. Februar 2026, 18:00 Uhr

local p = {}

local atr = require("Modul:Attribut")
local str = require("Modul:String")

local field_default_args = {													-- hier kann z.B. size global hinzugefügt werden
	checkbox			= "input type=checkbox",
	date				= "input type=date",
	file				= "uploadable",
	hausnummer			= "input type=text|size=5",
	text				= "input type=text",
	text_autocomplete	= "input type=text with autocomplete"}

local attr_field_args = {
	-- diese Tabelle enthält die {{{field|attr|...}}}-Argumente (Attribut wird automatisch eingefügt)
	["Adressart"]			= "input type=combobox|property=Adressart|size=30",
	["AdresseBis"]			= field_default_args.date,
	["AdresseVon"]			= field_default_args.date,
	["Bild"]				= field_default_args.file,
	["Ehemals"]				= field_default_args.checkbox,
	["Email"]				= field_default_args.text,
	["Gründungsdatum"]		= field_default_args.date,
	["Gründungsort"]		= field_default_args.text,
	["Hausnummer"]			= field_default_args.hausnummer,
	["Kommentar"]			= field_default_args.text,
	["Schließungsdatum"]	= field_default_args.date,
	["Schließungsgrund"]	= field_default_args.text,
	["Straße"]				= field_default_args.text_autocomplete,
	["Telefon"]				= field_default_args.text,
	["Webseite"]			= field_default_args.text}

local attr_infos = {
	-- diese Tabelle enthält die {{info:...|note}}-Texte, ggf. abhängig von der Klasse
	["Bild"]				= "Name der Bilddatei im Format <code>Max Mustermann.jpg</code>",
	["Ehemals"]				= {"Haken setzen, wenn Objekt heute nicht mehr besteht", -- default
		["Einrichtung"]		= "Haken setzen, wenn Einrichtung geschlossen"},
	["Schließungsgrund"]	= { -- "???"
		["Einrichtung"]		= "Warum hat diese Einrichtung aufgegeben?"},		-- default
	["Straße"]				= {
		["Adresse"]			= "Nur eintragen, wenn in Fürth!"}}

function p.FormularAdresse(frame)
	local t = ""
	t = t .. "= Adressen =\n"
	t = t .. "{{{for template|Adresse|multiple|add button text=Adresse hinzufügen}}}\n"
	t = t .. p.attr_table{
		frame = frame,
		klasse = "Adresse",														-- Adresse ist eigentlich keine echte Klasse
		attr_list = {
			"Adressart", "AdresseVon", "AdresseBis",
			"Straße", "Hausnummer",
			"Kommentar"},
		format = "horizontal"}
	t = t .. "{{{end template}}}\n"
	return t
end

function p.attr_table(args)
	local t = "<table class=\"formtable\">\n"
	local l1, l2 = "", ""
	for _, a in ipairs(args.attr_list) do
		local attr_text = atr.attrText(a, args.klasse)
		local info = attr_infos[a] or ""										-- Info-Text
		if type(info) == "table" then
			info = info[args.klasse] or info[1] or ""
		end
		if info ~= "" then
			info = args.frame:callParserFunction("#info", info, "note")
		end
		local field =
			"{{{field|" .. a .. "|" .. attr_field_args[a] .. "}}}"
		if args.format == "vertical" then
			t = t ..
				"<tr>\n" ..
				"  <th style=\"vertical-align:middle;\">" .. attr_text .. ":</th>\n" ..
				"  <td style=\"vertical-align:middle;\">" .. info .. "</td>\n" ..
				"  <td style=\"vertical-align:middle;\">" .. field .. "</td>\n" ..
				"</tr>\n"
		elseif args.format == "horizontal" then
			l1 = l1 .. "  <th>" .. attr_text .. ": " .. info .. "</th>\n"
			l2 = l2 .. "  <td>" .. field .. "</td>\n"
		end
	end
	if args.format == "horizontal" then
		t = t .. "<tr>\n" .. l1 .. "</tr>\n" .. "<tr>\n" .. l2 .. "</tr>\n"
	end
	t = t .. "</table>\n"
	return t
end

function p.attrForm(frame, attr_data)
	-- Kommandozeile zum Debuggen:
	-- frame=mw.getCurrentFrame(); print(p.attrForm(frame, {{["Attribut"]="At",["Einzahl"]="Ez",["Infotext"]="It",["FieldArgs"]="fa1|fa2|fa3"},{["Attribut"]="At_",["Einzahl"]="Ez_",["Infotext"]="It_",["FieldArgs"]="fa1_|fa2_|fa3_"}}))
	local t = "<table class=\"formtable\">\n"
	for _, a in ipairs(attr_data) do
		local attr = a["Attribut"]
		local attr_text = a["Einzahl"] or attr
		local delimiter = a["Delimiter"]
		local info = a["Infotext"] or ""
		local field = a["FieldArgs"] or ""
		-- info zusammenbauen
		if info ~= "" then
			info = info .. "."
			if delimiter ~= nil and
				string.find(field, "tokens") == nil then
				info = info .. " Mehrere Eintragungen möglich, zu trennen per " ..
					delimiter
			end
			info = string.gsub(info, "%.%.", ".")
			info = frame:callParserFunction("#info", info, "note")
		end
		-- field zusammenbauen
		if field ~= "" then
			field = "|" .. field
		end
		field = str.appendWithSeparator("{{{field|" .. attr, "|", field) .. "}}}"
		t = t ..
			"<tr>\n" ..
			"  <th style=\"vertical-align:middle;\">" .. attr_text .. ":</th>\n" ..
			"  <td style=\"vertical-align:middle;\">" .. info .. "</td>\n" ..
			"  <td style=\"vertical-align:middle;\">" .. field .. "</td>\n" ..
			"</tr>\n"
	end
	t = t .. "</table>\n"
	return t
end

function p.common(args)
	local t = ""
	t = t .. "= Artikel =\n"
	t = t .. "{{{standard input|free text|rows=25|editor=wikieditor}}}"
	t = t .. "{{{standard input|summary}}}"
	t = t .. "{{{standard input|minor edit}}} {{{standard input|watch}}}<br>"
	t = t .. "{{{standard input|save}}} {{{standard input|changes}}} {{{standard input|cancel}}}"
	t = t .. "__NOTOC__"
	t = t .. "__NOEDITSECTION__"
	return t
end

function p.attrListParser(attr_list, recursion)
	-- Kommandozeile zum Debuggen:
	-- mw.logObject(p.attrListParser(";A;{;B;C;};D;"))
	local attr_list_parsed = {}
	local loop_count = 0
	attr_list = str.strip(attr_list or "")
	while loop_count < 100 and attr_list ~= "" do								-- Schleifenbegrenzung
		loop_count = loop_count + 1
		local semicolon = string.find(attr_list, ";")
		local brace_open = string.find(attr_list, "\{")
		local brace_close = string.find(attr_list, "\}")
		if (brace_open ~= nil and brace_close == nil) or						-- Klammer nicht paarweise
			(brace_open == nil and brace_close ~= nil) or						-- oder
			(brace_open or 0) >= (brace_close or 1) then						-- in falscher Reihenfolge
			attr_list = ""														-- => Abbruch
		elseif semicolon == nil and												-- letzer Eintrag
			brace_open == nil and brace_close == nil then
			table.insert(attr_list_parsed, attr_list)
			attr_list = ""
		elseif semicolon ~= nil and												-- Semikolon
			(brace_open == nil or semicolon < brace_open) then					-- ggf. vor öffnender Klammer
			local attr = str.strip(string.sub(attr_list, 1, semicolon - 1))
			if attr ~= "" then
				table.insert(attr_list_parsed, attr)
			end
			attr_list = string.sub(attr_list, semicolon + 1)
		elseif brace_open ~= nil and brace_close ~= nil and						-- eingebettete Klammerung
			brace_open < brace_close then
			if not recursion then												-- Rekursionsschutz, nur 2 Ebenen bzw. 1 Selbstaufruf
				local attr_sublist =											-- Klammerinhalt
					string.sub(attr_list, brace_open + 1, brace_close - 1)
				attr_sublist = p.attrListParser(attr_sublist, true)				-- sich selbst aufrufen mit recursion = true
				if #attr_sublist > 0 then
					table.insert(attr_list_parsed, attr_sublist)
				end
			end
			attr_list = string.sub(attr_list, brace_close + 1)
		else																	-- da stimmt was nicht => Abbruch
			attr_list = ""
		end
		attr_list = str.strip(attr_list)
	end
	return attr_list_parsed
end

return p