Модуль:Не перекладено/пісочниця

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
{{i}} Документація модуля[створити]
-- Модуль покликаний замінити, а згодом розширити новим функціоналом вікікод
-- однойменного шаблону.

-- TODO Докоментувати код
-- TODO Створити документацію до модуля
-- TODO Імплементувати фічі роботи з ВД запропоновані Атою на СО шаблону

local p = {}

-- Щоб порожні використання параметрів вважались нілевими. Нілеві значення, на
-- відміну від порожніх рядків, дають булеву хибу для умовних операторів.
-- Кращий спосіб робити цю валідацію вітається.
local function init(vari)
	if vari == "" then
		return nil
	else
		return vari;
	end
end

-- має замінити [[Шаблон:Не перекладено/lang]]
local function conjugatedLanguagePhrase(language, nocat, currentTitleText)
	-- TODO відсортувати за абеткою (будь-якою)
	-- TODO замінити на якусь дуже розумну функцію з витягуванням назв мов з
	-- рушія, або ж на використання функції з іншого модуля
	
	local phrase = "";
        local cat = "";
        -- TODO зробити кращий вивід категорій-індикаторів помилок
	
	local languagePairs = {
		["d"] = "Вікіданих",
		["simple"] = "англійською",
		["en"] = "англійською",
		["et"] = "естонською",
		["ru"] = "російською",
		["de"] = "німецькою",
		["fr"] = "французькою",
		["la"] = "латиною",
		["es"] = "іспанською",
		["uk"] = "українською",
		["it"] = "італійською",
		["pt"] = "португальською",
		["pl"] = "польською",
		["ba"] = "башкирською",
		["el"] = "грецькою",
		["bg"] = "болгарською",
		["ja"] = "японською",
		["nl"] = "нідерландською",
		["he"] = "на івриті",
		["be"] = "білоруською",
		["be-tarask"] = "білоруською",
		["be-x-old"] = "білоруською",
		["sv"] = "шведською",
		["fi"] = "фінською",
		["am"] = "вірменською",
		["lv"] = "латиською",
		["ar"] = "арабською",
		["zh"] = "китайською",
		["az"] = "азербайджанською",
		["tr"] = "турецькою",
		["lt"] = "литовською",
		["hu"] = "угорською",
		["no"] = "норвезькою (букмол)",
		["nn"] = "норвезькою (нюношк)",
		["sr"] = "сербською",
		["cs"] = "чеською",
		["cz"] = "чеською",
		["ga"] = "ірландською",
		["ro"] = "румунською",
		["crh"] = "кримськотатарською",
		["da"] = "данською",
		["ca"] = "каталонською",
		["hr"] = "хорватською",
		["fa"] = "на фарсі",
		["sa"] = "санскриті",
		["sk"] = "словацькою",
		["id"] = "індонезійською",
		["ko"] = "корейською",
		["os"] = "осетинською",
		["is"] = "ісландською",
		["mn"] = "монгольською",
		["hi"] = "на хінді",
		["tt"] = "татарською",
		["eu"] = "баскською",
		["cy"] = "валлійською",
		["mk"] = "македонською",
		["uz"] = "узбецькою",
		["sl"] = "словенською",
		["kk"] = "казахською",
		["sq"] = "албанською",
		["gd"] = "гаельською",
		["eo"] = "есперанто",
		["fy"] = "західнофризькою",
		["hy"] = "вірменською",
		["ka"] = "грузинською",
		["mdf"] = "мокшанською",
		["nb"] = "норвезькою (букмол)",
		["rue"] = "русинською",
		["sah"] = "якутською",
		["sh"] = "сербохорватською",
		["tl"] = "тагальською",
		["vi"] = "в'єтнамською",
		["yi"] = "на їдиші",
		["ms"] = "малайською",
		["tg"] = "таджицькою",
		["bs"] = "боснійською",
		["si"] = "сингальською",
		["ur"] = "мовою урду",
		["ps"] = "мовою пушту",
		["km"] = "кхмерською",
		["th"] = "тайською",
		["to"] = "тонганською",
		["lo"] = "лаоською",
		["dv"] = "мальдівською",
		["br"] = "бретонською",
		["aa"] = "афарською",
		["ab"] = "абхазькою",
		["af"] = "мовою африкаанс",
		["ak"] = "мовою акан",
		["am"] = "амхарською",
		["an"] = "арагонською",
		["as"] = "ассамською",
		["av"] = "аварською",
		["ay"] = "мовою аймара",
		["pap"] = "мовою пап’яменто",
		["lb"] = "люксембурзькою",
		["ku"] = "курдською",
		["so"] = "сомалійською",
		["mt"] = "мальтійською",
		["na"] = "науруанською",
		["ne"] = "непальською",
		["gl"] = "галісійською",
		["sc"] = "сардинською",
		["scn"] = "сицилійською",
		["ky"] = "киргизькою",
		["wa"] = "валлонською",
		["kl"] = "ґренландською",
		["fo"] = "фарерською",
		["ast"] = "астурійською",
		["kv"] = "мовою комі",
		["tyv"] = "тувинською",
		["ce"] = "чеченською",
		["cv"] = "чуваською",
		["rw"] = "руандійською",
		["haw"] = "гавайською",
		["ch"] = "мовою чаморро",
		["co"] = "корсиканською",
		["als"] = "алеманським діалектом німецької мови",
		["ceb"] = "себуанською",
		["frp"] = "франко-провансальською",
		["bn"] = "бенгальською",
		["myv"] = "ерзянською",
		["sw"] = "мовою суахілі",
		["oc"] = "окситанською",
		["arz"] = "єгипетською арабською",
		["avk"] = "мовою котава",
		["kw"] = "корнською",
		["vec"] = "венеційською",
		["ta"] = "тамільською",
		["szl"] = "сілезькою",
		["sco"] = "шотландською рівниною",
		["rup"] = "арумунською",
		["mr"] = "мовою маратхі",
		["ht"] = "гаїтянською креольською",
		["hsb"] = "верхньолужицькою"
	}
	
	conjugatedLanguageName = languagePairs[language];
	if conjugatedLanguageName then
		phrase = phrase .. conjugatedLanguageName;
	else
		phrase = phrase .. "(помилка: непідтримувана мова)";
		if not nocat then
			cat = cat .. "[[Категорія:Вікіпедія:Статті з непідтримуваною мовою в шаблоні Не перекладено|" .. language .. "]]";
		end
	end

	local unconjugatable = {
		["d"]  = true,
		["eo"] = true,
		["he"] = true,
		["sa"] = true,
		["hi"] = true,
		["fa"] = true,
		["la"] = true,
		["yi"] = true,
		["ur"] = true,
		["ps"] = true,
		["af"] = true,
		["ak"] = true,
		["ay"] = true,
		["pap"] = true,
		["kv"] = true,
		["ch"] = true,
		["als"] = true,
		["sw"] = true,
		["avk"] = true,
		["mr"] = true
	}
	
	if not unconjugatable[language] then
		phrase = phrase .. " мовою";
	end
	
	return {phrase, cat};
end


-- Головна функція
function p.main(frame)
	-- Витягуємо параметри батьківського шаблону
	local parent = frame:getParent();
	local args = parent.args;
	
	-- Перетягування батьківських параметрів у змінні
	local needed = init(args["треба"]) or init(args[1]);
	local text = init(args["текст"]) or init(args[2]);
	local language = init(args["мова"]) or init(args[3]) or "en";
	local exist = init(args["є"]) or init(args[4]) or init(args[1]);
	
	-- відрізати прогалини
	language = string.gsub(language, "(%s+)", "");
	
	-- Створюємо таблицю поточної сторінки щоб перевірити її пн, щоб разом з 
	-- параметром nocat вирішити чи треба її категоризувати
	local currentTitle = mw.title.getCurrentTitle();
	-- Назва поточної сторінки. Використовуватиметься для ключів сортування
	local currentTitleText = currentTitle.text;
	
	-- Витягуємо параметр nocat
	local nocat = init(args["nocat"]);
	
	-- та перевіряємо простір назв поточної сторінки
	-- не порожнє значення nocat та нульовий простір назв означають що сторінку
	-- можна категоризувати.
	-- інші простори ще й як треба категоризувати, особливо категорією "неактуальний шаблон".
	-- інакше обхід категорії Вікіпедія:Статті з неактуальним шаблоном Не перекладено 
	-- не виправляє наприклад включення в шаблонах, а це потрібно, бо інакше статті з цим шаблоном
	-- в цю категорію потрапляють, але шаблону не містять, його треба прибрати з якогось включення
	local ns = currentTitle.namespace; 
	if ns == 1 or ns == 2 or ns == 3 then nocat = 1; end

	-- Головна змінна побудови рядка виводу
	local wrt = "";
	-- Таблиця назви яка "треба"
	if needed == nil then
		error("Параметр з назвою сторінки яку треба створити обов'язковий (перший параметр, або параметр треба)")
	end
	local neededTitle = mw.title.new(needed, "");
	
	-- Булева змінна, яка показує чи існує стаття, яка "треба"
	local neededExists = neededTitle.exists;
	
	-- Створюмо внутрішнє посилання на статтю, що "треба"
	local linkToNeeded = "";
	linkToNeeded = linkToNeeded .. "[[";
	linkToNeeded = linkToNeeded .. needed;
	if text then
		linkToNeeded = linkToNeeded .. "|" .. text;
	end
	linkToNeeded = linkToNeeded .. "]]";
	
	-- Не залежно від того чи стаття, що "треба" існує ми робимо на неї
	-- посилання. Що змінюється — лише колір — і це за нас обробляє рушій
	wrt = wrt .. linkToNeeded;

	
	if neededExists then
		-- Дії, що здійснюється якщо стаття, яка "треба" існує
		local alert = mw.html.create("span");
		alert:addClass("noprint visible-to-contributors");
		alert:attr("title","Шаблон «не перекладено» не замінено");
		alert:css({["color"]="red"});
		alert:wikitext("●");
		wrt = wrt .. tostring(alert);
		if not nocat then
			-- Дії, які здійснюються якщо цю сторінку можна категоризувати
			wrt = wrt .. "[[Категорія:Вікіпедія:Статті з неактуальним шаблоном Не перекладено|" .. currentTitleText .. "]]"
		end
	else
		-- Дії, які здійснюються якщо стаття, яка "треба" не існує
		
		-- Створюємо HTML-елемент тексту у верхньому індексі
		local sup = mw.html.create("sup");
		-- Додаємо до нього клас "noprint"
		sup:addClass("noprint");
		
		local linkToExist = "";
		linkToExist = linkToExist .. "[[";
		linkToExist = linkToExist .. ":" .. language .. ":" .. exist;
		if language == "d" then
			linkToExist = linkToExist .. "#sitelinks-wikipedia";
		end
		linkToExist = linkToExist .. "|";
		
		local span = mw.html.create("span");
		local spanCSS = {
			["font-size"] = "normal",
			["font-style"] = "normal",
			["font-weight"] = "normal"
		}
		span:css(spanCSS);
		
		spanTitle = "";
		-- я (Base) не маю жодного уявлення що б це мало бути, але це порівняння
		-- з "d" походить з оригінального коду. Потребує дослідження, оскільки
		-- фічу не документовано.
		-- Це ж значною мірою стосується й решти умовних операторів, що
		-- стосуються атрибуту title
		-- "d" - робить посилання на Вікідані
		if language == "d" then
			spanTitle = spanTitle .. "Сторінка статті ".. needed .. " на";
		else
			if exist then
				spanTitle = spanTitle .. exist .. " — в";
			else
				spanTitle = spanTitle .. "В";
			end
			spanTitle = spanTitle .. "ерсія статті «".. needed .."»";
		end
                conjugatedLanguagePhraseAndCat = conjugatedLanguagePhrase(language, nocat, currentTitleText);
		spanTitle = spanTitle .. " " .. conjugatedLanguagePhraseAndCat[1];
		span:attr("title", spanTitle);
		span:wikitext("[" .. language .. "]");
		linkToExist = linkToExist .. tostring(span);
		linkToExist = linkToExist .. "]]";
                linkToExist = linkToExist .. conjugatedLanguagePhraseAndCat[2];	
		sup:wikitext(linkToExist);
		wrt = wrt .. tostring(sup);
	end
	return wrt;
end


return p;