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 '&nbsp;' ersetzt => NOWRAP außer bei v=1 (und mehr)
	if tblx == 0 then k = k:gsub(" ", "&nbsp;") end
	return k
end -- function nbsp
function M.nbsp(k) --Hier werden Leerzeichen durch '&nbsp;' ersetzt => NOWRAP außer bei v=1 (und mehr)
	return nbsp(k)
end -- function nbsp

function M.nopi(k) --Hier werden Pipezeichen durch '&nbsp;' ersetzt => NOWRAP
	return k:gsub("|", "&nbsp;")
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*&nbsp;%s*', '&nbsp;') -- überflüssige Leerzeichenkombinationen auf 1 nbsp reduzieren
	r = r:gsub('&#8239;<', '<') --REFs
	r = r:gsub('^%s+', '') -- Space am Zeilenbeginn
	r = r:gsub('span>&nbsp;', '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)," ", "&#8239;") .. string.sub (k, i+1) 
	else return "&#8239;" -- evtl. wäre '&thinsp;' 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 -- .. '&nbsp;'
	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 &lt;br&nbsp;/&gt;
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