Модуль:от
Назначение
Облегчение добавления информации об этимологии
Описание функций и параметров
get
— основная функция получения данных, принимает два параметра:unit
— название дата-модуля (например, "delati
" для Модуль:от/delati)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