Modul:Benutzer:Kpfiwa/scripts
Die Dokumentation für dieses Modul kann unter Modul:Benutzer:Kpfiwa/scripts/Doku erstellt werden
local M = {}
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 = 99 -- theoretische Vorgabe für Signet, wird ggf. überschrieben mit wstdF oder wstdW
local wstdF = 31 -- mit Rand, gemessen an Katar (28) Iran hatte aber schon 3:1, müsste hier also ~51 sein
local wstdW = 14 -- für Wappen mit Rand, gemessen an 12x12, also quadratisch
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 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
function M.tu(a,z) return tu(a,z) end -- da mehrfachaufruf intern
function M.trim(s) -- entfernt überflüssige führende und/oder anhängende Leerzeichen
return s:match "^%s*(.-)%s*$"
end
function M.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
function M.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
function M.nbsp(k) --Hier werden Leerzeichen durch ' ' ersetzt => NOWRAP außer bei v=1 (und mehr)
return nbsp(k)
end -- function nbsp
function M.nopi(k) --Hier werden Pipezeichen durch ' ' ersetzt => NOWRAP
return k:gsub("|", " ")
end -- function nbsp
function M.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 ( ) . % + - * ? [ ^ $
return r
end -- putze
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
function M.nnbsp(k,i) --
return nnbsp(k,i)
end -- function M.nnbsp
function M.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 -- round
function M.round(val,decimal) -- css will bei zu vielen Nachkommastellen streiken
return round(val,decimal)
end -- M.round
function M.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
if wstd == 99 then wstd= w + 2 end -- Anpassung für Signet
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
function M.nonum(key)
return nonum(key)
end
function M.is_in(tab, val)
for index, value in ipairs(tab) do
if value == val then return true end
end
return false
end
function M.orf(v)
v = tu(v)
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
function M.split(s) return split(s) end
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
function M.ssl(lkz,r,val) return ssl(lkz,r,val) end
function M.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)
function M.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 M.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 -- valkombi
function M.exhtml(a)
return string.gsub(a, '%s+/>', '>') -- Lua-Murks korrigieren, macht aus XHTML <br /> ein <br />
end --exhtml
function M.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
return M