Modul:Datei: Unterschied zwischen den Versionen

Aus FürthWiki

(mw.smw.set{["Beschreibungslänge"] = 0})
(+ Wartungsmeldung Datei-Freiattribut-Fehler Straßen/Orts-Angabe)
 
(26 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
local p = {}
local p = {}


local com = require("Module:Common")
local com = require("Modul:Common")
local str = require("Module:String")
local dev = require("Modul:Development")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local lfd = require("Modul:LinkFormDatum")
local wob = require("Modul:Wörterbuch")
local kal = require("Modul:Kalender")


function p.daten(frame, args)
local license_url = {
local title = mw.title.getCurrentTitle().text
-- Quelle: https://creativecommons.org/licenses/list.en
local extension = p.getExtension(title)
["CC BY 3.0"] = "https://creativecommons.org/licenses/by/3.0/de/deed.de",
local filekind = p.getFilekind(extension)
["CC BY-NC 3.0"] = "https://creativecommons.org/licenses/by-nc/3.0/de/deed.de",
local a, w, z
["CC BY-NC-ND 3.0"] = "https://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.de",
["CC BY-NC-SA 3.0"] = "https://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.de",
["CC BY-ND 3.0"] = "https://creativecommons.org/licenses/by-nd/3.0/de/deed.de",
["CC BY-SA 3.0"] = "https://creativecommons.org/licenses/by-sa/3.0/de/deed.de",
["CC BY 4.0"] = "https://creativecommons.org/licenses/by/4.0/deed.de",
["CC BY-NC 4.0"] = "https://creativecommons.org/licenses/by-nc/4.0/deed.de",
["CC BY-NC-ND 4.0"] = "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.de",
["CC BY-NC-SA 4.0"] = "https://creativecommons.org/licenses/by-nc-sa/4.0/deed.de",
["CC BY-ND 4.0"] = "https://creativecommons.org/licenses/by-nd/4.0/deed.de",
["CC BY-SA 4.0"] = "https://creativecommons.org/licenses/by-sa/4.0/deed.de"}
 
function p.Dateibox(frame)
-- mw.log("Dateibox(frame)")
-- mw.logObject(frame, "frame")
-- Kommando-Zeile zum Debuggen:
-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Genre"]="g1;g2",["Attribut1"]="a1",["Wert1"]="w1;w2"}}
-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Beschreibung"]="Int. Tag gegen Gewalt an Frauen: Aktive vom ''Unabhängige Frauen Fürth e. V.'' an einem Infostand, Nov. 2019"}}
-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Attribut1"]="Gebäude",["Wert1"]="Wolfringstraße 1",["Attribut2"]="Gebäude",["Wert2"]="Königstraße 86"}}
local t = ""
if wik.namespace() == "Datei" then
local frame, pargs = dev.GetFrameAndParentArgs(frame)
local title = pargs["fullpagename"] or wik.fullpagename() -- pargs["fullpagename"] zum Testen/Debuggen
local v = ""
local t = '<table class="wikitable">' ..
-- Tabellenkopf
'<th colspan="4">' .. title .. '</th>'
t = t .. "<table class = \"wikitable\">"
t = t .. "<th colspan = \"4\">" .. title .. "</th>"
if not com.isEmpty(args.Genre) then
-- Genre-Kategorien
t = t .. '<tr>'..
v = ""
'<td>[[Attribut:Genre|Genre]]</td>' ..
for i, g in ipairs(str.splitAndStrip(pargs["Genre"], ";")) do
'<td colspan="3">'..frame:callParserFunction(
if i > 1 then
'#arraymap', args.Genre, ';', 'x', '[[:Kategorie:x|x]] [[Kategorie:x]]') .. '</td>' ..
v = v .. ", "
'</tr>'
end
end
v = v .. "[[:Kategorie:" .. g .. "|" .. g .. "]]" ..
"{{#set:Genre=" .. g .. "}}[[Kategorie:" .. g .. "]]"
end
t = t .. p.attrZeile("Genre", v)
-- Liste Freiattribute und Werte auf
-- Freiattribute
for i = 1, 6 do
local aw = {}
a = 'Attribut'..i
local aw_fail = false
w = 'Wert'..i
for i = 1, 6 do
if not com.isEmpty(args[a]) then
local a = pargs["Attribut" .. i] or ""
if not com.isEmpty(args[w]) then
local w = pargs["Wert" .. i] or ""
t=t..'<tr>'..
if a ~= "" and  w ~= "" then
'<td>[[Attribut:'..args[a]..'|'..args[a]..']]</td>'..
aw[a] = (aw[a] or "") .. w .. ";" -- Werte zusammenführen
'<td colspan="3">'
elseif a ~= "" or  w ~= "" then
if args[a] == 'Gebäude' then
aw_fail = true
t=t..p.gebaeude(frame, args[w])
end
else
end
t=t..frame:callParserFunction(
if aw_fail then
'#arraymap', args[w], ';', 'x', '[['..args[a]..'::x]]')
mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler"}
end
for a, w in pairs(aw) do
if a == "Gebäude" then -- zusätzlich Gebäude nach StraßeHnr suchen und hinzufügen
local gebaeude_wert = {}
for _, e in ipairs(str.splitAndStrip(w, ";")) do -- direkt über Wertx angegebene Gebäude
gebaeude_wert[e] = true
end
local gebaeude_query = {}
for g, _ in pairs(gebaeude_wert) do -- über query ermittelte Gebäude
local q = "[[:+]][[Kategorie:Gebäude]]" ..
"[[StraßeHnr::" .. g .. "]]|?#-"
q = mw.smw.ask(q) or {}
for _, qg in ipairs(q) do
qg = qg[1]
if gebaeude_wert[qg] ~= true then -- nur, wenn nicht schon direkt angegeben (auch nil!)
gebaeude_query[qg] = true
end
end
end
end
t=t..'</td>'..
v = "" -- jetzt den Anzeigetext zusammenbauen
'</tr>'
for g, _ in pairs(gebaeude_wert) do -- erst die direkt angegebenen Gebäude
if v ~= "" then
v = v .. ", "
end
v = v .. "[[" .. a .. "::" .. g .. "]]"
end
local v_query = ""     -- dann die via query ermittelten Gebäude
for g, _ in pairs(gebaeude_query) do
if v_query ~= "" then
v_query = v_query .. ", "
end
v_query = v_query .. "[[" .. a .. "::" .. g .. "]]"
end
if v_query ~= "" then
v = v .. "<br>automatisch ermittelt über Straße/Hausnummer: " ..
v_query
end
elseif a == "Straße" then -- Straße als Freiattribute wird zu pargs["Straße"] verschoben
mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler Straßen-Angabe"}
pargs["Straße"] = (pargs["Straße"] or "") .. ";" .. w
v = ""
elseif a == "Ort" then -- Ort als Freiattribute wird zu pargs["Ort"] verschoben
mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler Orts-Angabe"}
pargs["Ort"] = (pargs["Ort"] or "") .. ";" .. w
v = ""
else
else
t=t..frame:preprocess('[[Kategorie:Freiattribut-Fehler]]')
v = p.attrValList(a, {[a] = w})
end
end
t = t .. p.attrZeile(a, v)
end
end
end
if not com.isEmpty(args.Urheber) then
-- normale Zeilen
t = t .. '<tr>'..
t = t .. p.attrZeile("Urheber", p.attrValList("Urheber", pargs),
'<td>[[Attribut:Urheber|Urheber]]</td>' ..
nil, nil, "fileinfotpl_aut") -- mit Setzen der Medienbetracher-Tags
'<td colspan="3">'..frame:callParserFunction(
t = t .. p.attrZeile("Quellangaben", p.attrVal("Quellangaben", pargs))
'#arraymap', args['Urheber'], ';', 'x', '[[Urheber::x]]')..
'</td>'..
-- Ort/Straße mit Ausblendung
'</tr>'
for _, a in ipairs{{"Straße", "ZeigeNichtInStraße"}, {"Ort", "ZeigeNichtInOrt"}} do
end
v = p.attrValList(a[1], pargs)
if v ~= "" then
t = t .. p.zeile("[[Attribut:" .. a[1] .. "|" .. wob.attrText(a[1]) .. "]]", v,
"ausgeblendet:", "[[" .. a[2] .. "::" .. (pargs[a[2]] or "Nein") .. "]]")
end
end
if not com.isEmpty(args.Quellangaben) then
-- Dateiart/Dateityp
t = t .. '<tr>'..
local extension = p.getExtension(title)
    '<td>[[Attribut:Quellangaben|Quellangaben]]</td>'..
local filekind = p.getFilekind(extension)
    '<td colspan="3">[[Quellangaben::'..args.Quellangaben..']]</td>'..
t = t .. p.attrZeile("Dateiart", "[[Dateiart::" .. filekind .. "]]",
'</tr>'
"Dateityp", "[[Dateityp::" .. extension .. "]]")
end
if not com.isEmpty(args.Ort) then
-- Erstellungsdatum/ÜberDatum
t = t .. '<tr>'..
local erstellungsdatum = pargs["Erstellungsdatum"] or ""
'<td>[[Attribut:Ort|Ort]]</td>'..
if erstellungsdatum ~= "" then
'<td>' .. frame:callParserFunction(
t = t .. p.attrZeile("Erstellungsdatum",
'#arraymap', args.Ort, ';', 'x', '[[Ort::x]]') ..'</td>'..
lfd.linkFormDate(erstellungsdatum,
'<td><b>ausblenden:</b></td>'
"Erstellungsdatum", "Erstellungstag", "Erstellungsjahr"))
z = '<td>[[ZeigeNichtInOrt::Nein]]</td>'
end
if not com.isEmpty(args.ZeigeNichtInOrt) then
ueberdatum = pargs["ÜberDatum"] or ""
z = '<td>[[ZeigeNichtInOrt::'..args.ZeigeNichtInOrt..']]</td>'
if ueberdatum ~= "" then
t = t .. p.attrZeile("ÜberDatum",
lfd.linkFormDate(ueberdatum, "ÜberDatum", "ÜberTag", "ÜberJahr"))
end
end
t = t .. z ..'</tr>'
end
if not com.isEmpty(args['Straße']) then
-- normale Zeilen
t = t .. '<tr>' ..
t = t .. p.attrZeile("Seitennummer", p.attrValList("Seitennummer", pargs))
'<td>[[Attribut:Straße|Straße]]</td>' ..
t = t .. p.attrZeile("Signatur", p.attrVal("Signatur", pargs))
'<td>' .. frame:callParserFunction(
t = t .. p.attrZeile("Länge", p.attrVal("Länge", pargs))
'#arraymap', args['Straße'], ';', 'x', '[[Straße::x]]')
 
t = t .. '</td>' ..
-- Lizenz mit Setzen der Medienbetracher-Tags
'<td><b>ausblenden:</b></td>'
local lizenz, is_cc_license =
z = '<td>[[ZeigeNichtInStraße::Nein]]</td>'
p.ccLicenseCorrection(pargs["Lizenz"] or "") -- ggf. CC-Schreibeweise korrigieren
if not com.isEmpty(args['ZeigeNichtInStraße']) then
if not is_cc_license then
z = '<td>[[ZeigeNichtInStraße::'..args['ZeigeNichtInStraße']..']]</td>'
lizenz = p.nocNcLicenseCorrection(lizenz) -- ggf. NoC-NC 1.0 Schreibweise korrigieren
end
if not com.isEmpty(lizenz) then -- Spezial-Behandlung für Media Viewer
t = t ..
"<tr>" ..
"<td class=\"fileinfo-paramfield\">'''[[Attribut:Lizenz|Lizenz]]'''</td>" ..
"<td colspan = \"3\">" ..
"<span class=\"licensetpl\">" ..
"<span class=\"licensetpl_short\">" ..
lizenz ..
"</span>" ..
"</span>" ..
"</td>" ..
"</tr>" ..
"{{#set:Lizenz=" .. lizenz .. "}}"
end
end
t = t .. z .. '</tr>'
 
end
-- normale Zeilen
t = t .. p.attrZeile("UploadCommons", p.attrVal("UploadCommons", pargs))
t = t .. p.attrZeile("Beschreibung", p.attrVal("Beschreibung", pargs),
nil, nil, "fileinfotpl_desc") -- mit Setzen der Medienbetracher-Tags
if not com.isEmpty(extension) then
-- Dateiinfo erstellen
t=t..'<tr>'..
local dateiinfo, infotext = "", ""
'<td>[[Attribut:Dateiart|Dateiart]]</td>'..
if not com.isEmpty(pargs["Beschreibung"]) then -- Beschreibung
'<td>[[Dateiart::' .. filekind .. ']]</td>'..
dateiinfo = dateiinfo ..
'<td>[[Attribut:Dateityp|Dateityp]]</td>'..
wik.wikiTextLimit(pargs["Beschreibung"], 100) -- max. Zeichenanzahl Bild-Unterschrift
'<td>[[Dateityp::' .. extension .. ']]</td>'..
if mw.ustring.len(dateiinfo) ~=
'</tr>'
mw.ustring.len(pargs["Beschreibung"]) then
end  
dateiinfo = dateiinfo .. " ..."
infotext = infotext .. pargs["Beschreibung"]
if not com.isEmpty(args.Erstellungsdatum) then
end
t = t .. '<tr>' ..
end
'<td>[[Attribut:Erstellungsdatum|Erstellungsdatum]]</td>' ..
local urheber = str.splitAndStrip(pargs["Urheber"] or "", ";") -- Urheber
'<td colspan="3">' .. frame:expandTemplate{title='LinkFormDatum', args={
if #urheber > 0 then
args.Erstellungsdatum,
for u = 1, #urheber do
'Erstellungsdatum',
if wik.pageExists(urheber[u]) then
'Erstellungstag',
urheber[u] = "[[" .. urheber[u] .. "]]"
'Erstellungsjahr'}} .. '</td>' ..
end
'</tr>'
end
end
if infotext ~= "" then
infotext = infotext .. "<br>"
if not com.isEmpty(args['ÜberDatum']) then
end
t=t..'<tr>'..
infotext = infotext .. wob.attrText("Urheber") .. ": " ..
'<td>[[Attribut:ÜberDatum|Über Datum]]</td>'..
table.concat(urheber, ", ")
'<td colspan="3">'..frame:expandTemplate{title='LinkFormDatum', args={
end
args['ÜberDatum'],
for _, d in ipairs{"Erstellungsdatum", "ÜberDatum"} do -- Erstellungsdatum, ÜberDatum
'ÜberDatum',
date = pargs[d] or ""
'ÜberTag',
if date ~= "" then
'ÜberJahr'}}..'</td>'..
if infotext ~= "" then
'</tr>'
infotext = infotext .. "<br>"
end
end
end
if not com.isEmpty(args.Seitennummer) then
end
t=t..'<tr>'..
if not com.isEmpty(lizenz) then -- Lizenz
'<td>[[Attribut:Seitennummer|Seitennummer]]</td>'..
if infotext ~= "" then
'<td colspan="3">'..frame:callParserFunction(
infotext = infotext .. "<br>"
'#arraymap', args.Seitennummer, ';', 'x', '[[Seitennummer::x]]') ..'</td>'..
end
'</tr>'
infotext = infotext .. wob.attrText("Lizenz") .. ": " .. lizenz
end
end
if infotext ~= "" then
if not com.isEmpty(args.Signatur) then
if dateiinfo ~= "" then
t=t..'<tr>'..
dateiinfo = dateiinfo .. " "
'<td>[[Attribut:Signatur|Signatur]]</td>'..
end
'<td colspan="3">[[Signatur::'..args.Signatur..']]</td>'..
dateiinfo = dateiinfo .. "{{#info:" .. infotext .. "|note}}"
'</tr>'
end
end
if dateiinfo ~= "" then
t = t .. p.zeile("[[Attribut:Dateiinfo|Dateiinfo]] '''<br>" ..
"(Bild-Unterschrift und Info-Box,<br>automatisch erstellt)''' ",
"[[Dateiinfo::" .. dateiinfo .. "]]")
end
 
-- Quellangaben plus Hinweis als Medienbetrachter-Zeile
t = t .. p.zeile("Medienbetrachter-Zeile'''<br>(automatisch erstellt)''' ",
(pargs["Quellangaben"] or "") ..
"&nbsp; &#x25BD; mehr Infos &#x25BD;", nil, nil, "fileinfotpl_src")
 
--[[ funktioniert nicht
if is_cc_license then
t = t ..
"<tr>" ..
"<td class=\"fileinfo-paramfield\">'''Lizenz-URL'''<br>(automatisch erstellt)</td>" ..
"<td colspan = \"3\">" ..
"<span class=\"licensetpl\">" ..
"<span class=\"licensetpl_link\">" ..
license_url[lizenz] ..
"</span>" ..
"</span>" ..
"</td>" ..
"</tr>"
end ]]
 
-- Erstellungsdatum ISO-Notation für Media Viewer
if erstellungsdatum ~= "" then
t = t .. p.zeile("Erstellungsdatum,<br>'''(ISO-Notation automatisch erstellt)''' ",
kal.date2ISO(erstellungsdatum), nil, nil, "fileinfotpl_date")
end
 
-- Tabellenende mit sem. Browsen und Bilder-Suche
t = t .. p.zeile("[[Bild:IconSearch.svg|16px|Semantisches Browsen|link=Spezial:Durchsuchen/{{FULLPAGENAME}}]]",
"[[Spezial:Durchsuchen/{{FULLPAGENAME}}|Semantisches Browsen]] / " ..
"{{#queryformlink:form=Abfrage Bilder|link text=Bilder-Suche}}")
t = t .. "</table>"
-- Seite setzen
t = t .. "{{#set:Seite=" .. wik.fullpagename() .. "}}"
if not com.isEmpty(args['Länge']) then
-- mw.logObject(t, "t")
t=t..'<tr>'..
t = frame:preprocess(t)
'<td>[[Attribut:Länge|Länge]]</td>'..
'<td colspan="3">'..'[[Länge::'..args['Länge']..']]</td>'..
'</tr>'
end


if not com.isEmpty(args.Lizenz) then
end -- if wik.namespace() == "Datei" then
t=t..'<tr>'..
'<td>[[Attribut:Lizenz|Lizenz]]</td>'..
'<td colspan="3">[[Lizenz::' .. args.Lizenz .. ']]</td>'..
'</tr>'
end
if not com.isEmpty(args.UploadCommons) then
t=t..'<tr>'..
'<td>[[Attribut:UploadCommons|Upload zu Commons]]</td>'..
'<td colspan="3">[[UploadCommons::' .. args.UploadCommons .. ']]</td>'..
'</tr>'
end


if not com.isEmpty(args.Beschreibung) then
-- mw.logObject(t, "t")
t=t..'<tr>'..
'<td>[[Attribut:Beschreibung|Beschreibung]]</td>'..
'<td colspan="3">[[Beschreibung::' ..args.Beschreibung .. ']]</td>'..
'</tr>'
mw.smw.set{["Beschreibungslänge"] = string.len(args.Beschreibung)}
mw.smw.set{["BeschreibungsMaxWortlänge"] = str.maxWordLen(args.Beschreibung)}
else
mw.smw.set{["Beschreibungslänge"] = 0}
end
t=t..'<tr>'..
'<td>[[Bild:IconSearch.svg|16px|semantisches Browsen|link=Spezial:Durchsuchen/{{NAMESPACE}}:{{PAGENAME}}]]</td>'..
'<td colspan="3">[[Spezial:Durchsuchen/{{NAMESPACE}}:{{PAGENAME}}|semantisches Browsen]]</td>'..
'</tr>'
t=t..'</table>'
return t
return t
end
function p.GetExtension(frame)
-- #invoke wrapper
return p.getExtension(frame.args[1])
end
end


Zeile 181: Zeile 280:
local extension = filename:match("^.+%.([^%.]+)$")
local extension = filename:match("^.+%.([^%.]+)$")
     return mw.ustring.lower(extension)
     return mw.ustring.lower(extension)
end
function p.GetFilekind(frame)
-- #invoke wrapper
return p.getFilekind(frame.args[1])
end
end


Zeile 207: Zeile 301:
end
end


function p.gebaeude(frame, wert)
function p.attrVal(a, pargs) -- Wert zu Attribut wandeln
    return frame:expandTemplate{title='Datei/Gebäude', args = {wert=wert} }
local t = ""
local v = pargs[a] or ""
if v ~= "" then
t = t .. "[[" .. a .. "::" .. v .. "]]"
end
return t
end
function p.attrValList(a, pargs) -- Werteliste zu Attributen wandeln
local t = ""
local l = str.splitAndStrip(pargs[a] or "", ";")
for i, v in ipairs(l) do
if i > 1 then
t = t .. ", "
end
t = t .. "[[" .. a .. "::" .. v .. "]]"
end
return t
end
function p.attrZeile(a1, v1, a2, v2, id1) -- Tabellenzeile mit max. 2 Attributen
local t = ""
if v1 ~= "" then
a1 = "[[Attribut:" .. a1 .. "|" .. wob.attrText(a1) .. "]]"
if a2 ~= nil and v2 ~= nil and v2 ~= "" then
a2 = "[[Attribut:" .. a2 .. "|" .. wob.attrText(a2) .. "]]"
end
t = t .. p.zeile(a1, v1, a2, v2, id1)
end
return t
end
 
function p.zeile(a1, v1, a2, v2, id1) -- Tabellenzeile mit max. 2x2 Einträgen
local t = ""
if v1 ~= "" then
t = t .. "<tr>"
if id1 == nil then
t = t .. "<td>'''" .. a1 .. "'''</td>"
else
t = t .. "<td id=\"" .. id1 .. "\" class=\"fileinfo-paramfield\">'''" .. a1 .. "'''</td>"
end
if a2 == nil or v2 == nil or v2 == "" then
t = t .. "<td colspan = \"3\">" .. v1 .. "</td>"
else
t = t .. "<td>" .. v1 .. "</td>"
t = t .. "<td>'''" .. a2 .. "'''</td>"
t = t .. "<td>" .. v2 .. "</td>"
end
t = t .. "</tr>"
end
return t
end
 
function p.ccLicenseCorrection(lic_text) -- Schreibweise CC-Lizenzen korrigieren
local lic_text_fixed = string.upper(lic_text)
local is_cc_license = false
if string.sub(lic_text_fixed, 1, 3) == "CC " or -- Beginn mit "CC " or "CC-"?
string.sub(lic_text_fixed, 1, 3) == "CC-" then
is_cc_license = true
if string.sub(lic_text_fixed, 3, 3) == "-" then -- Bindestrich hinter "CC" entfernen
lic_text_fixed = "CC " .. string.sub(lic_text_fixed, 4)
end
local version_hyphen_start, version_hyphen_end = -- Bindestrich vor Version entfernen
string.find(lic_text_fixed,"-%d")
if version_hyphen_start ~= nil then
lic_text_fixed =
string.sub(lic_text_fixed, 1, version_hyphen_start - 1) ..
" " .. string.sub(lic_text_fixed, version_hyphen_start + 1)
end
else
lic_text_fixed = lic_text
end
return lic_text_fixed, is_cc_license
end
 
function p.nocNcLicenseCorrection(lic_text) -- Schreibweise NoC-NC 1.0 Lizenz korrigieren
local lic_text_fixed = lic_text
if string.upper(lic_text) == "NOC-NC-1.0" or
string.upper(lic_text) == "NOC-NC 1.0" then
lic_text_fixed = "NoC-NC 1.0"
end
return lic_text_fixed
end
 
function p.LicenseCorrection(frame) -- Schreibweise CC- und NoC-NC 1.0 Lizenz korrigieren
local lizenz = frame.args["Lizenz"] or ""
lizenz = p.ccLicenseCorrection(lizenz)
lizenz = p.nocNcLicenseCorrection(lizenz)
return lizenz
end
end


return p
return p

Aktuelle Version vom 14. Januar 2026, 11:36 Uhr

local p = {}

local com = require("Modul:Common")
local dev = require("Modul:Development")
local str = require("Modul:String")
local wik = require("Modul:Wiki")
local lfd = require("Modul:LinkFormDatum")
local wob = require("Modul:Wörterbuch")
local kal = require("Modul:Kalender")

local license_url = {
	-- Quelle: https://creativecommons.org/licenses/list.en
	["CC BY 3.0"] = "https://creativecommons.org/licenses/by/3.0/de/deed.de",
	["CC BY-NC 3.0"] = "https://creativecommons.org/licenses/by-nc/3.0/de/deed.de",
	["CC BY-NC-ND 3.0"] = "https://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.de",
	["CC BY-NC-SA 3.0"] = "https://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.de",
	["CC BY-ND 3.0"] = "https://creativecommons.org/licenses/by-nd/3.0/de/deed.de",
	["CC BY-SA 3.0"] = "https://creativecommons.org/licenses/by-sa/3.0/de/deed.de",
	["CC BY 4.0"] = "https://creativecommons.org/licenses/by/4.0/deed.de",
	["CC BY-NC 4.0"] = "https://creativecommons.org/licenses/by-nc/4.0/deed.de",
	["CC BY-NC-ND 4.0"] = "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.de",
	["CC BY-NC-SA 4.0"] = "https://creativecommons.org/licenses/by-nc-sa/4.0/deed.de",
	["CC BY-ND 4.0"] = "https://creativecommons.org/licenses/by-nd/4.0/deed.de",
	["CC BY-SA 4.0"] = "https://creativecommons.org/licenses/by-sa/4.0/deed.de"}

function p.Dateibox(frame)
--	mw.log("Dateibox(frame)")
--	mw.logObject(frame, "frame")
	-- Kommando-Zeile zum Debuggen:
	-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Genre"]="g1;g2",["Attribut1"]="a1",["Wert1"]="w1;w2"}}
	-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Beschreibung"]="Int. Tag gegen Gewalt an Frauen: Aktive vom ''Unabhängige Frauen Fürth e. V.'' an einem Infostand, Nov. 2019"}}
	-- =p.Dateibox{pargs={["fullpagename"]="Datei:test.jpg",["Attribut1"]="Gebäude",["Wert1"]="Wolfringstraße 1",["Attribut2"]="Gebäude",["Wert2"]="Königstraße 86"}}
	local t = ""
	
	if wik.namespace() == "Datei" then
	
		local frame, pargs = dev.GetFrameAndParentArgs(frame)
		local title = pargs["fullpagename"] or wik.fullpagename()				-- pargs["fullpagename"] zum Testen/Debuggen
		local v = ""
	
		-- Tabellenkopf
		t = t .. "<table class = \"wikitable\">"
		t = t .. "<th colspan = \"4\">" .. title .. "</th>"
	
		-- Genre-Kategorien
		v = ""
		for i, g in ipairs(str.splitAndStrip(pargs["Genre"], ";")) do
			if i > 1 then
				v = v .. ", "
			end
			v = v .. "[[:Kategorie:" .. g .. "|" .. g .. "]]" ..
				"{{#set:Genre=" .. g .. "}}[[Kategorie:" .. g .. "]]"
		end
		t = t .. p.attrZeile("Genre", v)
	
		-- Freiattribute
		local aw = {}
		local aw_fail = false
		for i = 1, 6 do
			local a = pargs["Attribut" .. i] or ""
			local w = pargs["Wert" .. i] or ""
			if a ~= "" and  w ~= "" then
				aw[a] = (aw[a] or "") .. w .. ";"								-- Werte zusammenführen
			elseif a ~= "" or  w ~= "" then
				aw_fail = true
			end
		end
		if aw_fail then
			mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler"}
		end
		for a, w in pairs(aw) do
			if a == "Gebäude" then												-- zusätzlich Gebäude nach StraßeHnr suchen und hinzufügen
				local gebaeude_wert = {}
				for _, e in ipairs(str.splitAndStrip(w, ";")) do				-- direkt über Wertx angegebene Gebäude
					gebaeude_wert[e] = true
				end
				local gebaeude_query = {}
				for g, _ in pairs(gebaeude_wert) do								-- über query ermittelte Gebäude
					local q = "[[:+]][[Kategorie:Gebäude]]" ..
						"[[StraßeHnr::" .. g .. "]]|?#-"
					q = mw.smw.ask(q) or {}
					for _, qg in ipairs(q) do
						qg = qg[1]
						if gebaeude_wert[qg] ~= true then						-- nur, wenn nicht schon direkt angegeben (auch nil!)
							gebaeude_query[qg] = true
						end
					end
				end
				v = ""				 											-- jetzt den Anzeigetext zusammenbauen
				for g, _ in pairs(gebaeude_wert) do								-- erst die direkt angegebenen Gebäude
					if v ~= "" then
						v = v .. ", "
					end
					v = v .. "[[" .. a .. "::" .. g .. "]]"
				end
				local v_query = ""	    										-- dann die via query ermittelten Gebäude
				for g, _ in pairs(gebaeude_query) do
					if v_query ~= "" then
						v_query = v_query .. ", "
					end
					v_query = v_query .. "[[" .. a .. "::" .. g .. "]]"
				end
				if v_query ~= "" then
					v = v .. "<br>automatisch ermittelt über Straße/Hausnummer: " ..
						v_query
				end
			elseif a == "Straße" then											-- Straße als Freiattribute wird zu pargs["Straße"] verschoben
				mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler Straßen-Angabe"}
				pargs["Straße"] = (pargs["Straße"] or "") .. ";" .. w
				v = ""
			elseif a == "Ort" then												-- Ort als Freiattribute wird zu pargs["Ort"] verschoben
				mw.smw.set{["Wartungsmeldung"]="Datei-Freiattribut-Fehler Orts-Angabe"}
				pargs["Ort"] = (pargs["Ort"] or "") .. ";" .. w
				v = ""
			else
				v = p.attrValList(a, {[a] = w})
			end
			t = t .. p.attrZeile(a, v)
		end
	
		-- normale Zeilen
		t = t .. p.attrZeile("Urheber",			p.attrValList("Urheber", pargs),
			nil, nil, "fileinfotpl_aut")										-- mit Setzen der Medienbetracher-Tags
		t = t .. p.attrZeile("Quellangaben",	p.attrVal("Quellangaben", pargs))
	
		-- Ort/Straße mit Ausblendung
		for _, a in ipairs{{"Straße", "ZeigeNichtInStraße"}, {"Ort", "ZeigeNichtInOrt"}} do
			v = p.attrValList(a[1], pargs)
			if v ~= "" then
				t = t .. p.zeile("[[Attribut:" .. a[1] .. "|" .. wob.attrText(a[1]) .. "]]", v,
					"ausgeblendet:", "[[" .. a[2] .. "::" .. (pargs[a[2]] or "Nein") .. "]]")
			end
		end
	
		-- Dateiart/Dateityp
		local extension = p.getExtension(title)
		local filekind = p.getFilekind(extension)
		t = t .. p.attrZeile("Dateiart", "[[Dateiart::" .. filekind .. "]]", 
			"Dateityp", "[[Dateityp::" .. extension .. "]]")
	
		-- Erstellungsdatum/ÜberDatum
		local erstellungsdatum = pargs["Erstellungsdatum"] or ""
		if erstellungsdatum ~= "" then
			t = t .. p.attrZeile("Erstellungsdatum", 
				lfd.linkFormDate(erstellungsdatum,
					"Erstellungsdatum", "Erstellungstag", "Erstellungsjahr"))
		end
		ueberdatum = pargs["ÜberDatum"] or ""
		if ueberdatum ~= "" then
			t = t .. p.attrZeile("ÜberDatum",
				lfd.linkFormDate(ueberdatum, "ÜberDatum", "ÜberTag", "ÜberJahr"))
		end
	
		-- normale Zeilen
		t = t .. p.attrZeile("Seitennummer",	p.attrValList("Seitennummer", pargs))
		t = t .. p.attrZeile("Signatur",		p.attrVal("Signatur", pargs))
		t = t .. p.attrZeile("Länge",			p.attrVal("Länge", pargs))

		-- Lizenz mit Setzen der Medienbetracher-Tags
		local lizenz, is_cc_license =
			p.ccLicenseCorrection(pargs["Lizenz"] or "")						-- ggf. CC-Schreibeweise korrigieren
		if not is_cc_license then
			lizenz = p.nocNcLicenseCorrection(lizenz)							-- ggf. NoC-NC 1.0 Schreibweise korrigieren
		end
		if not com.isEmpty(lizenz) then											-- Spezial-Behandlung für Media Viewer
			t = t ..
				"<tr>" ..
					"<td class=\"fileinfo-paramfield\">'''[[Attribut:Lizenz|Lizenz]]'''</td>" ..
					"<td colspan = \"3\">" ..
						"<span class=\"licensetpl\">" ..
							"<span class=\"licensetpl_short\">" ..
								lizenz ..
							"</span>" ..
						"</span>" ..
					"</td>" ..
				"</tr>" ..
				"{{#set:Lizenz=" .. lizenz .. "}}"
		end

		-- normale Zeilen
		t = t .. p.attrZeile("UploadCommons",	p.attrVal("UploadCommons", pargs))
		t = t .. p.attrZeile("Beschreibung",	p.attrVal("Beschreibung", pargs),
					nil, nil, "fileinfotpl_desc")								-- mit Setzen der Medienbetracher-Tags
	
		-- Dateiinfo erstellen
		local dateiinfo, infotext = "", ""
		if not com.isEmpty(pargs["Beschreibung"]) then							-- Beschreibung
			dateiinfo = dateiinfo ..
				wik.wikiTextLimit(pargs["Beschreibung"], 100)					-- max. Zeichenanzahl Bild-Unterschrift
			if mw.ustring.len(dateiinfo) ~=
				mw.ustring.len(pargs["Beschreibung"]) then
				dateiinfo = dateiinfo .. " ..."
				infotext = infotext .. pargs["Beschreibung"]
			end
		end
		local urheber = str.splitAndStrip(pargs["Urheber"] or "", ";")			-- Urheber
		if #urheber > 0 then
			for u = 1, #urheber do
				if wik.pageExists(urheber[u]) then
					urheber[u] = "[[" .. urheber[u] .. "]]"
				end
			end
			if infotext ~= "" then
				infotext = infotext .. "<br>"
			end
			infotext = infotext .. wob.attrText("Urheber") .. ": " ..
				table.concat(urheber, ", ")
		end
		for _, d in ipairs{"Erstellungsdatum", "ÜberDatum"} do					-- Erstellungsdatum, ÜberDatum
			date = pargs[d] or ""
			if date ~= "" then
				if infotext ~= "" then
					infotext = infotext .. "<br>"
				end
			end
		end
		if not com.isEmpty(lizenz) then											-- Lizenz
			if infotext ~= "" then
				infotext = infotext .. "<br>"
			end
			infotext = infotext .. wob.attrText("Lizenz") .. ": " .. lizenz
		end
		if infotext ~= "" then
			if dateiinfo ~= "" then
				dateiinfo = dateiinfo .. " "
			end
			dateiinfo = dateiinfo .. "{{#info:" .. infotext .. "|note}}"
		end
		if dateiinfo ~= "" then
			t = t .. p.zeile("[[Attribut:Dateiinfo|Dateiinfo]] '''<br>" ..
				"(Bild-Unterschrift und Info-Box,<br>automatisch erstellt)''' ",
				"[[Dateiinfo::" .. dateiinfo .. "]]")
		end

		-- Quellangaben plus Hinweis als Medienbetrachter-Zeile
		t = t .. p.zeile("Medienbetrachter-Zeile'''<br>(automatisch erstellt)''' ",
			(pargs["Quellangaben"] or "") ..
			"&nbsp; &#x25BD; mehr Infos &#x25BD;", nil, nil, "fileinfotpl_src")

		--[[ funktioniert nicht
		if is_cc_license then
			t = t ..
				"<tr>" ..
					"<td class=\"fileinfo-paramfield\">'''Lizenz-URL'''<br>(automatisch erstellt)</td>" ..
					"<td colspan = \"3\">" ..
						"<span class=\"licensetpl\">" ..
							"<span class=\"licensetpl_link\">" ..
								license_url[lizenz] ..
							"</span>" ..
						"</span>" ..
					"</td>" ..
				"</tr>"
		end ]]

		-- Erstellungsdatum ISO-Notation für Media Viewer
		if erstellungsdatum ~= "" then
			t = t .. p.zeile("Erstellungsdatum,<br>'''(ISO-Notation automatisch erstellt)''' ",
				kal.date2ISO(erstellungsdatum), nil, nil, "fileinfotpl_date")
		end

		-- Tabellenende mit sem. Browsen und Bilder-Suche
		t = t .. p.zeile("[[Bild:IconSearch.svg|16px|Semantisches Browsen|link=Spezial:Durchsuchen/{{FULLPAGENAME}}]]",
			"[[Spezial:Durchsuchen/{{FULLPAGENAME}}|Semantisches Browsen]] / " ..
			"{{#queryformlink:form=Abfrage Bilder|link text=Bilder-Suche}}")
		t = t .. "</table>"
		
		-- Seite setzen
		t = t .. "{{#set:Seite=" .. wik.fullpagename() .. "}}"
	
--		mw.logObject(t, "t")
		t = frame:preprocess(t)

	end	-- if wik.namespace() == "Datei" then

--	mw.logObject(t, "t")
	return t
end

function p.getExtension(filename)
	local extension = filename:match("^.+%.([^%.]+)$")
    return mw.ustring.lower(extension)
end

function p.getFilekind(filetype)
	local t = {
		["Bild"] = {"webp", "png", "gif", "jpg", "jpeg", "svg"},
		["Dokument"] = {"pdf"},
		["Audio"] = {"mp3", "ogg", "oga", "flac", "opus", "wav"},
		["Midi"] = {"midi", "mid"},
		["Video"] = {"webm", "mp4", "m4v", "ogv", "mpg", "mpeg"},
		["3D-Modell"] = {"obj", "glb", "gltf"},
	}
	for key, values in pairs(t) do
        for _, value in ipairs(values) do
            if value == filetype then
                return key  -- Bricht beide Schleifen ab und gibt den Key zurück
            end
        end
	end
	return ""  -- Gib leeren String zurück, wenn nichts gefunden wurde
end

function p.attrVal(a, pargs)													-- Wert zu Attribut wandeln
	local t = ""
	local v = pargs[a] or ""
	if v ~= "" then
		t = t .. "[[" .. a .. "::" .. v .. "]]"
	end
	return t
end
	
function p.attrValList(a, pargs)												-- Werteliste zu Attributen wandeln
	local t = ""
	local l = str.splitAndStrip(pargs[a] or "", ";")
	for i, v in ipairs(l) do
		if i > 1 then
			t = t .. ", "
		end
		t = t .. "[[" .. a .. "::" .. v .. "]]"
	end
	return t
end
	
function p.attrZeile(a1, v1, a2, v2, id1)										-- Tabellenzeile mit max. 2 Attributen
	local t = ""
	if v1 ~= "" then
		a1 = "[[Attribut:" .. a1 .. "|" .. wob.attrText(a1) .. "]]"
		if a2 ~= nil and v2 ~= nil and v2 ~= "" then
			a2 = "[[Attribut:" .. a2 .. "|" .. wob.attrText(a2) .. "]]"
		end
		t = t .. p.zeile(a1, v1, a2, v2, id1)
	end
	return t
end

function p.zeile(a1, v1, a2, v2, id1)											-- Tabellenzeile mit max. 2x2 Einträgen
	local t = ""
	if v1 ~= "" then
		t = t .. "<tr>"
		if id1 == nil then
			t = t .. "<td>'''" .. a1 .. "'''</td>"
		else
			t = t .. "<td id=\"" .. id1 .. "\" class=\"fileinfo-paramfield\">'''" .. a1 .. "'''</td>"
		end
		if a2 == nil or v2 == nil or v2 == "" then
			t = t .. "<td colspan = \"3\">" .. v1 .. "</td>"
		else
			t = t .. "<td>" .. v1 .. "</td>"
			t = t .. "<td>'''" .. a2 .. "'''</td>"
			t = t .. "<td>" .. v2 .. "</td>"
		end
		t = t .. "</tr>"
	end
	return t
end

function p.ccLicenseCorrection(lic_text)										-- Schreibweise CC-Lizenzen korrigieren
	local lic_text_fixed = string.upper(lic_text)
	local is_cc_license = false
	if string.sub(lic_text_fixed, 1, 3) == "CC " or								-- Beginn mit "CC " or "CC-"?
		string.sub(lic_text_fixed, 1, 3) == "CC-" then
		is_cc_license = true
		if string.sub(lic_text_fixed, 3, 3) == "-" then							-- Bindestrich hinter "CC" entfernen
			lic_text_fixed = "CC " .. string.sub(lic_text_fixed, 4)
		end
		local version_hyphen_start, version_hyphen_end =						-- Bindestrich vor Version entfernen
			string.find(lic_text_fixed,"-%d")
		if version_hyphen_start ~= nil then
			lic_text_fixed =
				string.sub(lic_text_fixed, 1, version_hyphen_start - 1) ..
				" " .. string.sub(lic_text_fixed, version_hyphen_start + 1)
		end
	else
		lic_text_fixed = lic_text
	end
	return lic_text_fixed, is_cc_license
end

function p.nocNcLicenseCorrection(lic_text)										-- Schreibweise NoC-NC 1.0 Lizenz korrigieren
	local lic_text_fixed = lic_text
	if string.upper(lic_text) == "NOC-NC-1.0" or
		string.upper(lic_text) == "NOC-NC 1.0" then
		lic_text_fixed = "NoC-NC 1.0"
	end
	return lic_text_fixed
end

function p.LicenseCorrection(frame)												-- Schreibweise CC- und NoC-NC 1.0 Lizenz korrigieren
	local lizenz = frame.args["Lizenz"] or ""
	lizenz = p.ccLicenseCorrection(lizenz)
	lizenz = p.nocNcLicenseCorrection(lizenz)
	return lizenz
end

return p