Модуль:от

Материал из Викисловаря
Документация

Назначение

Облегчение добавления информации об этимологии

Описание функций и параметров

  • get — основная функция получения данных, принимает два параметра:
    1. unit — название дата-модуля (например, "delati" для Модуль:от/delati)
    2. word — слово, для которого нужно отобразить этимологию
  • docs — генерирование документации для дата-модуля
  • category — получение имени категории для дата-модуля

Связанные модули

Пример дата-модуля

return {
	chains = {
		{"слово1", "происхождение1"},
		{"слово2", "происхождение2, далее от <слово1>"},
	},
	sources = {
		'<ключ_источника_1>',
		'<ключ_источника_2>',
		'Либо просто полное название источника'
	},
	category = 'ключ_категории'
}

Документация для дата-модуля должна содержать всего одну строчку:

{{от/docs}}<includeonly>[[{{от/категория}}]]</includeonly>

Где используется

На данный момент в шаблонах {{от}}, {{от/docs}} и {{от/категория}}

local p = {}
 
-- Служебная функция.
-- Преобразовает последовательность {{ключ1, значение1}, {ключ2, значение2}, ...} в
-- специальную таблицу {ключ1: значение1, ключ2: значение2, ...}.
function convert_to_dict(list)
	local dict = {}
	for i, item in pairs(list) do
		local key = item[1]
		local value = item[2]
		dict[key] = value
	end
	return dict
end
 
-- Сердце алгоритма.
-- Заменяет в значении (из таблицы) строки вида "<ключ>" на значение соответствующего ключа,
-- метод в каком-то смысле "рекурсивный".
function process(frame, data, word)
	if not data[word] then
		return "''<span style='color: red'>(ошибка: данные об этимологии не найдены, использован неправильный ключ)</span>''"
	end
	local result = data[word]
	local prev_result = ''
	while prev_result ~= result do
		prev_result = result
		for key, value in pairs(data) do
			result = result:gsub("%<" .. key .. "%>", value)
		end
	end
	return frame:preprocess(result)
end
 
-- Основной метод.
-- В качестве параметра получает имя дата-модуля и слово.
function p.get(frame)
	local unit = frame.args['unit']
	local word = frame.args['word']
	local data = mw.loadData("Module:от/" .. unit);
	local chains_data = convert_to_dict(data['chains'])
	return process(frame, chains_data, word)
end


-- Функция для получения имени модуля из имени текущей страницы.
-- При этом убирается "от/" в начале и "/Документация" в конце.
function get_unit(frame)
	local pagename = frame:preprocess('{{PAGENAME}}')
	pagename = pagename:gsub("^от/", "")
	pagename = pagename:gsub("/Документация$", "")
	return pagename
end

-- Дополнительный метод для генерирования документации.
-- На данный момент включается в себя возможные результаты использования.
function p.docs(frame)
	local unit = frame.args['unit']
	if unit == "" then
		unit = get_unit(frame)
	end
	local data = mw.loadData("Module:от/" .. unit);
	local chains_list = data['chains']
	local chains_data = convert_to_dict(chains_list)
	local result = '=== Примеры использования через шаблон ' .. frame:preprocess("{{шаблон|от}}") .. ' ===\n'
	result = result .. '{| class="sortable prettytable" cellpadding="5" cellspacing="5"\n'
	result = result .. '! Слово || Код || Результат \n'
	result = result .. '|-\n'
	for i, chain in pairs(chains_list) do
		local chain_key = chain[1]
		result = result .. "| '''[[" .. chain_key .. "]]''' || "
		result = result .. frame:preprocess("<code><nowiki>{{от|" .. unit .. "|" .. chain_key .. "}}</nowiki></code>") .. " || " 
		result = result .. process(frame, chains_data, chain_key) .. "\n"
		result = result .. '|-\n'
	end
	result = result .. '|}'
	if not data['sources'] then
		return result
	end
	local sources_data = convert_to_dict(mw.loadData("Module:от/источники"))
	result = result .. '\n=== Источники ===\n'
	sources = data['sources']
	for i, source in pairs(sources) do
		for key, value in pairs(sources_data) do
			source = source:gsub("%<" .. key .. "%>", value)
		end
		result = result .. "\n* " .. frame:preprocess(source)
	end
	return result
end

-- Дополнительный метод для получения имени категории дата-модуля.
function p.category(frame)
	local unit = frame.args['unit']
	if unit == "" then
		unit = get_unit(frame)
	end
	local categories = convert_to_dict(mw.loadData("Module:от/категории"))
	local data = mw.loadData("Module:от/" .. unit);
	if not data['category'] then
		return "Категория:Модули:Этимология:Ошибки:Категория не известна|" .. unit
	end
	local category_key = data['category']
	if not categories[category_key] then 
		return "Категория:Модули:Этимология:Ошибки:Неправильная категория|" .. unit
	end
	local category_name = categories[category_key]
	return "Категория:Модули:Этимология:" .. category_name .. " происхождение|" .. unit
end

return p