Модуль:Предмет: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 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 | ||
-- | -- Разрешение аргумента | ||
local function resolveArg(input, defaultValue) | local function resolveArg(input, defaultValue) | ||
if input == nil then | if input == nil then return defaultValue end | ||
return input == "" and "" or input | |||
end | end | ||
-- Обёртка для | -- Обёртка для создания вики-ссылки | ||
local function wrapLink(text, target) | local function wrapLink(text, target) | ||
return text == "" and "" or string.format("[[%s|%s]]", target, 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 }) | ||
-- Простые args | |||
local args = {} | |||
for k, v in pairs(argsRaw) do if v ~= "" then args[k] = v end end | |||
-- | -- Параметры | ||
local id | local id = args[1] or "" | ||
local size | local size = args.size or "32px" | ||
local prefix | 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 | local invokeLP = makeInvoker(frame) | ||
local | -- Функции для получения данных по требованию | ||
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 | end | ||
-- | -- Собираем части результата | ||
local | local parts = {} | ||
-- | -- Изображение | ||
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) | ||
or (rawImage ~= "" and formatImage(rawImage, size) or "") | |||
if argsRaw.imageTooltip then | |||
if argsRaw.imageTooltip | |||
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 | local label = rawLabel == nil and getItemName() or resolveArg(rawLabel, getItemName()) | ||
and wrapLink(label, | local rawLink = argsRaw.link | ||
local labelOut = rawLink ~= nil | |||
and wrapLink(label, rawLink == "" and getItemName() or rawLink) | |||
or label | or label | ||
-- | -- Репозиторий (только в режиме) | ||
local | local repoStr = "" | ||
if | if repositoryMode then | ||
-- Вертикальное | repoStr = table.concat({ getItemContained(), getItemSlot(), getItemChem() }, " ") | ||
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, | image, labelOut | ||
) | )) | ||
table.insert(parts, getItemStack()) | |||
table.insert(parts, prefix) | |||
else | else | ||
table.insert(parts, string.format( | |||
"<span style='display:inline-block;'>%s%s</span>", image, repoStr | |||
)) | |||
table.insert(parts, labelOut) | |||
table.insert(parts, getItemStack()) | |||
table.insert(parts, prefix) | |||
end | end | ||
local result = table.concat(parts, " ") | |||
-- Обёртка LinkCard | -- Обёртка LinkCard | ||
if | if wrapperMode then | ||
local pixel = | local pixel = size:match("(%d+)") | ||
local linkParam = | local linkParam = rawLink and (rawLink == "" and getItemName() or rawLink) or "" | ||
local sideStyle = | local sideStyle = vertical and "" or "|SideStyle=1" | ||
local card = 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}}", | ||
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 | ||