Модуль:language

Матеріал з Вікісловника

Призначення[ред.]

Шаблон для отримання універсальної інформації про мови

Параметри[ред.]

  • get — основна функція отримання даних, приймає два параметри:
    • lang — код мови (наприклад, ru, orv тощо.)
    • param — тип одержуваної інформації (ввід та вивід регістрочутливі)
      • name, title, ім, наз, назва, ім’я — повертається назва мови
      • cat, category, кат, категорія — повертається категорія для мови
      • cat2 — повертається друга категорія для мови (якщо вказана)
      • from, від, gen, genitive, род, його — повертається назва у родовому відмінку
      • on, на, pre, місц — повертається назва у місцевому відмінку
      • pl, мн, plural, вони — повертається назва у множині
      • adj, прикм, прикметник — повертається форма прикметника
      • short, скор, скорочення — повертається скорочення
  • print_table — функція для роздруківки поточних даних модуля language/data у гарній, зрозумілій формі (використовується на сторінці документації модуля language/data)

Застосовані модулі[ред.]

Мовні дані зберігаються у модулі language/data

Див. також[ред.]


-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:language/data");
local p = {};

-- вспомогательная функция, удаляет пробелы
function string.trim(value)
	return (value:gsub("^%s*(.-)%s*$", "%1"));
end

local function get_param(param)
	local param = mw.ustring.lower(param)
	if param == '' or param == 'наз' or param == 'назва' or param == 'ім’я' or param == 'title' or param == 'ім' then
		param = 'name'
	end
	if param == 'category' or param == 'кат' or param == 'категорія' then
		param = 'cat'
	end
	if param == 'gen' or param == 'genitive' or param == 'від' or param == 'род' or param == 'його' then
		param = 'from'
	end
	if param == 'pre' or param == 'на' or param == 'місц' then
		param = 'on'
	end
	if param == 'прикм' or param == 'прикметник' then
		param = 'adj'
	end
	if param == 'скор' or param == 'скорочення' then
		param = 'short'
	end
	if param == 'мн' or param == 'plural' or param == 'вони' then
		param = 'pl'
	end
	return param
end

local function nom_case(value)
	local result = value:gsub("%{%}", '')
	result = result:gsub("%{а%}", 'а')
	result = result:gsub("%{і%}", 'і')
	result = result:gsub("%{ий%}", 'ий')
	result = result:gsub("%{а%}", 'а')
	return result
end

local function gen_case(value)
	local result = value:gsub("%{%}", 'а')
	result = result:gsub("%{а%}", 'ої')
	result = result:gsub("%{і%}", 'их')
	result = result:gsub("%{а%}", 'ої')
	return result
end

local function pre_case(value)
	local result = value:gsub("%{%}", 'е')
	result = result:gsub("%{а%}", 'ом')
	result = result:gsub("%{і%}", 'их')
	result = result:gsub("%{ый%}", 'ом')
	return result
end

local function plural(value)
	local result = value:gsub("%{%}", 'і')
	result = result:gsub("%{а%}", 'і')
	result = result:gsub("%{ие%}", 'і')
	result = result:gsub("%{а%}", 'і')
	return result
end

local function get_name(value)
	local result = value
	result = result:gsub("'([^']+)'", '%1')
	result = result:gsub("(%[мова%])", '')
	result = result:gsub("(%[мови%])", '')
	result = result:gsub("(%[діалект%])", '')
	result = result:gsub("  ", ' ')
	return result
end

local function get_category(value)
	local result = value
	result = result:gsub("'([^']+)'", '')
	result = result:gsub("(%[мова%])", 'мова{}')
	result = result:gsub("(%[мови%])", 'мови')
	result = result:gsub("(%[діалект%])", 'діалект{}')
	result = result:gsub("  ", ' ')
	return result
end

function p.get(frame)
	local code = frame.args['lang']
	local param = frame.args['param']
	local is_lower = (param ~= '' and mw.ustring.lower(param) == param)
	param = get_param(param)
	local result = param
	local data
	if languages[code] then
		data = languages[code]
	else
		data = languages["-"]
	end
	local name_tpl = data["name"]
	local name = get_name(name_tpl)
	if param == 'name' then
		result = nom_case(name)
	elseif param == 'cat' then
		result = nom_case(get_category(name_tpl))
	elseif param == 'cat2' then
		if data['cat2'] then
			result = nom_case(data['cat2'])
		else
			result = ''
		end
	elseif param == 'adj' then
		if data["adj"] then
			adj = data["adj"]
			if adj == '=' then
				adj = name
			end
			result = nom_case(adj)
		else
			result = "(нет значения)"
		end
	elseif param == 'adj-gen' then
		if data["adj"] then
			adj = data["adj"]
			if adj == '=' then
				adj = name
			end
			result = gen_case(adj)
		else
			result = "(нет значения)"
		end
	elseif param == 'from' then
		result = gen_case(name)
	elseif param == 'on' then
		result = pre_case(name)
	elseif param == 'pl' then
		result = plural(name)
	elseif param == 'short' then
		if data["short"] then
			result = data["short"]
		else
			result = "(нет значения)"
		end
	else
		result = "(помилка параметра)"
	end
	if is_lower and param ~= 'cat' then
		result = mw.ustring.lower(result)
	end
	return string.trim(result)
end

local function colorize(value)
	local result = value:gsub("(%{[^}]*%})", '<span style="color: darkblue">%1</span>')
	result = result:gsub("('[^']+')", '<span style="color: green">%1</span>')
	result = result:gsub("(%[мова%])", '<span style="color: maroon">%1</span>')
	result = result:gsub("(%[мови%])", '<span style="color: maroon">%1</span>')
	result = result:gsub("(%[діалект%])", '<span style="color: maroon">%1</span>')
	return result
end

function p.print_table(frame)
	local result = ""
	local codes = {}
	result = result .. '{| class="sortable prettytable" style="text-align: center;" cellpadding="0" cellspacing="0"\n'
	result = result .. '! Код || Код || Назва || Дод. категорія || Прикметник || Скорочення || Інші назви\n'
	
	for code, data in pairs(languages) do
		table.insert(codes, code)
	end
	table.sort(codes)
	for i, code in ipairs(codes) do
		result = result .. '|-'
		if languages[code]["redirect"] then
			result = result .. "style='background-color: #eeeeee; color: gray;'"
		end
		result = result .. '\n'
		result = result .. '| ' .. code .. ' || ' 
		if languages[code]["code"] then
			result = result .. languages[code]["code"]
		end
		result = result .. ' || ' 
		result = result .. colorize(languages[code]["name"])
		result = result .. ' || '
		if languages[code]["cat2"] then
			result = result .. colorize(languages[code]["cat2"])
		end
		result = result .. ' || '
		if languages[code]["adj"] then
			result = result .. colorize(languages[code]["adj"])
		end
		result = result .. ' || '
		if languages[code]["short"] then
			result = result .. languages[code]["short"]
		end
		result = result .. ' || style="text-align: left;" | '
		if languages[code]["other"] then
			result = result .. colorize(languages[code]["other"])
		end
		result = result .. '\n'
	end
	result = result .. '|}'
	return result
end

return p