Modul:Benutzer:Gadacz/Flagge

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Dieser Artikel ist im Entstehen und noch nicht Bestandteil der freien Enzyklopädie Wikipedia.

Solltest du über eine Suchmaschine darauf gestoßen sein, bedenke, dass der Text noch unvollständig sein und Fehler oder ungeprüfte Aussagen enthalten kann. Wenn du Fragen zum Thema hast, nimm am besten Kontakt mit den Autoren auf.

noch in Arbeit

--[=[ Flagge Version 3e, 2019-11-11
	Formatierung von alternativer Ländervorlage mit Flagge und diverse zusäzliche Funktionen
]=]
-- Module globals
local flagborder = ''
local fli = {}
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 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 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
	return k:gsub(" ", " ")
end -- function nbsp

local function nopi(k) --Hier werden Pipezeichen durch ' ' ersetzt => NOWRAP
	return k:gsub("|", " ")
end -- function nbsp

local function nnbsp(k) --Hier wird statt ' ' ein schmales, geschütztes Leerzeichen => NOWRAP eingefügt bzw. (wenn k) ' ' damit ersetzt
	if k then return k:gsub(" ", " ")
	else return "&#8239;" -- evtl. wäre '<span style="font-size:0.167em;">&nbsp;</span>' oder '&thinsp;' 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,val,logowidth,flglnk) -- setzt die Grafik mit entsprechenden Links zusammen
	local noflag = 'Flag_of_None.svg'
	if nopic then return end
	local h,w
	local nowrap = 'white-space:nowrap;'
	local f = fli[val].f or noflag-- Grafik/Flagge
	if fli[val].h and fli[val].w then --falls es Größeneintrag gibt, ...
		h = fli[val].h; w = fli[val].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 tonumber(flglnk) == 1 then flglnk = '|link=' .. (fli[val].lf or flgpic)  -- Flaggenlink
		elseif tonumber(flglnk) == 0  then flglnk = ''
		else flglnk = '|link=' .. linkziel or flgpic
	end
	if fli[val].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]]'
	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

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)
	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,trenner,nw) --[[ Trennt kombinierte Spracheingaben wie აფხაზეთი|Apchaseti
							etwas problematisch, da Lua mit UTF8 ungnädig umgeht
							nw = nowrap: ersetzt ' ' mit &nbsp; --]]
	local erg = {}
	local starte = 1
	local sps, spe = s:find(trenner,starte)
	while sps do
		table.insert(erg,s:sub(starte,sps-1))
		starte = spe+1
		sps, spe = s:find(trenner,starte)
	end
	table.insert(erg,s:sub(starte))
	if erg then
		r = erg[1] or ''
		if erg[2] then r = r .. " ''" .. erg[2] .. "''" end
	end
	if nw then return r:gsub(" ", "&nbsp;") end
	return r
end -- function split

local function ssl(lkz,r,val)
	local ret = ''
	if type(tonumber(lkz)) ~= "number" then
		 --[[ Ergänzung  für R2L-Schriften, da Modul:Vorlage:lang nur sehr mittelmäßig angelegt.
			rtl={"ar","arc","arz","azS-Arab","ckb","dv","fa","hbo","he","ku","ota","ps","sdS-Arab","syc","syr","ug","ur","yi"}
			 "ar" braucht Sonderbehandlung, "azS-Arab" und "sdS-Arab" passen nicht ins Schema, da "S" in der Mitte
		--]]	
		local rtl = {"arc","arz","ckb","dv","fa","hbo","he","ku","ota","ps","syc","syr","ug","ur","yi","may"}
		if lkz == 'ar' then  val = val:gsub("|", "&lrm;|w=")
		elseif is_in(rtl, lkz) then val = val:gsub("|", "&lrm;|")
		else end
		if #r > 1 then 	ret = ', '	end
		ret = ret .. '<span style="white-space:nowrap">{{' .. lkz .. 'S|' .. val .. '}}</span>'
	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 split(value,"|",1)
			elseif n == 3 then r = r .. ssl(lkz,r,value)
			elseif 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,"|",1)
				end
			else
				if lkz==1 then linktext = split(value,"|",1) end -- default
			end -- if lkz
		end -- for
	else
		--	r=split(v,"|")
		-- if n == 1 then linktext = split(v,"|",1); r=''	end
		if n == 1 then linktext = v .. 'HIER'; r=''	end
	end -- (type(v))
	r = r:gsub('^[%(, ]+','') -- ', ' am Anfang rasieren
	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 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 entshlüsselt und verbessert werden
		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
				-- 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
			fli = loli(val)
			kzn = val -- 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 linktext = val -- link[t]ext abweichend von 1
		elseif key == 'H' then logohight = tonumber(val) -- [H]öhe (Zukunftsmusik)
		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 addon = val -- Ergänzungstext aus Liste oder übergeben als ausgeschriebener Parameter
		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
		end -- if key ...
	end -- for key, val in ..
	-- Jetzt die Tabellenzeile für 'kzn' (Kennzeichen) auslesen
	local val = kzn -- entbehrlich?
	if not fli[val] then val = 'ZZZ' end --[[ falsches oder fehlendes Kennzeichen. Jede Liste hat so ein 'ZZZ' --]]
	if fli[val] then
		linkziel = linkziel or fli[val].l or '' -- Link auf Lemma
		linktext = linktext or fli[val].lt or fli[val].l or linkziel -- sichtbarer Linktext, default = Lemma
		arh = fli[val].h or 1 -- Höhe (amtlich, aus aspect ratio)
		arw = fli[val].w or 1 -- Breite dto
		flgpic = fli[val].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 fli[val].s or linktext or linkziel -- Sortierschlüssel aus Liste, default Linkziel
		if fli[val].b then flagborder = '|border' or '' end -- Bildrand
	end -- if fli[val]

	-- 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,val,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

	local trailer = '' -- das "Schwänzle"
	local on = fli[val].o
	if orig and on then
		trailer = tail(on,orig)
		if orig ~= "1" and trailer ~= '' then
			--			tt='{{nowrap|' .. trailer ..'}}'
			tt=trailer
			trailer = ' (' .. frame:preprocess{text = tt} .. ")"
			--[[ das muss ersetzt werden durch Wikipedia:Lua/Modul/Vorlage:lang/de#Funktionen_für_Lua-Module --]]
		end
	end -- if orig
	local ad = fli[val].a -- Zusatzangaben aus Liste '=1' oder manuell eingegeben
	if addon and ad then
		if addon == "1" and ad then addon = ad end
		if addon ~= "1" then addon = addon end -- manuelle Eingabe hat Priorität
		trailer = trailer .. ', ' .. nnbsp(addon)
	end -- if addon and ad
	if not nopic then
		bild, nowrap = fpic(orient,val,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= '&nbsp;[[' .. linkziel .. '|' .. linkex(linktext) ..']]' -- Hier Linktext bereinigen, falls in Text bereits Links sind
	return sort .. bild .. link .. trailer -- da ist dann alles zusammen!
end -- function p.f(frame)
----- AB DIE POST!
return p