|
|
| (не показаны 4 промежуточные версии этого же участника) |
| Строка 2: |
Строка 2: |
| local getArgs = require('Module:Arguments').getArgs | | local getArgs = require('Module:Arguments').getArgs |
|
| |
|
| -- Ленивая обёртка для #invoke и preprocess с кэшированием | | -- Форматирует файл изображения |
| local function makeInvoker(frame) | | local function formatImage(file, size, link) |
| local cache = {}
| | return string.format('[[Файл:%s|%s|link=%s]]', file, size, link) |
| 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 | | end |
|
| |
|
| -- Форматирование изображения | | -- Оборачивает текст в ссылку |
| local function formatImage(file, size)
| |
| return string.format("[[Файл:%s|%s|link=]]", file, size)
| |
| end
| |
| | |
| -- Разрешение аргумента
| |
| local function resolveArg(input, defaultValue)
| |
| if input == nil then return defaultValue end
| |
| return input == "" and "" or input
| |
| end
| |
| | |
| -- Обёртка для создания вики-ссылки
| |
| local function wrapLink(text, target) | | local function wrapLink(text, target) |
| return text == "" and "" or string.format("[[%s|%s]]", target, text)
| | return (text ~= '' and target and string.format('[[%s|%s]]', target, text) or text) |
| end | | end |
|
| |
|
| function p.main(frame) | | function p.main(frame) |
| -- Один вызов getArgs
| | local argsRaw = getArgs(frame, { trim = false, removeBlanks = false }) |
| local argsRaw = getArgs(frame, { trim = false, removeBlanks = false })
| | local args = {} |
| -- Простые args
| | for k, v in pairs(argsRaw) do |
| local args = {}
| | if v ~= '' then args[k] = v end |
| for k, v in pairs(argsRaw) do if v ~= "" then args[k] = v end end
| | end |
| | |
| -- Параметры
| |
| local id = args[1] or ""
| |
| local size = args.size or "32px"
| |
| local prefix = args[2] or ""
| |
| local repositoryMode = argsRaw.repository ~= nil
| |
| local wrapperMode = argsRaw.wrapper ~= nil
| |
| local vertical = argsRaw.vertical ~= nil
| |
| | |
| -- Ленивая генерация invoke/preprocess
| |
| local invokeLP = makeInvoker(frame)
| |
| | |
| -- Функции для получения данных по требованию
| |
| local function getItemStack()
| |
| return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|stack", id)
| |
| end
| |
| local function getItemContained()
| |
| return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|contained", id)
| |
| end
| |
| local function getItemSlot()
| |
| return invokeLP("Prototypes/Хранилище/Предмет", "main", "framing|slot", id)
| |
| 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
| |
|
| |
|
| -- Собираем части результата
| | local id = args[1] or '' |
| local parts = {}
| | local size = args.size or '32px' |
| | local prefix = args[2] or '' |
| | local isRepo = argsRaw.repository ~= nil |
| | local isWrap = argsRaw.wrapper ~= nil |
| | local isVert = argsRaw.vertical ~= nil |
|
| |
|
| -- Изображение
| | -- Получение имени |
| local rawImage = argsRaw.image or argsRaw.img
| | local nameStr = frame:preprocess( |
| local image = rawImage == nil and formatImage(id..".png", size)
| | string.format('{{#invoke:Entity Lookup|getname|%s}}', id) |
| or (rawImage ~= "" and formatImage(rawImage, size) or "")
| | ) |
| if argsRaw.imageTooltip then
| |
| image = frame:preprocess(string.format(
| |
| "{{#invoke:Entity Lookup|createimagetooltip|Файл:%s.png|%s|Мета=%s,link=}}",
| |
| id, id, size
| |
| ))
| |
| end
| |
|
| |
|
| -- Метка и ссылка
| | -- Лейбл и ссылка |
| local rawLabel = argsRaw.label or argsRaw.l
| | local labelRaw = argsRaw.label or argsRaw.l |
| local label = rawLabel == nil and getItemName() or resolveArg(rawLabel, getItemName())
| | local label = (labelRaw == nil and nameStr) or (labelRaw == '' and '' or labelRaw) |
| local rawLink = argsRaw.link
| | local linkRaw = argsRaw.link |
| local labelOut = rawLink ~= nil
| | local linkTgt = linkRaw == nil and '' or (linkRaw == '' and nameStr or linkRaw) |
| and wrapLink(label, rawLink == "" and getItemName() or rawLink)
| | local labelOut = (linkRaw ~= nil) and wrapLink(label, linkTgt) or label |
| or label
| |
|
| |
|
| -- Репозиторий (только в режиме)
| | -- Изображение |
| local repoStr = ""
| | local imgFile = argsRaw.image or argsRaw.img or (id .. '.png') |
| if repositoryMode then
| | local img = imgFile ~= '' and formatImage(imgFile, size, linkTgt) or '' |
| repoStr = table.concat({ getItemContained(), getItemSlot(), getItemChem() }, " ")
| | if argsRaw.imageTooltip then |
| end
| | img = frame:preprocess( |
| | string.format( |
| | '{{#invoke:Entity Lookup|createimagetooltip|Файл:%s.png|%s|Мета=%s,link=}}', |
| | id, id, size |
| | ) |
| | ) |
| | end |
|
| |
|
| -- Вертикальное или горизонтальное
| | -- Репозиторий |
| if vertical then
| | local repoStr = '' |
| table.insert(parts, string.format(
| | if isRepo then |
| "<span style='display:inline-flex;flex-direction:column;align-items:center;'>%s<b>%s</b></span>",
| | local parts = {} |
| image, labelOut
| | for _, slot in ipairs({ 'contained', 'slot', 'chem' }) do |
| ))
| | table.insert(parts, |
| table.insert(parts, getItemStack())
| | frame:preprocess( |
| table.insert(parts, prefix)
| | string.format( |
| else
| | '{{#invoke:Prototypes/Хранилище/Предмет|main|framing|%s|%s}}', |
| table.insert(parts, string.format(
| | slot, id |
| "<span style='display:inline-block;'>%s%s</span>", image, repoStr
| | ) |
| ))
| | ) |
| table.insert(parts, labelOut)
| | ) |
| table.insert(parts, getItemStack())
| | end |
| table.insert(parts, prefix)
| | repoStr = table.concat(parts, ' ') |
| end
| | end |
|
| |
|
| local result = table.concat(parts, " ")
| | -- Основная сборка |
| | local parts = {} |
| | if isVert then |
| | table.insert(parts, |
| | string.format( |
| | "<span style='display:inline-flex;flex-direction:column;align-items:center;'>%s<b>%s</b></span>", |
| | img, labelOut |
| | ) |
| | ) |
| | else |
| | table.insert(parts, |
| | string.format( |
| | "<span style='display:inline-block;'>%s%s</span>", img, repoStr |
| | ) |
| | ) |
| | table.insert(parts, labelOut) |
| | end |
| | -- Стек предметов |
| | table.insert(parts, |
| | frame:preprocess( |
| | string.format( |
| | '{{#invoke:Prototypes/Хранилище/Предмет|main|framing|stack|%s}}', id |
| | ) |
| | ) |
| | ) |
| | table.insert(parts, prefix) |
|
| |
|
| -- Обёртка LinkCard
| | -- Обёртка LinkCard |
| if wrapperMode then
| | if isWrap then |
| local pixel = size:match("(%d+)")
| | local side = isVert and '' or '|горизонт_стиль=1' |
| local linkParam = rawLink and (rawLink == "" and getItemName() or rawLink) or ""
| | local card = string.format( |
| local sideStyle = vertical and "" or "|SideStyle=1"
| | '{{LinkCard|название=%s %s %s|пин=%s|изображение=%s|ссылка=%s%s}}', |
| local card = string.format(
| | labelOut, |
| "{{LinkCard|name=%s %s %s|pin=%s|image-full=%s|pixel=%s|link=%s%s}}",
| | frame:preprocess(string.format( |
| labelOut, getItemStack(), prefix, repoStr, image, pixel, linkParam, sideStyle
| | '{{#invoke:Prototypes/Хранилище/Предмет|main|framing|stack|%s}}', id |
| )
| | )), |
| return frame:preprocess(card)
| | prefix, |
| end
| | repoStr, |
| | img, |
| | linkTgt, |
| | side |
| | ) |
| | return frame:preprocess(card) |
| | end |
|
| |
|
| -- Финальный вывод одним preprocess
| | -- Финальный вывод |
| return frame:preprocess(string.format("<span>%s</span>", result))
| | return frame:preprocess('<span>' .. table.concat(parts, ' ') .. '</span>') |
| end | | end |
|
| |
|
| return p | | return p |