Modul:Benutzer:Kpfiwa/Morse

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Das Modul:Morse setzt via Vorlage:Morse einen beliebigen Text in darstellbaren Morsecode um. Die 'Textgröße' ist auf 40 % eingestellt, kann aber mit dem 2. Parameter umgestellt werden (Siehe [[Vorlage:Morse/Doku|Dokumentation. Eine Erweiterung des umsetzbaren Zeichensatzes (z.B. arabisch usw.) ist generell Möglich und bei Bedarf nachzutragen. Es werden keine Grafiken eingesetzt, daher ist ein schneller Ablauf gewährleistet.

Die für den US-Railroadcode und Gerke-Code abweichende Zeichen/Pausenlängen werden umgesetzt.

Der gesamte Aufbau des Moduls ist nicht 100 % optimiert, um die Lesbarkeit zu erhalten. Es gibt ein paar ‚Umwege‘, die nicht unbedingt nötig sind, aber Verstänlichkeit dienen. Bis auf wenige Aufrufe von mw-Erweiterungen ist das Modul in einer Standard-Lua-Umgebung, z.B. mit „ZeroBrane Studio“) lauffähig. Das vereinfacht die Wartung spürbar. Jedoch verarbeitet Lua nicht UTF-8 korrekt, das wird daher mit „mw.ustring“ verarbeitet.

Da das Modul auch in anderen Sprachräumen eingesetzt wird, sind sprachabhängig definierte Ergänzungen, Verfahren und Vorlagen unerwünscht, um einheitliche Wartung zu gewährleisten.

Die in Morsecode umzusetzenden Zeichen sind in tabellen-Dateien ausgelagert, um auch unerfahrenen Anwendern eine leichte Bearbeitung zu ermöglichen.

  • Da die Tabellen teilweise temporär überschrieben werden, ist mw.loadData(...) nicht geeignet (readonly).
Bedarfsweise geladen werden:
Variable Datei Inhalt/Zweck
PROS{} Modul:Vorlage/Morse/Prosigns Von FernmeldeunionITU festgelegte Zeichenfolgen, die mit verkürztem Code ausgegeben werden.
Beispiel: SOS = ▄ ▄ ▄ ▄▄▄ ▄▄▄ ▄▄▄ ▄ ▄ ▄  statt ▄ ▄ ▄   ▄▄▄ ▄▄▄ ▄▄▄   ▄ ▄ ▄ 
DIGR{} Modul:Vorlage/Morse/Digraphs Kurze Buchstabenfolgen, meist für Sonderzeichen, die in einen Code umgesetzt bzw in verkürztem Code ausgegeben werden.
Beispiel SX = $= ▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄  statt ▄ ▄ ▄   ▄▄▄ ▄ ▄ ▄▄▄ 
MOGR{} Modul:Vorlage/Morse/Monographs Einzelzeichen aller Art, auch nichtlateinische Zeichensätze. Jedem Buchstaben ist ein Code zugeeordnet. A–Z nur als Versalien, da die Minuskeln als steuerzeichen eingesetzt werden (siehe Variable TMP{})
Weitere Tabellen:
Variable Werte Bedeutung, Versendung
TMP{} Zeichen &#;09 wären im Programmablauf mit der dezimalen Darstellung der UTF-8-Codes für die Punkt-, /Strich- und Leerzeichen verwechselbar
Beispiel: ▄ = ▄
Beispiel Beispiel Beispiel
Beispiel Beispiel Beispiel
Beispiel Beispiel Beispiel
Funktionsmodduln
Aufruf Aufgabe Parameter
p.f(frame) Einstiegsfunktion, Parameterabfrage, Ablaufsteuerung, Ausgabe als Tabelle frame = Wertereübergabe als Tabelle aus der Vorlage:Morse
Beispiel Beispiel Beispiel
Beispiel Beispiel Beispiel

--[=[ p: Dit = kurz = ▄ l: Ein Dah = lang ist dreimal so lang wie ein Dit. ▄▄▄

  Die Pause zwischen zwei gesendeten Symbolen ist ein Dit lang.   und ist bereits vorgegeben

t: Zwischen Buchstaben in einem Wort wird eine Pause von der Länge eines Dah (oder drei Dits) eingeschoben.

  Da ein Dit jedem Zeichen automatisch folgt, werden es 2 weitere   , insgesamt: 3 nbsp

s: Die Länge der Pause zwischen Wörtern entspricht sieben Dits, also 6 + 1 Siehe auch: https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1677-1-200910-I!!PDF-E.pdf#page=5 --]=]

function usout(frame) -- nur zur Kompatibilität mit :en:Template:morse

   local ind, erg = "  ", ""
   for key, val in pairs(frame.args) do -- Alle Parameter sammeln zuordnen
       if key == "noindent" then
           ind = ""
       elseif val == "word" then
           erg = erg .. "    "
       elseif val == "dot" then
           erg = erg .. "▄ "
       elseif val == "dash" then
           erg = erg .. "▄▄▄ "
       elseif val == "adash" then
           erg = erg .. "▄▄ "
       elseif val == "aspace" then
           erg = erg .. " "
       elseif val == "ldash" then
           erg = erg .. "▄▄▄▄ "
       elseif val == "zerodash" then
           erg = erg .. "▄▄▄▄▄▄▄▄▄▄▄ "
       end
   end
   return '' ..
       ind .. erg .. ''

end -- function usout()

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 --[=[ colore funktioniert nicht un Kombinaruin mit audia, da links (bei audio via[[ Media: von WP generell (blau) eingefärbt werden. Hier wird versucht CSS link und vlink u überschreiben, funktioniert aber nicht --]=] local function colore(c, bg) -- c==Farbe/color, bg==Kennzeichen Background

   local css, f, tmpc = "", "", ""
   local val = c or ""
   local v = tu(val)
   local red = "#ff0000"
   local gre = "#508f10"
   local blu = "#0000a0"
   local yel = "#ffff00"
   local wht = "#ffffff"
   local orn = "#ff8000"
   local blk = "#000000"
   if v == "#" then -- da hat jemand die richtige Farbe eingegeben?
       tmpc = c
   elseif v == "Y" then
       tmpc = yel -- yellow
   elseif v == "B" then
       tmpc = blu -- blau, blue
   elseif v == "O" then
       tmpc = orn -- orange
   elseif v == "W" then
       tmpc = wht -- weiß, white
   elseif v == "S" or v == "N" or v == "D" then
       tmpc = blk -- schwarz, noir, dark
   elseif v == "R" then
       tmpc = red -- rot
   elseif v == "G" then -- gelb oder grün? (special for Germans)
       if tu(c, 2) == "GR" then
           tmpc = gre -- grün
       else
           tmpc = yel -- gelb
       end --  if tu(c)
   end -- if v == #
   if bg then --
       css = "background-color:" .. tmpc .. ";"
   else
       css = "color:" .. tmpc .. ";link:" .. tmpc .. ";vlink:" .. tmpc .. ";"
   end
   return css

end -- function colore()

local function los(t, tbl) -- für alle Fälle

   local ret = t or ""
   for k, v in pairs(tbl) do --
       if (type(k) == "string") and (type(v) == "string") then
           ret = ret:gsub(k, v)
       end --  if (type(k)
   end -- for k, v in pairs(tbl)
   return ret

end -- function los

function monochange(txt) -- searches in the Monographs-List, if val exists return it

   ret = ""
   -- mw.ustring.len(txt)
   for i = 1, mw.ustring.len(txt) do -- in string  txt jeden Buchstaben abfragen
       local c =  mw.ustring.sub(txt, i, i) -- mw.ustring.sub(txt, i, i)
       ret = ret .. (MOGR[c] or c)
   end
   return ret

end -- function monochange

local function gerk() -- translate in Gerke-code; differs partially from international

   MOGR["o"] = "nt" -- 0 zerodash
   MOGR["b"] = "pllpt" -- 1
   MOGR["c"] = "pplppt" -- 2
   MOGR["e"] = "ppplpt" -- 3
   MOGR["f"] = "lllt" -- 5
   MOGR["g"] = "pppppt" -- 6
   MOGR["h"] = "llppt" -- 7
   MOGR["i"] = "lppppt" -- 8
   MOGR["j"] = "lpplt" -- 9
   MOGR["C"] = "lpppt" -- G
   MOGR["F"] = "pplpt" -- G
   MOGR["J"] = "ppt" -- G
   MOGR["O"] = "plpppt" -- G
   MOGR["M"] = "plpppt" -- G
   MOGR["P"] = "pppppt" -- G
   MOGR["X"] = "pplpppt" -- G
   MOGR["Y"] = "llpppt" -- G
   MOGR["Z"] = "pllppt" -- G
   return true

end --function gerk()

local function arr() -- translate in US Railroad code; differs partially from international

   --[[ In order to avoid conflicts, these letters were exchanged with others 
       [&]=x, [#]=y, [;]=z, [0]=a, [1]=b, [2]=c, [3]=d, [4]=e, [5]=f, [6]=g, [7]=h, [8]=i, [9]=j --]]
   MOGR["%."] = "ppllppt" -- period .
   MOGR["%,"] = "plplt" -- comma ,
   MOGR["?"] = "lpplpt" -- Question mar k ?
   MOGR["!"] = "lllpt" -- Exclamation mark !
   MOGR["x"] = "pqpppt" -- Ampersand & !!
   MOGR["X"] = "llllt" -- Paragraph break -- ["%="] = "lppplt",   ????
   MOGR["z"] = "pppqppt" -- Semicolon
   MOGR["%:"] = "lplqpqpt" -- Colon
   MOGR["%'"] = "pplpqplppt" -- Apostrophe '
   MOGR["%/"] = "pplqlt" -- Slash /
   MOGR["%-"] = "ppppqplppt" -- Hyphen [-]
   MOGR["%("] = "pppppqlpt" -- Parenthesis (open) [(]
   MOGR["%)"] = "pppppqppqppt" -- Parenthesis (close) [)]
   MOGR["o"] = "nt" -- 0 zerodash
   MOGR["b"] = "pllpt" -- 1
   MOGR["c"] = "pplppt" -- 2
   MOGR["e"] = "ppplpt" -- 3
   MOGR["f"] = "lllt" -- 5
   MOGR["g"] = "pppppt" -- 6
   MOGR["h"] = "llppt" -- 7
   MOGR["i"] = "lppppt" -- 8
   MOGR["j"] = "lpplt" -- 9
   MOGR["C"] = "ppqpt"
   MOGR["F"] = "pplpt"
   MOGR["J"] = "lplpt"
   MOGR["L"] = "mt" -- ldash
   MOGR["O"] = "pqpt"
   MOGR["P"] = "pppppt"
   MOGR["Q"] = "pplpt"
   MOGR["R"] = "pqppt"
   MOGR["X"] = "plppt"
   MOGR["Y"] = "ppqppt"
   MOGR["Z"] = "pppqpt"
   return true

end --function arr()

local function sound(L, txt, sz) -- für Audioeinbindung, L=letter, txt=text, sz = size

   L = tu(L,3) -- Sonderfall SOS: File:SOS morse code.ogg
   if L ~= "SOS" then
       L = tu(L)
   end
   local n = ""
   if L:find("[A-Z0-9]+") then
       if L:find("%d+") then
           n = " number"
       end
       txt ="" .. math.floor(sz / 5 + 0.5) .. "px [[Media:" .. 
       L .. n .. " morse code.ogg|" .. txt .. "]]"
   end
   return txt

end -- function sound()

function laststep(txt, version) -- cut all trailing spaces and translate Int to US and make code

   local i = 1
   while i do -- trim trailing spaces
       i, j = string.find(txt, "[ts]+", -1)
       if i then
           txt = txt:sub(1, i - 1)
       end
   end -- while i
   --[[ da bei Umsetzung von <span style='opacity ... Endlosschleifen entstehen können, wird sie span-Angabe temporär umgesetzt aif v und w
   --]]
   txt = txt:gsub(" ", "r") --  passt zu Wortlücke 7, umbrechbar
   ---
   if version == "USA" then
       txt = txt:gsub("L", "▄▄▄▄ ") -- = US 'l/L'
       txt = txt:gsub("l", "▄▄▄ ") -- lang/dah = 2 dit + Pause
       txt = txt:gsub("m", "▄▄▄▄ ") -- lang/dah = 2 dit + Pause
       txt = txt:gsub("q", " ") -- aspaace
       txt = txt:gsub("n", "▄▄▄▄▄▄▄▄▄▄▄ ") -- = US Null '0'
       txt = txt:gsub("r", "    ") -- space US
   elseif version == "GERKE" then
       txt = txt:gsub("l", "▄▄ ") -- lang/dah = 2 dit + Pause
       txt = txt:gsub("m", "▄▄▄ ") -- lang/dah = 2 dit + Pause
       txt = txt:gsub("n", "▄▄▄▄▄▄▄▄▄▄▄ ") -- = US Null '0'
       txt = txt:gsub("r", "    ") -- space US
   elseif version == "COMPACT" then
       txt = txt:gsub("l", "❙") -- lang/dah
       txt = txt:gsub("r", "  ") -- space
       txt = txt:gsub("p", "•") -- kurz/dit  + Pause
       txt = txt:gsub("t", " ") -- Zeichentrenner
   else
       txt = txt:gsub("l", "▄▄▄ ") -- lang/dah = 3 dit + Pause
       txt = txt:gsub("r", "    ") --  space 4 umbrechbar
   end
   txt = txt:gsub("p", "▄ ") -- kurz/dit  + Pause
   txt = txt:gsub("r", "    ") --  space 4 umbrechbar "
   txt = txt:gsub("t", "  ") -- zwei Buchstabentrenner ohne Umbruch, 1 automatisch vorgegeben = 3
   return txt

end -- function laststep

function p.f(frame) -- START

   local frame = frame:getParent()
   local txt, color, bgcolor = "", "", ""
   for key, val in pairs(frame.args) do -- Alle Parameter sammeln und Zeilen zuordnen
       --- Falls :en:Template:morse, hier gleich verzweigeen
       v = string.find("XadashXaspaceXdotXdashXnoindentXldashXwordXzerodashX", "X" .. val .. "X")
       if v or key == "noindent" then
       	return usout(frame) -- und finito hier!
       end
       key = tu(key)
       if key == "1" then
           txt = val
           if #txt == 1 then
               version = "HAM" -- quasi Kurzverfahren
           end
       elseif key == "2" then
           size = tonumber(val) or 40
       elseif key == "Z" or key == "C" then -- zeichenfarbe derzeit noch nicht ergänzt.
           color = colore(val)
       elseif key == "H" or key == "B" then -- Hintergrundfarbe  derzeit noch nicht ergänzt.
           bgcolor = colore(val, 1)
       elseif key == "V" then -- Regionsangabe
           val = tu(val)
           if val == "U" then
               version = "USA"
               arr() -- will transfer letters  to USA code
           elseif val == "K" or val == "C" then
               version = "COMPACT"
               sizec = 2
           elseif val == "G" then
               gerk() -- will transfer letters  to Gerke-code
               version = "GERKE" -- noch in Arbeit
           elseif val == "A" or val == "Q" or val == "H" then
               version = "HAM"
           end
       elseif key == "A" then -- Audioiedergabe einem Zeichens
           audio = txt
       end
   end -- for key, val
   local erg = string.upper(txt) or "" -- so weit es geht, alles Versalien, da einige Gemeine als 'Steuerzeichen' gebraucht werden.
   erg = los(erg, TMP) -- Vorbereitung, kritische Zeichen umsetzen
   if version ~= "HAM" then
       erg = los(erg, PROS) -- Prosigns temporär umsetzen
       erg = los(erg, DIGR) -- Digraphs temporär in Buchstaben unmsetzen
   end
   erg = monochange(erg) -- Monographs temporär in Buchstaben unmsetzen
   erg = laststep(erg, version) -- trim trailing spaces
   -- Audio-Eimbindung
   if audio then
       erg = sound(audio, erg, size)
   end
   -- falls am Ende ' ', dann tauschen gegen '&#32';
   i, j = string.find(erg, " ", -7)
   if i then
       erg = erg:sub(1, i - 1)
   end
   -- CSS-Umrahmung
   -- Endbearbeitung: das ' ' vor und nach 'span' ist ggf. sinnvoll , ggf. nur für USA?
   erg =
       '' .. erg .. ""
   -- UND AB GEHT DIE POST!
   return erg

end -- function p.f(frame)

return p


--[=[ Mudul:Morse 2021-08-30 by Kpfiwa
	Setzt einen beliebigen Text in darstellbaren Morsecode um. 
	Die 'Textgröße' ist auf 40 % eingestellt, kann aber mit dem 2. Parameter 
	umgestellt werden. 
	Eine Erweiterung ders umsetzbaren Zeichensatzes (kyrillisch, hebräisch, arabisch) usw.
	ist denkbaar und bei Bedarf nachzutragen.
	Auch die in Aerika abweichende Zeichen/Pausenlängen wären ergänzbar.
	
	Der gesamte Aufbau macht ein paar Umwege, die nicht unbedingt nötig sind. 
	Es läuft aber auch ohne mw-Erweiterungen und zischenergebnisse lassen sich
	via print() in externer Umgebung (z.B. ZeroBrane Studio) darstellen. 
	Das vereinfacht die Wartung enorm.
	
	Da das Modul auch in anderen Sprachräumen eingesetzt wird, sollteen nationale
	Ergänzungen und Verfahren außen vor bleiben, um einheitliche Wartung zu gewährleisten.
	
	Wer etwas besser weiß, darf es gerne einbringen. Nörgeln ist nicht konstruktiv
	und projektfördernd, auch wenn einige gerne den Experten und Oberlehrer raushängen.
--]=]
local p = {}
local txt = ""
local erg = ""
local region = "INT"
local size = 40
EU = {
--[[
p: Dit = kurz = &#9604;
l: Ein Dah = lang ist dreimal so lang wie ein Dit. &#9604;&#9604;&#9604;
   Die Pause zwischen zwei gesendeten Symbolen ist ein Dit lang. &#160; und ist bereits vorgegeben
t: Zwischen Buchstaben in einem Wort wird eine Pause von der Länge eines Dah (oder drei Dits) eingeschoben.
   Da ein Dit jedem Zeichen automatisch folgt, werden es 2 weitere &#160;&#160;, insgesamt: 3 nbsp
s: Die Länge der Pause zwischen Wörtern entspricht sieben Dits, also 6 + 1
--]]
    ["p"] = "&#9604;&#160;", -- kurz/dit  + Pause
    ["l"] = "&#9604;&#9604;&#9604;&#160;", -- lang/dah = 3 dit + Pause
    ["t"] = "&#160;&#160;", -- zwei Buchstabentrenner ohne Umbruch, 1 automatisch vorgegeben = 3
    ["s"] = "&#8195;&#8195;&#8195;&#32;", --  passt zu Wortlücke 7, umbrechbar
}
--[[
	&, # , ; im Text umsetzen auf x, y, z, somit bei der Weiterveraarbeitung keine 
	Verwechslung mit UTF-8-Dezimalwert wie &#9604; 
	Zahlen im Text umsetzen 0-9 zu a - j (klein!), damit keine Konflikte mit TF-8-Dezimalwert 
--]]
local TMP = {
    ["&"] = "x",
    ["#"] = "y",
    [";"] = "z",
    ["0"] = "a",
    ["1"] = "b",
    ["2"] = "c",
    ["3"] = "d",
    ["4"] = "e",
    ["5"] = "f",
    ["6"] = "g",
    ["7"] = "h",
    ["8"] = "i",
    ["9"] = "j"
}
--[[
 Mehrfachzeichen zuerst abarbeiten, da einige ohne Buchstabentrenner übergeben werden, sofort umsetzen.
 --]]
local ABC2 = {
    ["AAA"] = ".",
    ["HH"] = "ppppppppt", -- Fehler, Irrung
    ["IMI"] = "?",
    ["MIM"] = ",",
    ["NNN"] = ";",
    ["SOS"] = "pplllpppt", -- SOS zusammenhängend
    ["AC"] = "@",
    ["AR"] = "+",
    ["AR"] = "plplpt", -- Spruchende
    ["BA"] = "-",
    ["BT"] = "=",
    ["BT"] = "lppplt", -- Pause
    ["CH"] = "llllt", -- CH
    ["DN"] = "/",
    ["JN"] = "'", -- ' Anführungszeichen
    ["KA"] = "lplplt", -- Spruchanfang
    ["KK"] = ")",
    ["KN"] = "(",
    ["OS"] = ":",
    ["SK"] = "ppplplt", -- Verkehrsende
    ["UK"] = "_", -- _ Underline
    ["VE"] = "ppplpt", -- verstanden
    [" "] = "s" -- Leereichen zwischen Wörtern
}

local ABC = {
    ['%"'] = "plpplpt",
    ["_"] = "ppllplt", -- UK
    [";"] = "lplplpt", --  Semikolon
    ["!"] = "lplpllt",
    ["¡"] = "llpppl",
    ["?"] = "ppllppt", -- IMI
    ["¿"] = "pplplt",
    ["@"] = "pllplpt",
    ["%-"] = "lpppplt", -- BA
    ["%,"] = "llppllt", -- MIM
    ["%:"] = "lllpppt", -- OS
    ["%."] = "plplplt", -- AAA
    ["%'"] = "pllllpt", -- JN
    ["%("] = "lpllpt", -- KN
    ["%)"] = "lpllplt", -- KK
    ["%/"] = "lpplpt", -- DN
    ["%+"] = "plplpt", -- AR
    ["%="] = "lppplt", -- BT
    ["$$"] = "ppplpplt",
    ["a"] = "lllllt",
    ["Á"] = "p11p1t",
    ["á"] = "p11p1t",
    ["À"] = "p11p1t",
    ["à"] = "p11p1t",
    ["Â"] = "p11p1t",
    ["â"] = "p11p1t",
    ["Å"] = "p11p1t",
    ["å"] = "p11p1t",
    ["ã"] = "p11p1t",
    ["Ã"] = "p11p1t",
    ["Ä"] = "p1p1t",
    ["ä"] = "p1p1t",
    ["Ą"] = "p1p1t",
    ["ą"] = "p1p1t",
    ["A"] = "plt",
    ["À"] = "pllplt",
    ["à"] = "pllplt",
    ["Å"] = "pllplt",
    ["å"] = "pllplt",
    ["Ä"] = "plplt",
    ["ä"] = "plplt",
    ["æ"] = "p1p1t",
    ["Æ"] = "p1p1t",
    ["B"] = "lpppt",
    ["b"] = "pllllt",
    ["Č"] = "11pt",
    ["č"] = "11pt",
    ["Ć"] = "1p1ppt",
    ["ć"] = "1p1ppt",
    ["Ĉ"] = "1p1ppt",
    ["ĉ"] = "1p1ppt",
    ["ç"] = "1p1ppt",
    ["Ç"] = "1p1ppt",
    ["C"] = "lplpt",
    ["c"] = "pplllt",
    ["CH"] = "llllt",
    ["D"] = "lppt",
    ["Ð"] = "pp11pt",
    ["ð"] = "pp11pt",
    ["d"] = "pppllt",
    ["Ê"] = "1pp1pt",
    ["ê"] = "1pp1pt",
    ["E"] = "pt",
    ["È"] = "p1pp1t",
    ["è"] = "p1pp1t",
    ["È"] = "plpplt",
    ["è"] = "plpplt",
    ["É"] = "pp1ppt",
    ["é"] = "pp1ppt",
    ["Ë"] = "pp1ppt",
    ["ë"] = "pp1ppt",
    ["Ę"] = "pp1ppt",
    ["ę"] = "pp1ppt",
    ["É"] = "pplppt",
    ["é"] = "pplppt",
    ["e"] = "pppplt",
    ["F"] = "pplpt",
    ["f"] = "pppppt",
    ["Ğ"] = "11p1pt",
    ["ğ"] = "11p1pt",
    ["Ĝ"] = "11p1pt",
    ["ĝ"] = "11p1pt",
    ["G"] = "llpt",
    ["g"] = "lppppt",
    ["Ĥ"] = "1111t",
    ["ĥ"] = "1111t",
    ["h"] = "llpppt",
    ["H"] = "ppppt",
    ["Ï"] = "1pp11t",
    ["ï"] = "1pp11t",
    ["i"] = "lllppt",
    ["Ì"] = "p111pt",
    ["ì"] = "p111pt",
    ["İ"] = "p1pp1t",
    ["İ"] = "p1pp1t",
    ["I"] = "ppt",
    ["j"] = "llllpt",
    ["Ĵ"] = "p111pt",
    ["ĵ"] = "p111pt",
    ["J"] = "plllt",
    ["K"] = "lplt",
    ["Ł"] = "p1pp1t",
    ["ł"] = "p1pp1t",
    ["L"] = "plppt",
    ["M"] = "llt",
    ["Ń"] = "11p11t",
    ["ń"] = "11p11t",
    ["Ñ"] = "11p11t",
    ["ñ"] = "11p11t",
    ["Ñ"] = "llplt",
    ["ñ"] = "llplt",
    ["N"] = "lpt",
    ["Ó"] = "111pt",
    ["ó"] = "111pt",
    ["Ò"] = "111pt",
    ["ò"] = "111pt",
    ["Ô"] = "111pt",
    ["ô"] = "111pt",
    ["Ö"] = "111pt",
    ["ö"] = "111pt",
    ["Ø"] = "111pt",
    ["ø"] = "111pt",
    ["O"] = "lllt",
    ["Ö"] = "lllpt",
    ["ö"] = "lllpt",
    ["P"] = "pllpt",
    ["Q"] = "llplt",
    ["R"] = "plpt",
    ["š"] = "1111t",
    ["Š"] = "1111t",
    ["Ș"] = "1111t",
    ["ș"] = "1111t",
    ["Ş"] = "p11ppt",
    ["ş"] = "p11ppt",
    ["S"] = "pppt",
    ["ŝ"] = "ppp1pt",
    ["Ŝ"] = "ppp1pt",
    ["Ś"] = "ppp1pppt",
    ["ś"] = "ppp1pppt",
    ["ß"] = "pppllppt", -- SZ
    ["ẞ"] = "pppllppt", -- SZ versal
    ["ß"] = "ppppppt",
    ["ß"] = "ppppppt",
    ["T"] = "lt",
    ["Ù"] = "pp11t",
    ["ù"] = "pp11t",
    ["Ŭ"] = "pp11t",
    ["ŭ"] = "pp11t",
    ["ü"] = "pp11t",
    ["Ü"] = "pp11t",
    ["U"] = "pplt",
    ["Ü"] = "ppllt",
    ["V"] = "ppplt",
    ["W"] = "pllt",
    ["X"] = "lpplt",
    ["x"] = "plpppt",
    ["y"] = "#t",
    ["Y"] = "lpllt",
    ["Ž"] = "11pp1t",
    ["ž"] = "11pp1t",
    ["Ż"] = "11pp1t",
    ["ż"] = "11pp1t",
    ["Ź"] = "11pp1pt",
    ["ź"] = "11pp1pt",
    ["Z"] = "llppt",
    ["z"] = "lplplpt", -- NNN, umgesetztes Semikolon
    ["þ"] = "p11ppt",
    ["Þ"] = "p11ppt",
    ["α"] = "p1t",
    ["Α"] = "p1t",
    ["Β"] = "1pppt",
    ["β"] = "1pppt",
    ["Γ"] = "11pt",
    ["γ"] = "11pt",
    ["Δ"] = "1ppt",
    ["δ"] = "1ppt",
    ["Ε"] = "pt",
    ["ε"] = "pt",
    ["Ζ"] = "11ppt",
    ["ζ"] = "11ppt",
    ["Η"] = "ppppt",
    ["η"] = "ppppt",
    ["Θ"] = "1p1pt",
    ["θ"] = "1p1pt",
    ["Ι"] = "ppt",
    ["ι"] = "ppt",
    ["Κ"] = "1p1t",
    ["κ"] = "1p1t",
    ["Λ"] = "p1ppt",
    ["λ"] = "p1ppt",
    ["Μ"] = "11t",
    ["μ"] = "11t",
    ["Ν"] = "1pt",
    ["ν"] = "1pt",
    ["Ξ"] = "1pp1t",
    ["ξ"] = "1pp1t",
    ["Ο"] = "111t",
    ["ο"] = "111t",
    ["Π"] = "p11pt",
    ["π"] = "p11pt",
    ["Ρ"] = "p1pt",
    ["ρ"] = "p1pt",
    ["Σ"] = "pppt",
    ["σ"] = "pppt",
    ["Τ"] = "1t",
    ["τ"] = "1t",
    ["Υ"] = "1p11t",
    ["υ"] = "1p11t",
    ["Φ"] = "pp1pt",
    ["φ"] = "pp1pt",
    ["Χ"] = "1111t",
    ["χ"] = "1111t",
    ["Ψ"] = "11p1t",
    ["ψ"] = "11p1t",
    ["Ω"] = "p11t",
    ["ω"] = "p11t",
    ["а"] = "p1t",
    ["А"] = "p1t",
    ["Б"] = "1pppt",
    ["б"] = "1pppt",
    ["В"] = "p11t",
    ["в"] = "p11t",
    ["Г"] = "11pt",
    ["г"] = "11pt",
    ["Ґ"] = "11pt",
    ["ґ"] = "11pt",
    ["Д"] = "1ppt",
    ["д"] = "1ppt",
    ["Е"] = "pt",
    ["е"] = "pt",
    ["Є"] = "pp1ppt",
    ["є"] = "pp1ppt",
    ["Ж"] = "ppp1t",
    ["ж"] = "ppp1t",
    ["З"] = "11ppt",
    ["з"] = "11ppt",
    ["И"] = "ppt",
    ["и"] = "ppt",
    ["Ї"] = "p111pt",
    ["ї"] = "p111pt",
    ["І"] = "ppt",
    ["і"] = "ppt",
    ["Й"] = "p111t",
    ["й"] = "p111t",
    ["К"] = "1p1t",
    ["к"] = "1p1t",
    ["Л"] = "p1ppt",
    ["л"] = "p1ppt",
    ["М"] = "11t",
    ["м"] = "11t",
    ["Н"] = "1pt",
    ["н"] = "1pt",
    ["О"] = "111t",
    ["о"] = "111t",
    ["П"] = "p11pt",
    ["п"] = "p11pt",
    ["Р"] = "p1pt",
    ["р"] = "p1pt",
    ["С"] = "pppt",
    ["с"] = "pppt",
    ["Т"] = "1t",
    ["т"] = "1t",
    ["У"] = "pp1t",
    ["у"] = "pp1t",
    ["Ф"] = "pp1pt",
    ["ф"] = "pp1pt",
    ["Х"] = "ppppt",
    ["х"] = "ppppt",
    ["Ц"] = "1p1pt",
    ["ц"] = "1p1pt",
    ["Ч"] = "111pt",
    ["ч"] = "111pt",
    ["Ш"] = "1111t",
    ["ш"] = "1111t",
    ["Щ"] = "11p1t",
    ["щ"] = "11p1t",
    ["Ъ"] = "11p11t",
    ["ъ"] = "11p11t",
    ["Ы"] = "1p11t",
    ["ы"] = "1p11t",
    ["Ь"] = "1pp1t",
    ["ь"] = "1pp1t",
    ["Э"] = "pp1ppt",
    ["э"] = "pp1ppt",
    ["Ю"] = "pp11t",
    ["ю"] = "pp11t",
    ["Я"] = "p1p1t",
    ["я"] = "p1p1t", -- Erweiterung auf andere Zeichensätze möglich!
}

function los(t, tbl)
    local ret = t or ""
    for k, v in pairs(tbl) do --
        if (type(k) == "string") and (type(v) == "string") then
            ret = ret:gsub(k, v)
        end --  if (type(k)
    end -- for k, v in pairs(tbl)
    return ret
end

------ TEST

--txt = "äöüÄÖÜß12345=,.abDsef EnDe SZ SOS NnN AC -_&#,;&#$"
--txt = "   6789012345   =,.abDsef EnDe SZ SOS NnN AC -_&,;&#$"
-- Kompleette Zeichenkete auf Großbuchstaben (macht nur ASCII)
--local erg = string.upper(txt) or ""

----------------------

function p.f(frame)
    local frame = frame:getParent()
    local txt = ""
    for key, val in pairs(frame.args) do -- Alle Parameter sammeln und Zeilen zuordnen
        if key == 1 then
            txt = val
        elseif key == 2 then
            size = tonumber(val) or 40
        elseif key == 3 then
            region = val or region -- derzeit noch nicht ergänzt.
        end -- if key=
    end -- for key, val
    local erg = string.upper(txt) or ""
    erg = los(erg, TMP) -- Vorbereitung
    erg = los(erg, ABC2) -- Doppel-/Mehrfachzeichen umsetzen
    erg = los(erg, ABC) -- Zeichen temporär in Buchstaben unmsetzen 
    erg = los(erg, EU) -- Buchstaben werden zu Code
	-- CSS-Umrahmung
    erg = '<span style="font-family:monospace;font-size:' .. tonumber(size) .. '%; vertical-align: 1.5ex;">' .. erg .. "</span>"
	-- UND AB GEHT DIE POST!
    return erg
end -- function p.f(frame)

return p