Przejdź do zawartości

Moduł:Infoboksy

Z Wikipedii, wolnej encyklopedii
 Dokumentacja modułu [stwórz] [odśwież]
Edytorzy mogą eksperymentować w brudnopisie (edytuj | różnice) tego modułu.
Zobacz podstrony tego modułu.
local p = {}

function p.grafika(wywolanie)
    local grafika = wywolanie.args[1]

    grafika = mw.ustring.gsub(grafika, "%s*[Pp]lik%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Ff]ile%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Gg]rafika%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Ii]mage%s*:%s*", "Plik:")

    if mw.ustring.match(grafika, "^Plik:(.*)") then
        grafika = mw.ustring.match(grafika, "^Plik:(.*)")
    elseif mw.ustring.match(grafika, "%[%[Plik:([^%[%]|]+)[|%]]") then
        grafika = mw.ustring.match(grafika, "%[%[Plik:([^%[%]|]+)[|%]]")
    end

    return grafika
end

--[[
	Obliczenie domyślnej wartości dla odwracalnych grafik.
	
	Założenia:
	- większość SVG powinna być odwracalna.
	- większość PNG powinna być odwracalna, ale nie grafiki 3D.
	
	Przykład użycia:
	- Szablon:Związek chemiczny infobox

	-- Testy
	local function test_grafika_odwracalna(nazwa_grafiki, oczekiwany_wynik)
		local wynik = p.grafika_odwracalna{args = {nazwa_grafiki}}
		print("(TestSpec)", "Oczekiwany:", oczekiwany_wynik, "Wynik:", wynik, "Dla grafiki:", nazwa_grafiki)
		assert(wynik == oczekiwany_wynik, "Test nie przeszedł dla " .. nazwa_grafiki)
	end
	test_grafika_odwracalna("example.svg", "tak")
	test_grafika_odwracalna("example.PNG", "tak")
	test_grafika_odwracalna("spacje.PNG  ", "tak")
	test_grafika_odwracalna("example-3D-image.png", "nie")
	test_grafika_odwracalna("example.jpg", "nie")
]]
function p.grafika_odwracalna(frame)
	-- Pobieramy nazwę grafiki z argumentu
	local nazwa_grafiki = frame.args[1]
	
	-- Sprawdzamy, czy nazwa grafiki jest zdefiniowana
	if not nazwa_grafiki then
		return "nie"
	end
	
	-- Spr. założeń
	nazwa_grafiki = nazwa_grafiki:match("^%s*(.-)%s*$")
	nazwa_grafiki = nazwa_grafiki:lower()
	if nazwa_grafiki:match("%.svg$") then
		return "tak"
	elseif nazwa_grafiki:match("%.png$") and not nazwa_grafiki:match("%-3d%-") then
		return "tak"
	else
		return "nie"
	end
end

function p.grafika_kategoria(wywolanie)
    local grafika = wywolanie.args[1]
    local kategoria = ""

    grafika = mw.ustring.gsub(grafika, "%s*[Pp]lik%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Ff]ile%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Gg]rafika%s*:%s*", "Plik:")
    grafika = mw.ustring.gsub(grafika, "%s*[Ii]mage%s*:%s*", "Plik:")

    if mw.ustring.match(grafika, "^Plik:(.*)") then
        kategoria = "[[Kategoria:Infoboksy – błędne wywołania plików]]"
    elseif mw.ustring.match(grafika, "%[%[Plik:([^%[%]|]+)[|%]]") then
        kategoria = "[[Kategoria:Infoboksy – błędne wywołania plików]]"
    elseif mw.ustring.match(grafika, "%[http:%/%/") then
        kategoria = "[[Kategoria:Infoboksy – błędne wywołania plików]]"
    elseif mw.ustring.match(grafika, "%[https:%/%/") then
        kategoria = "[[Kategoria:Infoboksy – błędne wywołania plików]]"
    end

    return kategoria
end

function p.grafika_rozmiar(wywolanie)
    local parametr = wywolanie.args[1]
    local maksymalny = wywolanie.args[2] or "BRAK"
    local minimalny = wywolanie.args[3] or "BRAK"

    local maxwidth  = tonumber(mw.ustring.match(maksymalny, "^(%d+)x%d+px$")) or 240
    local maxheight = tonumber(mw.ustring.match(maksymalny, "^%d+x(%d+)px$")) or 500

    local minwidth  = tonumber(mw.ustring.match(minimalny, "^(%d+)x%d+px$")) or 120
    local minheight = tonumber(mw.ustring.match(minimalny, "^%d+x(%d+)px$")) or 100

    local width  = tonumber(mw.ustring.match(parametr, "^(%d+)x?%d*px")) or 240
    local height = tonumber(mw.ustring.match(parametr, "^%d*x(%d+)px"))  or 240

    if width > maxwidth then
        width = maxwidth
    elseif width < minwidth then
        width = minwidth
    end

    if height > maxheight then
        height = maxheight
    elseif height < minheight then
        height = minheight
    end

    rozmiar = width .. "x" .. height .. "px"

    return rozmiar
end

function p.tabela(wywolanie)
    local tabela = ""
    local wiersznaglowek = wywolanie.args['wiersz nagłówek'] or ""
    local wierszpodsumowanie = wywolanie.args['wiersz podsumowanie'] or ""
    local wierszcenter = wywolanie.args['wiersz center'] or "style=\"background:#ddd; border-top:1px solid #aaa; text-align:center;\""
    local separator = "*"
    local linia
    local element
    local kolumny = 0
    local suma = {}
    local pokazsuma = {}
    local format = {}
    local kategoria = "Kategoria:Infoboksy – błędne dane – " .. (wywolanie.args['kategoria'] or "Moduł:Infoboksy")
    local i

    if wywolanie.args['nagłówek'] then
        local naglowek = "!" .. wywolanie.args['nagłówek']
        tabela = tabela .. "|- " .. wiersznaglowek .. "\n"

        while (mw.ustring.match(naglowek, "![^!]*")) do
            kolumny = kolumny + 1

            element = mw.ustring.match(naglowek, "![^!]*")
            naglowek = mw.ustring.gsub(naglowek, p._escapePattern(element), "", 1)
            element = mw.ustring.gsub(element, "!%s*", "")

            tabela = tabela .. "| " .. element .. "\n"
            suma[kolumny] = 0
            pokazsuma[kolumny] = 1
            format[kolumny] = ""
        end
    end

    if wywolanie.args['wiersz'] then
        local wiersz = "!" .. wywolanie.args['wiersz']

        i = 0
        while (mw.ustring.match(wiersz, "![^!]*")) do
            element = mw.ustring.match(wiersz, "![^!]*")
            wiersz = mw.ustring.gsub(wiersz, p._escapePattern(element), "", 1)
            element = mw.ustring.gsub(element, "!%s*", "")

            i = i+1
            format[i] = element
        end
    end

    local wiersze = 0
    if wywolanie.args['tabela'] then
        local zawartosc = wywolanie.args['tabela'] .. "\n"
        while (mw.ustring.match(zawartosc, "[^\n]*\n")) do
            wiersze = wiersze + 1
            linia = mw.ustring.match(zawartosc, "[^\n]*\n")
            zawartosc = mw.ustring.gsub(zawartosc, p._escapePattern(linia), "", 1)
            linia = mw.ustring.gsub(linia, "\n", "")

            tabela = tabela .. "|-\n"

            i = 0
            if mw.ustring.match(linia, "!%+") then
            	linia = mw.ustring.gsub(linia, "!%+%s", "")
            	i = kolumny
            	tabela = tabela .. "! colspan=\"" .. kolumny .. "\" " .. wierszcenter .. " | " .. linia .. "\n"
				linia = ""
            end
            while (i<kolumny and mw.ustring.match(linia, "![^!]*")) do
                element = mw.ustring.match(linia, "![^!]*")
                linia = mw.ustring.gsub(linia, p._escapePattern(element), "", 1)
                element = mw.ustring.gsub(element, "!%s*", "")

                i = i+1

                local liczba
                liczba = mw.ustring.match(element, "^%d+") or ""
                element = mw.ustring.gsub(element, p._escapePattern(liczba), "", 1)

                if tonumber(liczba) == nil then
                    pokazsuma[i] = 0
                else
	                suma[i] = suma[i] + (tonumber(liczba) or 0)
                end
                element = liczba .. element

                if element ~= "" then
                    if format[i] == "()" then
                        element = "(" .. element .. ")"
                    end
                end

                if (wywolanie.args['kol'..i]) then
                    tabela = tabela .. "| " .. wywolanie.args['kol'..i] .. " | " .. element .. "\n"
                else
                    tabela = tabela .. "| " .. element .. "\n"
                end

            end
			while (i<kolumny) do
                i = i+1
				pokazsuma[i] = 0
			end
            if linia ~= "" then
                tabela = tabela .. "|-\n! colspan=\"" .. kolumny .. "\" style=\"background:pink;\" | [[" .. kategoria .. "]] BŁĄD: " .. mw.ustring.gsub(linia, "\n", "") .. "\n"
            end
        end
        if zawartosc ~= "" then
            tabela = tabela .. "|-\n! colspan=\"" .. kolumny .. "\" style=\"background:red;\" | [[" .. kategoria .. "]] BŁĄD: " .. mw.ustring.gsub(zawartosc, "\n", "") .. "\n"
        end
    end

    if wywolanie.args['podsumowanie'] then
        i = 0
        tabela = tabela .. "|- " .. wierszpodsumowanie .. "\n"
        local podsumowanie = "!" .. wywolanie.args['podsumowanie']

        local pokazsumy = 1
        if wiersze < 2 then
            pokazsumy = 0
        end
        local sumowanekolumny = 0
        local sumy = ""
        while (i<kolumny and mw.ustring.match(podsumowanie, "![^!]*")) do
            element = mw.ustring.match(podsumowanie, "![^!]*")
            podsumowanie = mw.ustring.gsub(podsumowanie, p._escapePattern(element), "", 1)
            element = mw.ustring.gsub(element, "!%s*", "")

            i = i+1
            if element == "+" then
                sumowanekolumny = sumowanekolumny+1
                if pokazsuma[i]>0 then
                    if format[i] == "()" then
                        suma[i] = "(" .. suma[i] .. ")"
                    end
                    sumy = sumy .. "| style=\"text-align:right;\" | " .. suma[i] .. "\n"
                else
                    sumy = sumy .. "| \n"
                    pokazsumy = 0;
                end
            else
                sumy = sumy .. "| style=\"text-align:right;\" | " .. element .. "\n"
            end
        end
        if sumowanekolumny == 0 then
            pokazsumy = 0
        end
        if pokazsumy>0 then
            tabela = tabela .. sumy
        end
    end

    return tabela
end

-- kopia z [[Moduł:String]]
function p._escapePattern( pattern_str )
    return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );
end 

function p.usun_grafiki(frame)
	local text = frame.args[1]
	local cat = frame.args[2] or ""
	local suffix = ""
	if text then
		local function fileDetector(input)
			local file = string.match(input, "%[%[[Pp]lik%s*:%s*.-%]%]")
				or string.match(input, "%[%[[Gg]rafika%s*:%s*.-%]%]")
				or string.match(input, "%[%[[Ff]ile%s*:%s*.-%]%]")
				or string.match(input, "%[%[[Ii]mage%s*:%s*.-%]%]")
			if file then
				suffix = cat
				return ""
			else
				return false
			end
		end
		
		local result, _ = string.gsub(text, "%&nbsp;%[%b[]%]", fileDetector)
		result, _ = string.gsub(result, "%[%b[]%]%&nbsp;", fileDetector)
		result, _ = string.gsub(result, "%[%b[]%]%s*", fileDetector)
		result = string.gsub(result, "^<br ?%/?>", " ");

		return result .. suffix
	end
end

function p.usun_wikilinki(frame)
	local text = frame.args[1]
	local signalFiles = frame.args.pliki
	local signalLinks = frame.args.linki
	
	local catPrefix = "[[Kategoria:"
	local catSuffix = "]]"
	local appendix = {""}
	local hasFiles = false
	local hasLinks = false

	local linkEliminator = function(s)
		local cat = mw.ustring.match(s, "^[Kk][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa] *: *(%S.*)$")
			or mw.ustring.match(s, "^[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy] *: *(%S.*)$")
		if cat then
			table.insert(appendix, catPrefix..cat..catSuffix)
			return ""
		end
		
		local file = mw.ustring.match(s, "^[Pp][Ll][Ii][Kk] *: *(%S.*)$")
			or mw.ustring.match(s, "^[Ff][Ii][Ll][Ee] *: *(%S.*)$")
			or mw.ustring.match(s, "^[Ii][Mm][Aa][Gg][Ee] *: *(%S.*)$")
			or mw.ustring.match(s, "^[Gg][Rr][Aa][Ff][Ii][Kk][Aa] *: *(%S.*)$")
		if file then
			hasFiles = true
			return ""
		end
		
		hasLinks = true
		return mw.ustring.match(s, "| *(.+)") or s
	end
	
	local c = 1
	while c > 0 do
		text, c = mw.ustring.gsub(text, "%[%[ *([^%[%]\n\r]-) *%]%]", linkEliminator)
	end

	if hasLinks and signalLinks and (#signalLinks > 0) then
		table.insert(appendix, signalLinks)
	end
	if hasFiles and signalFiles and (#signalFiles > 0) then
		table.insert(appendix, signalFiles)
	end
	
	return text..table.concat(appendix, "")
end

return p