Modul:Flagge
- Die Arbeitsweise und Funktionen ergeben sich aus den im Code eingefügten Erklärungen.
Das gesamte Modul müsste noch optimiert werden. Einige kleine unschöne Parameterumsetzungen müssten verbessert werden. Derzeit werden in der deutschen Version AUSSCHLIESSLICH auffällige oder gemeldete Funktionsfehler notdürftig behoben. Weitere Features sind nur in den Modulen meiner ausländischen Freunde enthalten. Die spezielle Verarbeitung von Wappen und allg. Logos, die einer besonderen Breitenberechnung bedürfen, werden hier vorterst nicht übernommen.
- Grund der Einschränkung
Ein besorgter, wenn in diesem Fall auch etwas oberflächlicher User fühlte sich bemüßigt, Vorlage:Flagge mit einen Warnhinweis zu versehen, der mangelhafte Funktionalität, Fehlerverarbeitung und allgemein Wartung des Moduls sowie für ihn zu üppige Funktionalität und Universalität bemängelt. Einige der Argumente, die auch von seiner Fangemeinde nachgeplappert werden, sind schlicht lächerlich, da er vermutlich die Funktionen nicht überblickt und auch nie die vorlaufende Diskussion beachtet hat. Eher ist es Frust, dass eine vor vielen Jahren begonnene Portierung von en:Template:Flagicon bzw. en:Module:Flagg nie funktionsfähig umgesetzt wurde und weiterhin lang und breit diskutiert wird (inzwischen wieder sanft eingeschlafen).
Logisch, Verbesserungen sind sinnvoll und angebracht. Doch der de-WP gilt: Konfrontation geht vor Kommunikation und und es gibt nur zwei Meinungen: „Die eigene Auffassung und die falsche“. Konstruktive, freundliche Zusammenarbeit kenne ich nur bei den fremdsprachigen Wikis.
--[[ Flagge Version 11c BETA, 2020-02-19
Formatierung von alternativer Ländervorlage mit Flagge und diverse zusäzliche Funktionen
muss noch "geputzt" werden
----
Grundübel sind das Fehlen der Formatboxen und das Fehlverhalten von mw-datatable.
Das macht einige eigenartige Konstruktionen nötig, z.B. Tabelle in Tabelle, style-Überschreibungen
--]]
-- Module globals
local flagborder = ''
local fli = {}; local werte={}
local hstd = 12 -- Logohöhe default -- ist via h=??? beeinflussbar
local lang = mw.getContentLanguage():getCode()
local logowidth = 20 -- die historische Weitenangabe
local messagePrefix = "lua-module-Flagge-"
local p = {}
local width = 20 -- nominelle Standartbreite bei 12 hstd
local wstd = 31 -- mit Rand, gemessen an Katar (28) Iran hatte aber schon 3:1, müsste hier also ~51 sein
local listlang= "Modul:Sprachen"
-- local listlang = "Modul:Benutzer:Gadacz/Sprachen"
local pl={'l','f','lf','w','h','b','o','lt','q','a','p','s'}
local tblx, dd, dl1, dl2, dt1, dt2, tdm = 0, 0, '', '', '', ''
local tblxw = 100
local ksp, sp = ', ', ' '
local ref = string.format("%c%c%c", 127, 39, 34) -- um <ref zu erkennen
local nomobile = " nomobile"
local function tu(a,z) -- wandelt in Versalien und extrahiert erstes Zeichen oder Anzahl z
return string.sub(string.upper(a), 1, z or 1)
end
local function emph(lt, was) -- Emphasis, Schriftauszeichnung für Linktext gem. Vorlagen-Parameter 'd= ...' (Dekoration)
local ende, css = '',''
if not was or #was < 1 then return lt or '' end -- undekorierte Rückgabe des Linktextes
if #was <= 6 then -- was größer ist, wird eine direkt eingegebene css-Anweisung sein
was = string.upper(was)
for e in string.gmatch(was, ".") do -- teilen falls mehrere Parameter
if e == 'F' or e == 'B' then css = css .. "font-weight:bold;"
elseif e == 'K' or e == 'I' then css = css .. "font-style:italic;"
elseif e == 'U' then css = css .. "text-decoration:underline;"
elseif e == 'V' then css = css .. "text-transform:uppercase;"
elseif e == 'C' then css = css .. "font-variant:small-caps;"
elseif e == 'G' then css = css .. "letter-spacing:0.3em;"
end -- if e
end -- for e
else -- if #e
was = string.gsub(was,"['%\"]+",'') -- evtl. Anführungszeichen rasieren
css = string.gsub(was,"[%w]+%s*=%s*",'') -- falls versehentlich mit 'string=' eingeleitet wurde
end -- if #e
-- print(#was,css,was)
if #css > 1 then css = '<span style="' .. css .. '">'; ende = "</span>" end
return css .. lt .. ende
end
local function loli(v) --
local lang = mw.getContentLanguage():getCode()
local Liste = "Modul:Flagge/Flaglist_" .. lang .. '_' .. tu(v)
return mw.loadData(Liste)
end
local function nbsp(k) --Hier werden Leerzeichen durch ' ' ersetzt => NOWRAP außer bei v=1 (und mehr)
if tblx == 0 then k = k:gsub(" ", " ") end
return k
end -- function nbsp
local function nopi(k) --Hier werden Pipezeichen durch ' ' ersetzt => NOWRAP
return k:gsub("|", " ")
end -- function nbsp
local function putze(r)
r = r:gsub(',%s*,%s*,*',', ') -- Mehrfachkomma reduzieren
r = r:gsub('[%.%?!,]+%s*$','') -- Satzzeichen am Zeilenende streichen
r = r:gsub('%s+([,%.;:!%?\'\"])', '%1') -- überflüssige Leerzeichen vor Satzzeichen löschen
r = r:gsub('%s* %s*', ' ') -- überflüssige Leerzeichenkombinationen auf 1 nbsp reduzieren
r = r:gsub(' <', '<') --REFs
r = r:gsub('^%s+', '') -- Space am Zeilenbeginn
r = r:gsub('span> ', 'span>') -- Space am Zeilenbeginn nach Sortiereintrag ( ) . % + - * ? [ ^ $
-- r = r:gsub(',$', '>') -- abschließendes Komma
return r
end -- putze(r)
local function nnbsp(k,i) --[[ Hier wird statt ' ' ein schmales, geschütztes
Leerzeichen => NOWRAP eingefügt bzw. (wenn k) ersetzt ' ' ]]
if k then
i = i or 15 --[[ falls ohne i dann nur die SPACE innerhalb der 15 Zeichen
ersetzen, um sehr langen Texten (siehe GBR) Umbruch zu ermöglichen ]]
return string.gsub(string.sub(k, 1, i)," ", " ") .. string.sub (k, i+1)
else return " " -- evtl. wäre ' ' besser
end -- if k
end -- function nnbsp
local function sortclean(k)
-- In der Liste stören im Lemma vorhandene Sonder-/Satzzeichen bei der Sortierung. Daher radikal putzen
return k:gsub("%A+", "")
end
local function round(val,decimal) -- css will bei zu vielen Nachkommastellen streiken
if (decimal) then
return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
else
return math.floor(val + 0.5)
end
end
local function fpic(o,werte,logowidth,flglnk) -- setzt die Grafik mit entsprechenden Links zusammen
local noflag = 'Flag_of_None.svg'
if nopic then return end
local fl = tonumber(flglnk)
local h, w
local nowrap = 'white-space:nowrap;'
local f = werte.f or noflag-- Grafik/Flagge
if werte.h and werte.w then --falls es Größeneintrag gibt, ...
h = werte.h; w = werte.w -- Höhe, Breite
else -- ... sonst via FileMedia.get... Das ist aber 'teurer'!
local FileMedia = require("Module:FileMedia")
FileMedia = FileMedia.FileMedia()
h = FileMedia.getHeight(f) -- Höhe
w = FileMedia.getWidth(f) -- Breite
end
flgpic = f -- Bilddatei (File: ..) -- statt Datei: da 'international'
if fl == 1 then flglnk = '|link=' .. (werte.lf or flgpic) -- Flaggenlink
elseif fl == 2 then flglnk = '|link=' .. werte.l or linkziel -- Link der Flagge auf Land
elseif fl == 0 then flglnk = ''
else flglnk = '|link=' .. linkziel or flgpic
end -- if tonumber(flglnk)
if werte.b == 1 then flagborder = '|border' or '' end -- Bildrand 'international'
--[[ setzt den Bildaufruf zusammen
dabei werden Größenangaben aus der Liste berücksichtigt und ggf. gem WIDTH neu berechnet.
Ein Problem bleibt bei Listen/Tabellen, die z.B. historische Flagge vom Iran enthalten, da dort 3:1 --]]
if logohight then
zoom = round(logohight/hstd, 2)
hightreal = logohight
else
zoom = round(logowidth/width, 2)
hightreal = hstd * zoom -- Errechnete Höhe bei WIDTH-Angabe
end -- if logohight
divi = round(h/w,3)
margins = wstd*zoom-hstd*zoom/h*w
if margins < 0 then margins = 0 end -- Versuch, überbreite Flaggen wie die alte Iran und UNESCO stümperhaft auszugleichen
margin_half = margins/2
local file = '[[File:' .. flgpic .. '|x' .. hightreal .. 'px' .. flglnk .. flagborder .. '|class="noviewer ' .. nomobile .. '"]]'
if o == 'C' then return file -- .. ' '
elseif o == 'W' then -- Zeilenumbruch (wrap) erlaubt, Flagge an Text
rightmrg, leftmrg, nowrap = 0, 0, ''
elseif o == 'L' then -- linksbündig
rightmrg, leftmrg = margins, 0
elseif o == 'R' then -- rechtsbündig
rightmrg, leftmrg = 0, margins
elseif o == 'N' then --
rightmrg, leftmrg = 0, 0
else
leftmrg, rightmrg = margin_half, margin_half
end -- if o
return '<span style="margin:0px ' .. rightmrg .. 'px 0px ' .. leftmrg .. 'px;' .. nowrap .. '">' .. file .. '</span>', nowrap
end
local function nonum(key) -- filtert Parameter-Nummern wie 1 oder "1" raus
if type(tonumber(key)) ~= "number" then return true end
end
local function is_in(tab, val)
for index, value in ipairs(tab) do
if value == val then return true end
end
return false
end
local function orf(v)
v = tu(v)
if v == 'C' then nomobile = "" end
local t = {'L', 'R', 'N', 'W', 'C', '#'}
--[[ L: links-/leftbündig
R: rechts-/rightbündig
N: Flagge direkt an Text, nowrap
W: Flagge direkt an Text, Zeilenumbruch möglich
#: Kein Linktext, nur Flagge
C: wie # aber ohne Lerräume --]]
for index, value in ipairs(t) do
if value == v then
return v
end -- if value
end -- for ...
return false
end -- orf(v)
local function split(s) -- Trennt kombinierte Spracheingaben wie აფხაზეთი|Apchaseti
local erg = {}; local trenner='|'
local starte = 1
local sps, spe = s:find('|',1)
while sps do
table.insert(erg,s:sub(starte,sps-1))
starte = spe+1
sps, spe = s:find(trenner,starte)
end -- while sps
table.insert(erg,s:sub(starte))
if erg then
r1 = nnbsp(erg[1]) or ''; r0 = r1
if erg[2] then r2 = " ''" .. nnbsp(erg[2]) .. "''"
r0 = r1 .. " ''" .. r2 .. "''"
end -- if erg[2]
end -- if erg
return r0, r1, (r2 or '')
end -- function split
local function ssl(lkz,r,val) -- wird nur für dewiki gebraucht, da Vorlage:lang zu viel Mist baut
local ret = ', '; local geladen={}
if tblx > 0 then ret = ',<br>' end -- muss cr statt Space einbringen
local schreibrichtung = ' dir="ltr" '; local nenne ='?'
if type(tonumber(lkz)) ~= "number" then
if #r > 1 and dd ~= 1 then ret = ', ' end
geladen = mw.loadData(listlang)
v0, v1, v2 = split(val) -- v0 wird hier nicht gebraucht
local sprach = geladen[lkz]
if sprach.n then -- einfach Lemma übernehmen
nenne=sprach.n
else
nenne = sprach.l or ''
nenne, anz = string.gsub(nenne,"%s+%(Sprache%)", "")
if anz < 1 then
nenne, anz = string.gsub(nenne,"e%sSprache[n]*", "")
if anz >0 then nenne = string.lower(nenne) end
end -- if anz
end -- if sprach.n
if sprach.d and tu(sprach.d,3) == "RTL" then schreibrichtung = ' dir="rtl" ' end
--[=[ ret = ret .. '<span style="white-space:nowrap">[[' .. sprach.l .. '|'
.. nenne .. ']] <bdo' .. schreibrichtung .. ' lang="' .. lkz .. '">'
.. v1 .. '</bdo></span> ' .. nnbsp(v2,20)
--]=]
ret = ret .. '[[' .. sprach.l .. '|'
.. nenne .. ']] <bdo' .. schreibrichtung .. ' lang="' .. lkz .. '">'
.. v1 .. '</bdo> ' .. nnbsp(v2,15)
end -- if type
return ret
end
local function tail(v,n) -- bastelt das "Schwänzle" zusammen (falls es entsprechende Listeneinträge gibt)
local r=', '
linktext = linktext or v
n = tonumber(n)
if n <= 0 then n=math.abs(n); nopic=1 end
if (type(v) == "table") then
for lkz, value in pairs(v) do
if lkz == 1 and n == 2 then return r .. split(value)
elseif n == 3 or n == 4 then r = r .. ssl(lkz,r,value)
elseif n == 5 then
if nonum(lkz) then
r = r .. ssl(lkz,r,value)
else r = r .. ', ' .. split(value)
end -- if nonum(lkz)
else
if lkz==1 then linktext = split(value) end -- default
end -- elseif n == 5
end -- for
else
if n == 1 then linktext = v; r='' end
end -- (type(v))
return r
end -- function tail(v,n)
local function linkex(txt) --[[löst Links auf, da die sich überscneiden können, wenn der Text zum Linktext wird
warum eine Kombi bei den regex nicht funktioniert, bleibt mir schleierhaft --]]
local ret, anz = string.gsub(txt, '<ref>[^%<.]*</ref>', '') -- strip HTMLs mit eingschlossenem Text (hier <ref>, könnte man zu <div>, <span> .... erweitern)
ret, anz = string.gsub(ret, '(%[[%l%.]%S*%s', '') -- strip ‚[http... NAME]‘ → ‚NAME]‘
ret, anz = string.gsub(ret, '%[%[.*|', '') --strip [[Lemma|Wort]] → ‚WORT]]‘
ret, anz = string.gsub(ret, '%[', '') -- strip verbleibende ‚[‘
ret, anz = string.gsub(ret, ']', '') -- strip alle verbleibenden ‚]‘
return ret
end
function valkombi(fl,val)
local tbl = {}
if not fl[val] then return {Ergebnis="<span class=\"error\">Falsche Eingabe</span>"} end
local valp = fl[val].p or string.sub(val, 1, 3) -- Feststellung, ob ein "Mastereintrag" existiert. valp für parenteintrag via
if not fl[valp] then valp = string.sub(val, 1, 3) end -- könnte sich ja ein Fehler eingeschlichen haben
if not fl[valp] then -- z.B. wenn Vorlage = GB-SCO, dann bringt 'GB-' nix
valp = fl[val].p or val
end
for nix, key in ipairs(pl) do
tbl[key] = fl[val][key] or (fl[valp][key] or nil)
--[[ sammelt die Listeneinträge bei Priorität
1. Flaggenkey (z.B. ARB-1977)
2. Listeneintrag p='Sonstwas'
3. verkürzter 'Master-Eintrag' ARB --]]
end -- for nix, key
return tbl
end -- getkey
local function exhtml(a)
return string.gsub(a, '%s+/>', '>') -- Lua-Murks korrigieren, macht aus XHTML <br /> ein <br />
end --exhtml
local function a2h(v) -- nur zu Testzwecken via x=...
local u="'''U=''' " .. mw.text.unstrip(v)
local erg="'''A='''" .. v .. "''' X='''"
local ergd="'''D=''' "
for i=1, #v do
zwerg= string.byte(v, i)
erg= erg .. string.format("0x%x ", zwerg)
ergd= ergd .. string.format("%d; ", zwerg)
end
return erg .. "<br>" .. ergd .. "<br>" .. u
end
local function trim(s) -- entfernt überflüssige führende und/oder anhängende Leerzeichen
return s:match "^%s*(.-)%s*$"
end
function p.f(frame)
fli = {}
local a = frame:getParent():getTitle() -- daher kommt XYZ
local kzn = a:gsub("(%C+):(%C+)", "%2") --Kennzeichen aus dem Vorlagennamen extrahieren
if kzn == 'Flagge' then kzn = nil else fli = loli(kzn); flix = fli end
--[[ beim Zugang via vorlage "Flagge" ist die Abfrage nicht erforderlich.
flix könnte ggf unten noch abgefragt werden --]]
local orig, addon
frame = frame:getParent() --[[ erst mal die im Vorlagenaufruf übergebenen
Parameter auswerten und zuteilen --]]
for key, val in pairs(frame.args) do
key = tu(key) -- das Wirrwar mit key, val, kzn muss noch entshhlüsselt und verbessert werden
val = trim(val); local t = val
if key == "1" then -- dummerweise 3 mögliche Varianten bei der alten Vorlage (Key, Linkziel oder #)
if val == '#' then orient = val -- aus Kompatibilitätsgründen zu Altversion
nomobile = ""
-- Hier eingreifen und passende Liste öffnen ggf., falls 1=Linkziel Fehler provozieren
else
fli = flix or loli(val) -- falls nach der historischen methode via {{XYZ}} aufgerufen, liegt die Liste schon fest
if fli[t] then kzn = val else linkziel = val end
end -- if val == #
end --if key == "1"
if key == "K" or key=='I' or key == '3' then -- [K]ennzeichen, [I]SO
if val and val ~= '' then fli = loli(val)
kzn = val end -- muss das noch sein?
elseif key == 'L' then linkziel = val -- [L]ink (könnte ggf. '1' überschreiben.
elseif key == 'Z' then linkziel, linktext = val, val -- '[Z]iel' verändertes Linkziel, auch Linktext-Anzeige
elseif key == 'W' or key == 'P' then logowidth = tonumber(val) -- [p]ixel bzw. [W]IDTH
elseif key == '2' or key == 'T' then
if val ~= "#" then
ksp =''
linktext = exhtml(val); sort = linktext -- link[t]ext und Sortierung abweichend von 1
else orient="#"
end
elseif key == '3' or key == 'T' then
--ksp ='';
linktext = exhtml(val); sort = linktext -- link[t]ext und Sortierung abweichend von 1
elseif key == 'H' then logohight = tonumber(val) -- [H]öhe (Zukunftsmusik)
elseif key == 'D' then was = val -- css-Dekos für den Linktext
elseif key == 'B' or key == 'M' then orient = orf(val) -- Flaggen[m]argin oder [bo]rder ggf. wrap bzw. Umbruch ermöglichen siehe function orf()
elseif key == 'E' or key == 'O' then orig = val -- Originalname, ggf mit Sprachkennzeichen aus Liste
elseif key == 'A' then do -- Ergänzungstext aus Liste oder übergeben als ausgeschriebener Parameter
addon = exhtml(val)
if string.find(val,"^%[") then -- nix
elseif string.find(val,ref) or string.find(val,'<[rR][eE][fF]') or string.find(val,'&') or string.find(val,'FN') then ksp =''; sp=''
--[[ Vor <ref, FN sollte kein Leerzeichen und kein ', 'stehen. Zum absichtlichen Löschen
des LZ bzw. ,LZ kann auch a= mit oder   oder sonstigem '&' eingeleitet werden --]]
end -- if string
end -- then do
elseif key == 'S' then sort = val -- [S]ortierwert (beliebiges Wort) oder wie {{AUT|sortable=ja}}
elseif key == 'F' then flglnk = tonumber(val) -- 0 oder 1 oder nil,Bestimmt den Link unter der Flagge
elseif key == 'V' then tblx = tonumber(val) -- soll aus Flagge und Text eine 2-spaltige Tabelle machen
if tblx and (tblx < tblxw) then tblx = tblxw end -- Textbreite ggf. erweitern
elseif key == 'X' then return a2h(val) .. "'''T='''" .. tu(val) --[=[ Nur zum Testen, was übergeben wird,
z.b. bei <ref -- undokumentiert --]=]
end -- if key ...
end -- for key, val in ..
-- Jetzt die Tabellenzeile für 'kzn' (Kennzeichen) auslesen
local val = kzn -- entbehrlich?
local werte = valkombi(fli,val)
if not werte then val = 'ZZZ' end --[[ falsches oder fehlendes Kennzeichen. Jede Liste hat so ein 'ZZZ' --]]
if werte then
local werte = valkombi(fli,val)
linkziel = linkziel or werte.l or '' -- Link auf Lemma
linktext = linktext or werte.lt or werte.l or linkziel -- sichtbarer Linktext, default = Lemma
arh = werte.h or 1 -- Höhe (amtlich, aus aspect ratio)
arw = werte.w or 1 -- Breite dto
flgpic = werte.f or flag -- Bilddatei
if sort and tu(sort,2) == 'JA' then sort = kzn end-- damit funktioniert auch unsinnige {{AUT|sortable=ja}}
sort = sort or werte.s or linktext or linkziel -- Sortierschlüssel aus Liste, default Linkziel
if werte.b then flagborder = '|border' or '' end -- Bildrand
end -- if werte
-- führenden Eintrag mit Sortiervorgabe (unsichtbar) anlegen
if sort then sort = '<span style="display:none;">' .. sortclean(sort) .. '</span>' else sort = '' end
-- Zusatz angaben einbinden, falls aufgerufen und in Liste vorhanden
if not nopic then -- Bildaufbau
bild, nowrap = fpic(orient,werte,logowidth,flglnk) -- Bildaufbau aufrufen, retour auch das Umbruchkennzeichen
else bild = '' end -- ohne Flagge, nur Text
local ad = werte.a -- Zusatzangaben aus Liste '=1' oder manuell eingegeben
if addon == "1" then addon = ad or '' end -- manuelle Eingabe hat Priorität
if orient == '#' or orient == 'C' then return sort .. bild .. (addon or '') end -- Text außer bei a= entffällt
local trailer = '' -- das "Schwänzle"
local on = werte.o
if orig and on then
trailer = tail(on,orig)
if orig ~= "1" and trailer ~= '' then
tt=trailer;
trailer = frame:preprocess{text = tt}
--[[ das muss ersetzt werden durch
Wikipedia:Lua/Modul/Vorlage:lang/de#Funktionen_für_Lua-Module
oder besser noch durch eigenes Modul, da 'Modul:lang' sehr miserabel ist
--]]
end -- if orig ~= "1"
end -- if orig
if addon and #addon > 1 then
trailer = sp .. trailer .. ksp .. addon --nnbsp(addon)
end -- if addon
if tblx > 0 then --[[ Verpackt Bild un Text in eine zweispaltige Tabelle;
gut für Tabellen, um Texte bündig untereinander zu setzen --]]
--[[ MÖGLICHKEIT STATT TABLE, geht aber wg. WP-Zensur nicht.
dl1 = "\<figure role=\"group\" style=\"width:" .. wstd+tblx .. "px; border:0; margin:0;padding:0;float:left;box-sizing:border-box; display:flex; align-items:center;\"\>"
tdm="" ; dl2="\</figcaption\>\</figure\>" --]]
dl1 = "<table frame='void'; style='padding:0; border:0; margin:0'><tr style='text-align:left;padding:0; border:0; margin:0'><td style='text-align:center; width:" .. wstd .. "px;padding:0; border:0; margin:0'>"
tdm = "</td><td style='text-align:left; width:" .. tblx .. "px;padding:0; border:0; margin:0'>"
dl2 = "</td></tr></table>" -- p war vor-/nachgesetzt, brachte nur lint-Fehler
end -- if tblx
if not nopic then -- sonst fällt Flagge/Wappen/Logo aus
bild, nowrap = fpic(orient,werte,logowidth,flglnk) -- Bildaufbau aufrufen, retour auch das Umbruchkennzeichen
else bild = '' end -- ohne Flagge, nur Text
if orient == '#' or orient == 'C' then return sort .. bild end -- Text entffällt
if nowrap then linktext = nbsp(linktext) end -- bastelt geschützte Leerzeichen
link= '[[' .. linkziel .. '|' .. linkex(linktext) ..']]' -- Hier Linktext bereinigen, falls in Text bereits Links sind
ret = sort .. dl1 .. dt1 .. bild .. (tdm or ' ') .. emph(link,was) .. dt2 .. trailer .. dl2 -- da ist dann alles zusammen!
return putze(ret) -- Bereinigung von konstruktionsbedingt verbliebenen, überflüssigen oder doppelten Zeichen
end -- function p.f(fram)
----- AB DIE POST!
return p