Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


local function fault(alert)
	-- Format message with class="error"
	--     alert   -- string, with message
	-- Returns message with markup
	return string.format("<span class=\"error\">%s [[Vorlage:BGBl|(Hilfe)]]</span>[[Kategorie:Wikipedia:Vorlagenfehler/Vorlage:BGBl]]", alert)
end -- fault()

local function generate(text, lbl, abbr, url)
	-- Generate link
	local lbl2
	if text == "{{{text}}}" or text == "" then
		text = string.format("<abbr title=\"%s\">%s</abbr>", abbr, lbl)
	elseif not string.match(text, "<abbr ") then
		text = string.format("<abbr title=\"%s\">%s</abbr>", abbr, text)
	end
	if url == '' then
		return text
	else
		return string.format("[%s %s]", url, text)
	end

end -- generate()

-- 1 Promille der Dateinamen von bgbl.de sind unsystematisch:
filter={["bgbl106s0437.pdf"]="bgbl106d0437.pdf",
["bgbl106s0438.pdf"]="bgbl106d0438.pdf",
["bgbl106s0444.pdf"]="bgbl106d0444.pdf",
["bgbl106s0454.pdf"]="bgbl106d0454.pdf",
["bgbl106s0464.pdf"]="bgbl106d0464.pdf",
["bgbl106s0465.pdf"]="bgbl106d0465.pdf",
["bgbl106s0466a.pdf"]="bgbl106d0466a.pdf",
["bgbl106s0466b.pdf"]="bgbl106d0466b.pdf",
["bgbl106s0467a.pdf"]="bgbl106d0467a.pdf",
["bgbl106s0467b.pdf"]="bgbl106d0467b.pdf",
["bgbl107s2893.pdf"]="bgbl107065s2893.pdf",
["bgbl107s2894.pdf"]="bgbl107065s2894.pdf",
["bgbl107s2897.pdf"]="bgbl107065s2897.pdf",
["bgbl107s2904.pdf"]="bgbl107065s2904.pdf",
["bgbl107s2930.pdf"]="bgbl107065s2930.pdf",
["bgbl107s2936.pdf"]="bgbl107065s2936.pdf",
["bgbl107s2937.pdf"]="bgbl107065s2937.pdf",
["bgbl107s2938.pdf"]="bgbl107065s2938.pdf",
["bgbl107s2942.pdf"]="bgbl107065s2942.pdf",
["bgbl107s2945.pdf"]="bgbl107065s2945.pdf",
["bgbl107s2961.pdf"]="bgbl107065s2961.pdf",
["bgbl107s2962a.pdf"]="bgbl107065s2962a.pdf",
["bgbl107s2962b.pdf"]="bgbl107065s2962b.pdf",
["bgbl107s2964.pdf"]="bgbl107065s2964.pdf",
["bgbl108s0393.pdf"]="bgbl108010s0393.pdf",
["bgbl108s0394.pdf"]="bgbl108010s0394.pdf",
["bgbl108s0399.pdf"]="bgbl108010s0399.pdf",
["bgbl108s0408.pdf"]="bgbl108010s0408.pdf",
["bgbl108s0414.pdf"]="bgbl108010s0414.pdf",
["bgbl108s0415.pdf"]="bgbl108010s0415.pdf",
["bgbl108s0416.pdf"]="bgbl108010s0416.pdf",
["bgbl206s0825.pdf"]="bgbl206024s825.pdf",
["bgbl206s0826.pdf"]="bgbl206024s826.pdf",
["bgbl206s0827.pdf"]="bgbl206024s827.pdf",
["bgbl206s0830.pdf"]="bgbl206024s830.pdf",
["bgbl206s0832.pdf"]="bgbl206024s832.pdf",
["bgbl206s0834.pdf"]="bgbl206024s834.pdf",
["bgbl206s0836.pdf"]="bgbl206024s836.pdf",
["bgbl206s0837.pdf"]="bgbl206024s837.pdf",
["bgbl206s0838a.pdf"]="bgbl206024s838a.pdf",
["bgbl206s0838b.pdf"]="bgbl206024s838b.pdf",
["bgbl207s1401.pdf"]="bgbl207028s1401.pdf",
["bgbl207s1402.pdf"]="bgbl207028s1402.pdf",
["bgbl207s1416a.pdf"]="bgbl207028s1416a.pdf",
["bgbl207s1416b.pdf"]="bgbl207028s1416b.pdf",
["bgbl207s1418.pdf"]="bgbl207028s1418.pdf",
["bgbl207s1419.pdf"]="bgbl207028s1419.pdf",
["bgbl207s1420.pdf"]="bgbl207028s1420.pdf",
["bgbl207s1423.pdf"]="bgbl207028s1423.pdf",
["bgbl207s1425.pdf"]="bgbl207028s1425.pdf",
["bgbl207s1427.pdf"]="bgbl207028s1427.pdf",
["bgbl207s1428.pdf"]="bgbl207028s1428.pdf",
["bgbl207s1937.pdf"]="bgbl207040s1937.pdf",
["bgbl207s1938.pdf"]="bgbl207040s1938.pdf",
["bgbl207s1950.pdf"]="bgbl207040s1950.pdf",
["bgbl207s1953.pdf"]="bgbl207040s1953.pdf",
["bgbl207s1962.pdf"]="bgbl207040s1962.pdf",
["bgbl207s1967a.pdf"]="bgbl207040s1967a.pdf",
["bgbl207s1967b.pdf"]="bgbl207040s1967b.pdf",
["bgbl207s1968.pdf"]="bgbl207040s1968.pdf",
["bgbl207s1969.pdf"]="bgbl207040s1969.pdf",
["bgbl207s1970.pdf"]="bgbl207040s1970.pdf",
["bgbl207s1971.pdf"]="bgbl207040s1971.pdf",
["bgbl207s1972.pdf"]="bgbl207040s1972.pdf",
["bgbl207s1974a.pdf"]="bgbl207040s1974a.pdf",
["bgbl207s1974b.pdf"]="bgbl207040s1974b.pdf",
["bgbl207s1975a.pdf"]="bgbl207040s1975a.pdf",
["bgbl207s1976.pdf"]="bgbl207040s1976.pdf",
["bgbl208s0781.pdf"]="bgbl208s781.pdf",
["bgbl208s0782.pdf"]="bgbl208s782.pdf",
["bgbl208s0786.pdf"]="bgbl208s786.pdf",
["bgbl208s0790.pdf"]="bgbl208s790.pdf",
["bgbl208s0792.pdf"]="bgbl208s792.pdf",
["bgbl208s0793a.pdf"]="bgbl208s793a.pdf",
["bgbl208s0793b.pdf"]="bgbl208s793b.pdf",
["bgbl208s0794.pdf"]="bgbl208s794.pdf",
["bgbl208s0795.pdf"]="bgbl208s795.pdf",
["bgbl208s0796.pdf"]="bgbl208s796.pdf",
["bgbl211s0010.pdf"]="bgbl2110010.pdf",
["bgbl213s0681.pdf"]="bgbl2130681.pdf",
["bgbl213s0682.pdf"]="bgbl2130682.pdf",
["bgbl213s0763.pdf"]="bgbl2130763.pdf",
["bgbl290s0885.pdf"]="bgbl290s0885_gross.pdf"} -- Einigungsvertrag (zwar nicht fehlerhaft, aber so nicht lesbar)

 
-- Export
local p = { }



function p.linkBGBl(arglist)
	local name = arglist[1]
	local text = arglist.text

	-- Die nächsten Zeilen sind ausschließlich für direkten Modultest sinnvoll.
	if not name then name = "{{{1}}}" end
	if not text then text = "{{{text}}}" end
	--

	local gesetzblatt = "BGBl"
	local teil = ''
	local jahr = ''
	local seite = ''
	local zusatz = ''
	local lbl = ''
	local abbr = ''
	local panchor = ''
	local iseite = ''
	local wartung = ''
	local austria = false

	-- Parse Eingabe
	if string.match(name, "BGBl. ") then
		gesetzblatt = "BGBl"
		name = string.gsub(name, "BGBl. ", "")
	end
	if string.match(name, "StGBl. ") then
		gesetzblatt = "StGBl"
		name = string.gsub(name, "StGBl. ", "")
	end
	if string.match(name, "GBlÖ. ") then
		gesetzblatt = "GBlÖ"
		name = string.gsub(name, "GBlÖ. ", "")
	end
	if string.match(name, "RGBl. ") then
		return fault("Verwende Vorlage <nowiki>{{RGBl|...}}</nowiki> für Reichsgesetzblatt.")
	end

	tmp = string.match(name, "&nbsp;")
	if tmp then
		return fault("&amp;nbsp; nicht erlaubt")
	end
	tmp = string.match(name, "  ") or string.match(name, "/ ") or string.match(name, " [/,%.a-z]")
	if tmp then
		return fault("überschüssiges Leerzeichen")
	end
	tmp = string.match(name, "nI") or string.match(name, "%dI") or string.match(name, "I[SN]") or string.match(name, "[,%.]%d")
	if tmp then
		return fault("fehlendes Leerzeichen")
	end
	jahr, sichtbar, teil, seite, zusatz, iseite, trash = string.match(name, "(%d+)(n*) (%a+) S. (%d+)([a-d]*),* *(%d*)([^ \t\n,0-9]*)")
	if trash and string.len(trash) > 0 then
		return fault("überschüssige Zeichen am Ende")
	end
	if not seite then
		jahr, sichtbar, teil, nummer = string.match(name, "(%d+)(n*) (%a+) Nr. (%d+)")
	end
	if not teil then
		austria = true
		teil, nummer, jahr = string.match(name, "(I+) Nr. (%d+a*)/(%d+)")
		if not teil then
			nummer, jahr = string.match(name, "Nr. (%d+a*)/(%d+)")
			teil = ""
			if not jahr then
				return fault('"S." oder "Nr." fehlt')
			end
		end
	end
	if teil == "I" then
		ateil = 1
	elseif teil == "II" then
		ateil = 2
	elseif teil == "III" then
		ateil = 3
	elseif teil == "" then
		ateil = 0
	else
		return fault("Angabe zum Teil nicht erkannt")
	end
	if (jahr + 0) > 2040 then return fault("Ungültige Jahreszahl") end

	-- Generiere Ausgaben
	-- Österreich
	if austria then
		-- Für Rückwärtskompatibilität
		if gesetzblatt == "BGBl" and (jahr+0) == 1945 and (nummer+0) > 1 then gesetzblatt = "StGBl" end

		if gesetzblatt == "BGBl" then
			if (jahr + 0) >= 1997 and ateil==0 then return fault("BGBl in Österreich benötigt ab 1997 Angabe von Teil") end
			if (jahr + 0) <  1997 and ( not (jahr + 0) == 1934 ) and ateil > 0 then return fault("BGBl in Österreich erlaubt erst ab 1997 Angabe von Teil") end
			if (jahr + 0) == 1934 and ateil > 2 then return fault("BGBl in Österreich erlaubt 1934 keinen Teil III") end

			if ateil == 0 then
				lbl = string.format("BGBl. Nr.&nbsp;%s/%d", nummer, jahr)
			else
				lbl = string.format("BGBl. %s Nr.&nbsp;%s/%d", teil, nummer, jahr)
			end

			if (jahr + 0) >= 1997 then
				abbr = string.format("Bundesgesetzblatt für die Republik Österreich, Teil %s, Nummer %s, Jahrgang %d [PDF]", teil, nummer, jahr)
			elseif (jahr + 0) >= 1945 then
				abbr = string.format("Bundesgesetzblatt für die Republik Österreich, Nummer %s, Jahrgang %d [PDF]", nummer, jahr)
			elseif (jahr + 0) > 1934 or ( (jahr + 0) == 1934 and ateil > 0 ) then
				abbr = string.format("Bundesgesetzblatt für den Bundesstaat Österreich, Nummer %s, Jahrgang %d", nummer, jahr)
			elseif (jahr + 0) >= 1920 then
				abbr = string.format("Bundesgesetzblatt für die Republik Österreich, Nummer %s, Jahrgang %d", nummer, jahr)
			else
				return fault("BGBl in Österreich nur 1920 bis 1938 und ab 1945")
			end
			if (jahr + 0) >= 2004 then
				url = string.format("https://www.ris.bka.gv.at/Dokumente/BgblAuth/BGBLA_%d_%s_%s/BGBLA_%d_%s_%s.pdfsig", jahr, teil, nummer, jahr, teil, nummer)
			elseif (jahr + 0) >= 1945 then
				-- Unsystematischer URL für einziges BGBl aus 1945
				if (jahr + 0) == 1945 and (nummer + 0) == 1 then nummer = 0 end
				url = string.format("https://www.ris.bka.gv.at/Dokumente/BgblPdf/%d_%s_%d/%d_%s_%d.pdf", jahr, nummer, ateil, jahr, nummer, ateil)
			elseif (jahr + 0) > 1934 or ( (jahr + 0) == 1934 and ateil > 1) then
				url = string.format("https://www.ris.bka.gv.at/Ergebnis.wxe?Abfrage=BgblAlt&Bgblnummer=%s/%d&amp;SkipToDocumentPage=True&amp;VonKundmachungsdatum=01.05.1934&amp;BisKundmachungsdatum=14.03.1938", nummer, jahr)
			else
				url = string.format("https://www.ris.bka.gv.at/Ergebnis.wxe?Abfrage=BgblAlt&Bgblnummer=%s/%d&amp;SkipToDocumentPage=True&amp;VonKundmachungsdatum=10.11.1920&amp;BisKundmachungsdatum=30.04.1934", nummer, jahr)
			end	

		elseif gesetzblatt == "GBlÖ" then
			if (jahr + 0) < 1938 or (jahr + 0) > 1940 then return fault("GlBÖ in Österreich nur 1938-1940") end
			lbl = string.format("GBlÖ. Nr.&nbsp;%s/%d", nummer, jahr)
			abbr = string.format("Gesetzblatt für das Land Österreich, Nummer %s, Jahrgang %d", nummer, jahr)
			url = string.format("https://www.ris.bka.gv.at/Ergebnis.wxe?Abfrage=BgblAlt&Bgblnummer=%s/%d&amp;SkipToDocumentPage=True&amp;VonKundmachungsdatum=15.03.1938", nummer, jahr)

		elseif gesetzblatt == "StGBl" then
			lbl = string.format("StGBl. Nr.&nbsp;%d/%d", nummer, jahr)
			if jahr == '1945' then
				abbr = string.format("Staatsgesetzblatt für die Republik Österreich, Nummer %s, Jahrgang %d [PDF]", nummer, jahr)
				url = string.format("https://www.ris.bka.gv.at/Dokumente/BgblPdf/%d_%s_%d/%d_%s_%d.pdf", jahr, nummer, ateil, jahr, nummer, ateil)
			elseif (jahr + 0) >= 1918 and (jahr + 0) <= 1920 then
				if (jahr + 0) == 1918 or ( (jahr + 0) == 1919 and (nummer + 0) <= 484 ) then
					abbr = string.format("Staatsgesetzblatt für den Staat Deutschösterreich, Nummer %s, Jahrgang %d", nummer, jahr)
				else
					abbr = string.format("Staatsgesetzblatt für die Republik Österreich, Nummer %s, Jahrgang %d", nummer, jahr)
				end
				url = string.format("https://www.ris.bka.gv.at/Ergebnis.wxe?Abfrage=BgblAlt&Bgblnummer=%s/%d&amp;SkipToDocumentPage=True&amp;VonKundmachungsdatum=15.11.1918&amp;BisKundmachungsdatum=09.11.1920", nummer, jahr)
			else
				return fault("StGBl In Österreich nur 1918-1920 und 1945")
			end

		else
			return fault("Unbekanntes Gesetzblatt")
		end

		return generate(text, lbl, abbr, url) .. wartung
	end

	-- Bundesrepublik Deutschland
	if (jahr + 0) < 1949 then return fault("BGBl in Deutschland erst ab 1949")  end
	if not gesetzblatt == "BGBl" then return fault("Unbekanntes Gesetzblatt") end
	if not zusatz then zusatz = "" end
	if not sichtbar then sichtbar = "" end
	if not iseite or iseite == "" then
		iseite = ""
	else
		panchor = '#page=' .. (iseite - seite + 1)
	end
	ajahr = jahr % 100
	if sichtbar == "n" then
		lbl = "BGBl."
	else
		lbl = string.format("BGBl. %d", jahr)
	end
	if jahr + 0 > 1950 then
		lbl = string.format("%s %s", lbl, teil)
		abbr = string.format("Bundesgesetzblatt Jahrgang %d Teil %s", jahr, teil)
	else
		abbr = string.format("Bundesgesetzblatt Jahrgang %d", jahr)
	end
	if seite then
		url = string.format("bgbl%d%02ds%04d%s.pdf", ateil, ajahr, seite, zusatz)
		url = filter[url] or url
		url = string.format("https://www.bgbl.de/xaver/bgbl/start.xav?startbk=Bundesanzeiger_BGBl&jumpTo=%s", url)
		lbl = string.format("%s S. %d", lbl, seite)
		if string.len(iseite) > 0 then
			lbl = lbl .. ", " .. iseite
		end
		abbr = string.format("%s Seite %d [PDF], ausgegeben zu Bonn", abbr, seite)
	else
		if jahr + 0 >= 2023 then
			url = string.format("https://www.recht.bund.de/bgbl/%d/%d/%d/VO", ateil, jahr, nummer)
		else
			url = string.format("https://www.bgbl.de/xaver/bgbl/start.xav?startbk=Bundesanzeiger_BGBl&jumpTo=bgbl%d%02d%03d.pdf", ateil, ajahr, nummer)
		end
		lbl = string.format("%s Nr. %d", lbl, nummer)
		abbr = string.format("%s Nummer %d [PDF], ausgegeben zu Bonn", abbr, nummer)
	end
	if ateil == 3 then
		return generate(text, lbl, abbr, "") .. wartung
	else
		return generate(text, lbl, abbr, url .. panchor) .. wartung
	end
end



function p.getbgbl(frame)
	local lucky, r = pcall(p.linkBGBl, frame.args)
	if not lucky then
		r = fault("Parameterfehler in [[Vorlage:BGBl]]: " .. r)
	end
	return r
end



return p