Moduł pomocniczy do obsługi wniosków o wikigranty. Pozwala na automatyczne określenie pewnych wielkości, upraszczając szablon {{Wikigrant}}. Funkcje modułu zakładają, że format tytułu strony z wnioskiem to WG RRRR-NN (RRRR – rok, NN – numer grantu).

Dostępne funkcje:

  • rok()
    Odczytuje rok złożenia grantu z tytułu strony.
  • numer([długość])
    Odczytuje numer wikigrantu w danym roku.
    Jeśli podano opcjonalny parametr długość, numer zostanie uzupełniony zerami z przodu, aby miał przynajmniej taką długość.
  • poprzedni([link_alternatywny])
    Zwraca wikilink do poprzedniego grantu w danym roku. Jeśli poprzedni nie istnieje, zwraca wikikod podany w parametrze link_alternatywny (lub pusty tekst, jeśli nie podano parametru).
  • nastepny([link_alternatywny])
    Zwraca wikilink do następnego grantu w danym roku. Jeśli następny nie istnieje, zwraca wikikod podany w parametrze link_alternatywny (lub pusty tekst, jeśli nie podano parametru).
  • wnioskodawca(nazwa_użytkownika, [projekt_wikimedia])
    Jeśli w parametrze nazwa_użytkownika podano wikilink (tzn. z dwoma nawiasami kwadratowymi), zwraca ten link bez zmian.
    W przeciwnym wypadku, tworzy link postaci [[projekt_wikimedia:User:nazwa_użytkownika|nazwa_użytkownika]].
    Jeśli nie podano projekt_wikimedia, przyjmowana jest polskojęzyczna Wikipedia. Parametr może przyjąć wartość tożsamą z prefiksem interwiki (np. w lub w:szl) – zostanie wykorzystany bez zmian – lub pełną polską nazwą projektu – wtedy tworzony jest link do tego projektu w języku polskim.
    W przypadku, gdy podano więcej niż jeden projekt, wyjście ma postać nazwa_użytkownika (link1, link2, ...), gdzie tekstem wyświetlanym linku jest nazwa projektu (np. Wikipedia, Commons) a stroną docelową – strona użytkownika w tym projekcie.
  • sprawdz_kwote(kwota, [komunikat_bledu])
    Sprawdza, czy kwota jest w poprawnym formacie (tj. \d+(,\d\d)? *PLN). Jeśli tak, zwraca ją. W przeciwnym wypadku zwraca komunikat_bledu lub tekst Niepoprawny format kwoty.
  • data(data)
    Zwraca datę, przekazaną jako parametr. Jeśli jej wartość to {{subst:#time:j xg Y}}, wyświetla wartość tego wyrażenia.
    Ta funkcja ma na celu ominięcie błędu T330987.

-- Prefiksy interwiki według nazw projektów
local wikis = {
	["wikipedia"] = "w",         ["plwiki"] = "w",          ["pl.wikipedia"] = "w",
	["wikiźródła"] = "s",        ["wikisource"] = "s",
	["wikisłownik"] = "wikt",    ["wiktionary"] = "wikt",
	["commons"] = "c",           ["commonswiki"] = "c",
	["wikidane"] = "d",          ["wikidata"] = "d",
	["wikinews"] = "n",
	["wikibooks"] = "b",
	["wikicytaty"] = "q",        ["wikiquote"] = "q",
	["wikipodróże"] = "voy",     ["wikivoyage"] = "voy",
	["wikimedia polska"] = "",   ["wmpl"] = ""
}
-- Mapowanie prefiksu interwiki na nazwę projektu
local sites = {
	["w:"] = "Wikipedia",
	["s:"] = "Wikiźródła",
	["wikt:"] = "Wikisłownik",
	["c:"] = "Commons",
	["d:"] = "Wikidane",
	["n:"] = "Wikinews",
	["b:"] = "Wikibooks",
	["q:"] = "Wikicytaty",
	["voy:"] = "Wikipodróże",
	[""] = "Wikimedia Polska",
	["wmpl:"] = "Wikimedia Polska"
}

local p = {}

function p.rok(frame)
	local currentTitle = mw.title.getCurrentTitle().text
	local yearMatch = mw.ustring.match(currentTitle, "WG (%d%d%d%d)%-%d+")
	return yearMatch or ""
end

function p.numer(frame)
	local padLength = tonumber(frame.args[1]) or 0
	
	local currentTitle = mw.title.getCurrentTitle().text
	local numberMatch = mw.ustring.match(currentTitle, "WG %d%d%d%d%-(%d+)")
	
	if numberMatch == nil then
		return ""
	end
	while #numberMatch < padLength do
		numberMatch = "0"..numberMatch
	end
	return numberMatch
end

function p.poprzedni(frame)
	local defaultLink = frame.args[1] or ""
	
	local currentTitle = mw.title.getCurrentTitle().text
	local year, number = mw.ustring.match(currentTitle, "WG (%d%d%d%d)%-(%d+)")
	
	if year == nil or number == nil then
		return defaultLink
	end
	number = tonumber(number) - 1
	
	local prevTitle = mw.title.new("WG "..year.."-"..number, "")
	if prevTitle.exists then
		return "[["..prevTitle.fullText.."]]"
	end
	return defaultLink
end

function p.nastepny(frame)
	local defaultLink = frame.args[1] or ""
	
	local currentTitle = mw.title.getCurrentTitle().text
	local year, number = mw.ustring.match(currentTitle, "WG (%d%d%d%d)%-(%d+)")
	
	if year == nil or number == nil then
		return defaultLink
	end
	number = tonumber(number) + 1
	
	local nextTitle = mw.title.new("WG "..year.."-"..number, "")
	if nextTitle.exists then
		return "[["..nextTitle.fullText.."]]"
	end
	return defaultLink
end

-- Zaplecze dla funkcji wnioskodawca, ale może być również wykorzystywane
-- przez zewnętrzne moduły
function p.parseUser(userName, interwiki, forceSingle)
	interwiki = mw.ustring.lower(interwiki)
	
	if string.find(userName, "[[", 1, true) ~= nil then
		return userName
	end
	
	if #interwiki == 0 then
		interwiki = "w"
	end
	
	-- Jeśli podano kilka projektów, określ prefiks interwiki dla każdego
	local interwikiPrefixes = {}
	for currentInterwiki in mw.text.gsplit(interwiki, "[+,]") do
		currentInterwiki = mw.ustring.match(currentInterwiki, "%s*([%w.]+)%s*")
		
		if wikis[currentInterwiki] ~= nil then
			currentInterwiki = wikis[currentInterwiki]
		end
		if #currentInterwiki > 0 and mw.ustring.sub(interwiki, -1) ~= ":" then
			currentInterwiki = currentInterwiki..":"
		end
		
		table.insert(interwikiPrefixes, currentInterwiki)
	end
	
	-- Wypisz podlinkowaną nazwę użytkownika
	if #interwikiPrefixes == 1 or forceSingle then
		return "[["..interwikiPrefixes[1].."User:"..userName.."|"..userName.."]]"
	end
	
	-- Wypisz podlinkowane nazwy projektów
	local interwikiUserLinks = {}
	for _, iwPrefix in ipairs(interwikiPrefixes) do
		local displayText = sites[iwPrefix] or iwPrefix
		table.insert(interwikiUserLinks, "[["..iwPrefix.."User:"..userName.."|"..displayText.."]]")
	end
	
	return userName.." ("..table.concat(interwikiUserLinks, ", ")..")"
end

function p.wnioskodawca(frame)
	local userName = frame.args[1] or ""
	local interwiki = frame.args[2] or "w"
	
	-- Obejście [[phab:T330987]]
	if userName == "{{subst:REVISIONUSER}}" then
		return "''zostanie wypełnione automatycznie''"
	end
	
	return p.parseUser(userName, interwiki, false)
end

function p.sprawdz_kwote(frame)
	local amount = frame.args[1]
	local errorText = frame.args[2] or "Niepoprawny format kwoty."
	local validatePatterns = { "^ *%d+,%d%d *PLN *$", "^ *%d+ *PLN *$" }
	
	for _, pattern in ipairs(validatePatterns) do
		if string.match(amount, pattern) then
			return amount
		end
	end
	
	return errorText
end

function p.data(frame)
	local d = frame.args[1]
	if d == "{{subst:#time:j xg Y}}" then
		d = frame:callParserFunction("#time", "j xg Y")
	end
	return d
end

return p