Модуль:Citation/CS1/Generate language table

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

Цей модуль використовується для автоматичного генерування мовної таблиці із даних MediaWiki, які після внесення певних змін можна додавати в Модуль:Citation/CS1/Configuration.

Використання

[ред. код]
  • Для формування всієї таблиці:

{{#invoke:Citation/CS1/Generate language table|generate_table}}

  • Для формування рядка таблиці:

{{#invoke:Citation/CS1/Generate language table|generate_row|код_мови}}

require ("strict");

local cfg = require("Module:Citation/CS1/Configuration")						--підключаємо модуль, щоб отримати різні конфігурації з основного модуля (в основному для отримання коду цієї мови)
local is_set = require("Модуль:Citation/CS1/Utilities").is_set					--підключаємо модуль, щоб завантажити функцію is_set
local in_array = require("Модуль:Citation/CS1/Utilities").in_array				--підключаємо модуль, щоб завантажити функцію in_array

local function get_params (lang, tag, is_one_element)
	local nominative, instrumental, is_noun, maybe_article_name					--оголошуємо зміні
	if  mw.ustring.match(lang, "ка$") then								        --перевіряємо чи назва закінчується ка, якщо закінчення на ка, то цей ймовірно є прикметником, а тому може відмінюватися
		nominative = lang														--передаємо назву мови, що йтак є в називному відмінку
		instrumental = lang:gsub('а$', 'ою')									--формуюємо орудний відмінок, замінивши а на ою
		maybe_article_name = nominative .. " мова"								--формуємо потенційну назву статті, додавши закінчення мова
	else																		--якщо іменник, то
		nominative = lang												        --передаємо назву мови, що йтак є в називному відмінку
		is_noun = true															--встановлюємо значення, що це є іменник
		maybe_article_name = nominative .. " (мова)"							--формуємо потенційну назву статті, додавши закінчення (мова)
	end	
		
	local article_name									
	if is_one_element then														-- якщо формується лише один елемнт таблиці, то здійснюємо перевірку на наявність статті
		maybe_article_name = mw.title.new(maybe_article_name)					--перетворюємо потенційну навзу статті на клас назви статті; робимо це тут, що при формуванні всієї таблиці maybe_article_name була змінною, а не таблицею чи класом
		local maybe_simple_article_name = mw.title.new(nominative)				--потенційна назва статті без приставки (мова)
		if maybe_article_name.exists then										--якщо стаття існує, то
			article_name = maybe_article_name.fullText							-- передаємо потенційну назву статті у змінну
		elseif is_noun and maybe_simple_article_name.exists then				--якщо це іменник і відсутня назва з приставкою (мова), то перевіряємо, чи існу стаття без цієї приставки
			article_name = maybe_simple_article_name.fullText					--якщо стаття існує, то передаємо потенційну назву статті у змінну
		end
	else																		-- якщо формується вся таблиця, то (так як перевірка наявності статті з таким ім'я для цілого списку є затратним процесом) 
		article_name = maybe_article_name										-- то просто передаємо назву мови напряму
	end	
		
	local instrumental_text = is_set(instrumental) and ", instrumental = \"" .. instrumental .. "\"" or '' --формує частину тексту з оруднум відмінком, якщо значення змінної не пусте; якщо пусте, то передаємо пустий рядок
	local link_text = is_set(article_name) and ", link = \"" .. article_name .. "\"" or '' --формує частину тексту з назвою статті, якщо значення змінної не пусте; якщо пусте, то передаємо пустий рядок
	local is_noun_text = is_noun and ", is_noun = true" or ''					--формує частину тексту з булевим параметри чи є назва мови іменником, якщо значення змінної є true; якщо false, то передаємо пустий рядок
	local lang_table = "['" .. tag .."'] = { nominative = \"" .. nominative .. "\"" .. instrumental_text .. ", short = \"\"" .. link_text .. is_noun_text .."}" --формує повний рядок таблиці з кодом мови, навзи мови в називному і орудному відмінку, назви статті мови та чи є мова іменником
	return lang_table															--повертаємо сформовану таблицю
end	

local function unknown_parameter (lang_param, is_sandbox)
	local supported_langauge_codes = is_sandbox and require("Модуль:Citation/CS1/Language List").supported_langauge_codes or cfg.supported_langauge_codes
	if #lang_param>=2 and #lang_param<=8 and in_array(lang_param, supported_langauge_codes[#lang_param]) then -- перевіряємо чи вказано мовний код і чи підтримується він модулем
		return ''																--якщо код мови, що підтримується, то нічого не повертаємо 
	else
		return lang_param														--якщо не код мови або код мови, що не підтримується, то повертаємо код мови
	end	
end

local function generate_table(frame) 
	local lang_table = mw.language.fetchLanguageNames (cfg.this_wiki_code, 'all'); --отримуємо таблицю всіх мов і їхніх кодів з MediaWiki з локолізацію під поточну вікі
	local format_lang_table = ""												--зміна, що міститиме відформатовану таблицю
	
	local only_unknown_code = frame.args[1]
	local is_sandbox = frame.args[2]
	
	for k, v in pairs(lang_table) do											--ітеруємо (проходимо) через кожен елемент таблиці, де k - код мови, а v - назва мови
		local code = only_unknown_code and unknown_parameter (k, is_sandbox) or k
		if code ~= '' then
			format_lang_table = format_lang_table .. get_params(v, code, false) ..",<br/>" --формує всю таблицю, додавши значення з попередньої ітерації, сформовний рядок таблиці з get_params() та завершальну частину з комою і переходом на новий рядок
		end
	end
	
	return format_lang_table:gsub(",<br/>$", "")								--повертаємо сформовану таблицю, прибравши з останього рядка кому та перехід на новий рядок
end

local function generate_row(frame) 
	local code = frame.args[1]													--передаємо код мови, який ввів користувач, у змінну 
	local lang = mw.language.fetchLanguageNames (cfg.this_wiki_code, code); 	--отримуємо значення для мови за вибраним кодом мови з MediaWiki з локолізацію під поточну вікі
	return get_params(lang[code], code, true)											--повертаємо сформований рядок фкнкцією get_params()
end	

local function get_unknown_parameters (frame)
	local lang_table = mw.language.fetchLanguageNames (cfg.this_wiki_code, 'all');
	local format_lang_table = ""
	local is_sandbox = frame.args[1]
	
	for k, v in pairs(lang_table) do											--ітеруємо (проходимо) через кожен елемент таблиці, де k - код мови, а v - назва мови
		format_lang_table = format_lang_table .. unknown_parameter(k, is_sandbox) ..", " --формує всю таблицю, додавши значення з попередньої ітерації, сформовний рядок таблиці з unknown_parameter() та завершальну частину з комою
	end
	
	return format_lang_table
end

return {
	generate_table = generate_table,
	generate_row = generate_row,
	get_unknown_parameters = get_unknown_parameters
};