Модуль:Adapter

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку


Модуль:Adapter (обг. · [ред.] · історія · посилання · документація · підсторінки · тести – результати)


-- Мета модуля - полегшити створення шаблонів-конвертерів, що конвертують з
-- одного набору в інший
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.adaptArguments(args, nameMap)
    local adaptedArgs = {}
    for k, v in pairs(args) do
        if v ~= '' then
            local adaptedName = nameMap[k]
            if adaptedName ~= nil then
                adaptedArgs[adaptedName] = v;
            else
                adaptedArgs[k] = v;
            end            
        end
    end
    return adaptedArgs
end

-- головний метод модуля
function p.adapter(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.adaptArguments(args, nameMap);
    
    -- отримуємо "гарне" форматування зконвертованого шаблону
    local templateText = formatTemplate(name, args, vertical);

    -- обробляємо і повертаємо
    return frame:preprocess(templateText);
   
end

return p