Модуль:Предмет

Материал из Space Station 14 Вики

Для документации этого модуля может быть создана страница Модуль:Предмет/doc

local p = {}
local getArgs = require('Module:Arguments').getArgs

-- Функция-формировщик для возвращения строки #invoke
local function invoke(module, method, sub, extra, id)
    return string.format("{{#invoke:%s|%s|%s|%s|%s}}",
        module, method, sub or "", extra or "", id or "")
end

-- Форматирование изображения
local function formatImage(file, size)
    return string.format("[[Файл:%s|%s|link=]]", file, size)
end

-- Обёртка для ссылки
local function wrapLink(text, target)
    if text == "" then return "" end
    return string.format("[[%s|%s]]", target, text)
end

function p.main(frame)
    local argsRaw = getArgs(frame, { trim = false, removeBlanks = false })
    local args = {}
    for k, v in pairs(argsRaw) do
        if v ~= "" then args[k] = v end
    end

    local id     = args[1] or ""
    local size   = args.size or "32px"
    local prefix = args[2] or ""
    local repoM  = argsRaw.repository ~= nil
    local wrapM  = argsRaw.wrapper    ~= nil
    local vert   = argsRaw.vertical   ~= nil

    -- Имя и метка
    local rawLabel = argsRaw.label or argsRaw.l
    local nameStr = invoke("Entity Lookup", "getname", id)
    local label = rawLabel == nil and nameStr or (rawLabel == "" and "" or rawLabel)
    local rawLink  = argsRaw.link
    local labelOut = rawLink ~= nil
        and wrapLink(label, rawLink == "" and nameStr or rawLink)
        or label

    -- Изображение
    local rawImg = argsRaw.image or argsRaw.img
    local img = ""
    if rawImg == nil then
        img = formatImage(id..".png", size)
    elseif rawImg ~= "" then
        img = formatImage(rawImg, size)
    end
    if argsRaw.imageTooltip then
        img = string.format(
            "{{#invoke:Entity Lookup|createimagetooltip|Файл:%s.png|%s|Мета=%s,link=}}",
            id, id, size
        )
    end

    -- Репозиторий
    local repoStr = ""
    if repoM then
        repoStr = table.concat({
            invoke("Prototypes/Хранилище/Предмет", "main", "framing|contained", id),
            invoke("Prototypes/Хранилище/Предмет", "main", "framing|slot", id),
            invoke("Prototypes/Хранилище/Предмет", "main", "framing|chem", id),
        }, " ")
    end

    -- Основная сборка
    local parts = {}

    if vert then
        table.insert(parts,
            string.format(
                "<span style='display:inline-flex;flex-direction:column;align-items:center;'>%s<b>%s</b></span>",
                img, labelOut
            )
        )
        table.insert(parts, invoke("Prototypes/Хранилище/Предмет", "main", "framing|stack", id))
        table.insert(parts, prefix)
    else
        table.insert(parts,
            string.format("<span style='display:inline-block;'>%s%s</span>", img, repoStr)
        )
        table.insert(parts, labelOut)
        table.insert(parts, invoke("Prototypes/Хранилище/Предмет", "main", "framing|stack", id))
        table.insert(parts, prefix)
    end

    -- Обёртка LinkCard
    if wrapM then
        local pixel = size:match("(%d+)")
        local linkParam = rawLink and (rawLink == "" and nameStr or rawLink) or ""
        local side = vert and "" or "|SideStyle=1"
        local card = string.format(
            "{{LinkCard|name=%s %s %s|pin=%s|image-full=%s|pixel=%s|link=%s%s}}",
            labelOut,
            invoke("Prototypes/Хранилище/Предмет", "main", "framing|stack", id),
            prefix,
            repoStr,
            img,
            pixel,
            linkParam,
            side
        )
        return frame:preprocess(card)
    end

    -- Финальный вывод
    return frame:preprocess("<span>" .. table.concat(parts, " ") .. "</span>")
end

return p