Модуль:Предмет: различия между версиями

мНет описания правки
мНет описания правки
Строка 2: Строка 2:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs


-- Формирует строку ссылки на изображение
-- Ленивая обёртка для #invoke и preprocess с кэшированием
local function makeInvoker(frame)
    local cache = {}
    return function(module, method, sub, extra, id)
        local key = table.concat({module, method, sub or "", extra or "", id or ""}, "|")
        if not cache[key] then
            local invokeStr = string.format("{{#invoke:%s|%s|%s|%s|%s}}", module, method, sub or "", extra or "", id or "")
            cache[key] = frame:preprocess(invokeStr)
        end
        return cache[key]
    end
end
 
-- Форматирование изображения
local function formatImage(file, size)
local function formatImage(file, size)
     return string.format("[[Файл:%s|%s|link=]]", file, size)
     return string.format("[[Файл:%s|%s|link=]]", file, size)
end
end


-- Возвращает значение аргумента: если nil, то значение по умолчанию; если пустая строка, то пустую строку; иначе само значение
-- Разрешение аргумента
local function resolveArg(input, defaultValue)
local function resolveArg(input, defaultValue)
     if input == nil then
     if input == nil then return defaultValue end
        return defaultValue
     return input == "" and "" or input
     elseif input == "" then
        return ""
    else
        return input
    end
end
end


-- Обёртка для вызова другого модуля через #invoke
-- Обёртка для создания вики-ссылки
local function invoke(frame, module, method, subMethod, extra, id)
    local invocation = string.format("{{#invoke:%s|%s|%s|%s|%s}}", module, method, subMethod, extra, id)
    return frame:preprocess(invocation)
end
 
-- Оборачивает текст в вики-ссылку, если цель задана
local function wrapLink(text, target)
local function wrapLink(text, target)
     if text == "" then
     return text == "" and "" or string.format("[[%s|%s]]", target, text)
        return ""
    else
        return string.format("[[%s|%s]]", target, text)
    end
end
end
--------------------------------------------------------------------------------
-- Основная функция модуля
--------------------------------------------------------------------------------


function p.main(frame)
function p.main(frame)
     -- Получаем аргументы шаблона
     -- Один вызов getArgs
    local args = getArgs(frame)
     local argsRaw = getArgs(frame, { trim = false, removeBlanks = false })
     local argsRaw = getArgs(frame, { trim = false, removeBlanks = false })
    -- Простые args
    local args = {}
    for k, v in pairs(argsRaw) do if v ~= "" then args[k] = v end end


     -- Основные параметры
     -- Параметры
     local id       = args[1] or ""
     local id         = args[1] or ""
     local size     = args["size"] or "32px"
     local size       = args.size or "32px"
     local prefix   = args[2] or ""
     local prefix     = args[2] or ""
     local vertical = argsRaw.vertical
    local repositoryMode = argsRaw.repository ~= nil
    local wrapperMode    = argsRaw.wrapper  ~= nil
     local vertical       = argsRaw.vertical ~= nil


     -- Режим репозитория: дополнительные данные только при необходимости
     -- Ленивая генерация invoke/preprocess
     local repositoryMode = argsRaw.repository ~= nil
     local invokeLP = makeInvoker(frame)
     local repository = prefix
 
     local itemContained, itemSlot, itemChem
     -- Функции для получения данных по требованию
     if repositoryMode then
     local function getItemStack()
        -- Получаем данные о вложенных предметах, слоте и химии
        return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|stack", id)
         itemContained = invoke(frame, "Prototypes/Хранилище/Предмет", "main", "framing", "contained", id)
     end
         itemSlot      = invoke(frame, "Prototypes/Хранилище/Предмет", "main", "framing", "slot", id)
    local function getItemContained()
         -- Для химии оборачиваем в CollapsibleMenu (из-за ошибки в модуле)
         return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|contained", id)
         itemChem      = frame:preprocess(string.format(
    end
            "{{СollapsibleMenu|color=#3e7c82|{{#invoke:Prototypes/Хранилище/Предмет|main|chem|%s}}}}", id
    local function getItemSlot()
        ))
         return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|slot", id)
         repository = table.concat({ itemContained, itemSlot, itemChem }, " ")
    end
    local function getItemChem()
         local chem = invokeLP("Prototypes/Хранилище/Предмет", "main", "chem", id)
         return frame:preprocess(string.format("{{СollapsibleMenu|color=#3e7c82|%s}}", chem))
    end
    local function getItemName()
         return invokeLP("Entity Lookup", "getname", id)
     end
     end


     -- Получаем имя предмета
     -- Собираем части результата
     local itemName = frame:preprocess(string.format("{{#invoke:Entity Lookup|getname|%s}}", id))
     local parts = {}


     -- Обработка ярлыка
     -- Изображение
    local rawLabel = argsRaw.label or argsRaw.l
    local label = rawLabel == nil and itemName or resolveArg(rawLabel, itemName)
 
    -- Обработка изображения
     local rawImage = argsRaw.image or argsRaw.img
     local rawImage = argsRaw.image or argsRaw.img
     local image
     local image = rawImage == nil and formatImage(id..".png", size)
    if rawImage == nil then
         or (rawImage ~= "" and formatImage(rawImage, size) or "")
        image = formatImage(id .. ".png", size)
     if argsRaw.imageTooltip then
    else
         image = (rawImage ~= "") and formatImage(rawImage, size) or ""
    end
 
    -- Переопределение изображения через imageTooltip
     if argsRaw.imageTooltip ~= nil then
         image = frame:preprocess(string.format(
         image = frame:preprocess(string.format(
             "{{#invoke:Entity Lookup|createimagetooltip|Файл:%s.png|%s|Мета=%s,link=}}",
             "{{#invoke:Entity Lookup|createimagetooltip|Файл:%s.png|%s|Мета=%s,link=}}",
Строка 87: Строка 81:
     end
     end


     -- Обработка ссылки
     -- Метка и ссылка
     local rawLink = argsRaw.link
    local rawLabel = argsRaw.label or argsRaw.l
     local labelOutput = (rawLink ~= nil)
    local label = rawLabel == nil and getItemName() or resolveArg(rawLabel, getItemName())
         and wrapLink(label, (rawLink == "" and itemName or rawLink))
     local rawLink = argsRaw.link
     local labelOut = rawLink ~= nil
         and wrapLink(label, rawLink == "" and getItemName() or rawLink)
         or label
         or label


     -- Формирование вывода
     -- Репозиторий (только в режиме)
     local imagerepository, result
     local repoStr = ""
     if vertical ~= nil then
     if repositoryMode then
         -- Вертикальное отображение
         repoStr = table.concat({ getItemContained(), getItemSlot(), getItemChem() }, " ")
         imagerepository = string.format(
    end
 
    -- Вертикальное или горизонтальное
    if vertical then
         table.insert(parts, string.format(
             "<span style='display:inline-flex;flex-direction:column;align-items:center;'>%s<b>%s</b></span>",
             "<span style='display:inline-flex;flex-direction:column;align-items:center;'>%s<b>%s</b></span>",
             image, labelOutput
             image, labelOut
         )
         ))
         result = table.concat({ imagerepository, prefix }, " ")
         table.insert(parts, getItemStack())
        table.insert(parts, prefix)
     else
     else
         -- Горизонтальное отображение
         table.insert(parts, string.format(
        imagerepository = string.format("<span style='display:inline-block;'>%s%s</span>", image, repository)
            "<span style='display:inline-block;'>%s%s</span>", image, repoStr
         result = table.concat({ imagerepository, labelOutput, prefix }, " ")
        ))
        table.insert(parts, labelOut)
         table.insert(parts, getItemStack())
        table.insert(parts, prefix)
     end
     end
    local result = table.concat(parts, " ")


     -- Обёртка LinkCard
     -- Обёртка LinkCard
     if argsRaw.wrapper ~= nil then
     if wrapperMode then
         local pixel = string.match(size, "(%d+)")
         local pixel = size:match("(%d+)")
         local linkParam = (rawLink ~= nil) and ((rawLink == "" and itemName) or rawLink) or ""
         local linkParam = rawLink and (rawLink == "" and getItemName() or rawLink) or ""
         local sideStyle = (vertical ~= nil) and "" or "|SideStyle=1"
         local sideStyle = vertical and "" or "|SideStyle=1"
 
         local card = string.format(
         return frame:preprocess(string.format(
             "{{LinkCard|name=%s %s %s|pin=%s|image-full=%s|pixel=%s|link=%s%s}}",
             "{{LinkCard|name=%s %s %s|pin=%s|image-full=%s|pixel=%s|link=%s%s}}",
             labelOutput, prefix, repository, image, pixel, linkParam, sideStyle
             labelOut, getItemStack(), prefix, repoStr, image, pixel, linkParam, sideStyle
         ))
         )
        return frame:preprocess(card)
     end
     end


    -- Финальный вывод одним preprocess
     return frame:preprocess(string.format("<span>%s</span>", result))
     return frame:preprocess(string.format("<span>%s</span>", result))
end
end


return p
return p