Модуль:Пісочниця/DixonD
Перейти до навігації
Перейти до пошуку
Документація модуля[створити]
Зараз цей модуль не має відповідної документації. Якщо вам відомі призначення та засади використання цього модуля, будь ласка, напишіть хоча б коротеньку документацію. |
Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля. Підсторінки цієї сторінки. |
-- Мета модуля - полегшити створення шаблонів-конвертерів, що конвертують з
-- одного набору в інший
local p = {}
---
--- Створюємо включення шаблону, що легко читається людиною.
---
function formatTemplate(name, args, vertical)
local delimiter = vertical and '\n' or ''
local ret = {}
ret[#ret+1] = '{{'
ret[#ret+1] = name
local i = 1;
while true do
local name = tostring(i)
local value = args[name]
if value == nil then break end
args[name] = nil
ret[#ret+1] = delimiter
ret[#ret+1] = '| '
ret[#ret+1] = value
i = i + 1
end
for name, value in pairs(args) do
ret[#ret+1] = delimiter
ret[#ret+1] = '| '
ret[#ret+1] = name
ret[#ret+1] = ' = '
ret[#ret+1] = value
end
ret[#ret+1] = delimiter
ret[#ret+1] = '}}'
return table.concat(ret)
end
-- Міняємо назви параметрів згідно таблиці
function p.translateArgs(args, nameMap)
local translatedArgs = {}
for k, v in pairs(args) do
if v ~= '' then
local translatedName = nameMap[k]
if translatedName ~= nil then
translatedArgs[translatedName] = v;
else
translatedArgs[k] = v;
end
end
end
return translatedArgs
end
-- головний метод модуля
function p.invoke(frame)
-- таблиця конвертації
local nameMap = frame.args;
-- назва шаблону
local name = nameMap[1];
nameMap[1] = nil;
-- чи форматуємо параметри вертикально
local vertical = nameMap.vertical ~= nil and nameMap.vertical ~= 'no';
nameMap.vertical = nil;
-- отримуємо аргументи шаблону, що потрібно конвертувати
local args = frame:getParent().args;
-- конвертуємо параметри
args = p.translateArgs(args, nameMap);
-- отримуємо "гарне" форматування зконвертованого шаблону
local templateText = formatTemplate(name, args, vertical);
-- обробляємо і повертаємо
return frame:preprocess(templateText);
end
return p