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