--- Модуль для отображения жидкостей в ёмкостях для механизмов из модов в Minecraft Wiki.
local p = {}
--- Создание слота function p.slot(f) --- Получение аргументов local args = f.args or f if f == mw.getCurrentFrame() and args[1] == nil then args = f:getParent().args end
-- Первый аргумент args[1] = mw.text.trim(args[1] or )
--- Псевдонимы оригинальной игры local aliases = mw.loadData('Модуль:Инвентарный слот/Псевдонимы')
--- Проверка и замена всех фреймов на псевдонимы
local frames = {}
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
local frameParts = p.getParts( frame, args["мод"] ) local id = frameParts.name
-- if frameParts.mod then
-- id = frameParts.mod .. ':' .. id -- end
--- Загрузка списка псевдонимов к модам
local modAliases
if frameParts.mod then
if mw.title.new('Модуль:ИнвСпрайт/' .. frameParts.mod).exists then
modAliases = mw.loadData('Модуль:ИнвСпрайт/' .. frameParts.mod)["настройки"]["модпсевдонимы"]
if modAliases and mw.title.new('Модуль:' .. modAliases).exists then
modAliases = mw.loadData('Модуль:' .. modAliases)
end
end
end
local alias = nil
if frameParts.mod then
if modAliases and modAliases[id] then
--- псевдонимы следует прописывать в модуле в формате ['имя'] = '[титл]:имя[доп. текст]', титл и доп.текст необязательно указывать
local title = mw.ustring.match ( modAliases[id], '^%[([^%]]+)%]' )
if title then
local aaa = mw.ustring.match ( modAliases[id], '^%^%+%](.+)$' )
if aaa then
alias = '[' .. title .. ']' .. frameParts.mod .. ':' .. aaa
else
alias = '[' .. title .. ']' .. frameParts.mod .. ':' .. frameParts.name
end
else
alias = frameParts.mod .. ':' .. modAliases[id]
end
end
elseif aliases and aliases[id] then alias = aliases[id] end
if alias then table.insert( frames, p.expandAlias( frameParts, alias ) ) else table.insert( frames, frame ) end end
args[1] = table.concat( frames, ';' )
--- Проверка и замена всех фреймов на псевдонимы (конец)
--- Построение спрайта
-- Параметры local sprite local ids = mw.loadData(Модуль:ИнвСпрайт)["IDы"] local modIds = {} local back_modIds = {} local animated = mw.ustring.find(args[1], ';') local pageName = mw.title.getCurrentTitle().text local imgClass = args["классизобр"] local imgStyle = args["стильизобр"] local numStyle = args["стильцифр"]
local body = mw.html.create('span'):css{['vertical-align'] = args["выравн"]}
if animated then body:addClass('animated') end
if args["класс"] then body:addClass(args["класс"]) end if args["стиль"] then body:cssText(args["стиль"]) end
if (args["умолчание"] or ) ~= then body:css('background-image', 'url(https://static.wikia.nocookie.net/minecraft_ru_gamepedia/images/&format=original)') end
if args["фон"] then
body:cssText(args["фон"])
else
body:cssText('background-color:#8b8b8b;')
end
--- Добавление картинки ёмкости с делениями
local y
y = math.floor(11*args["объём"])
if y<0 then
y=0
end
if y>110 then
y=110
end
body:wikitext('
')
--- <div style="z-index:-10; position:absolute; top:Ошибка выражения: - не хватает операндаpx; left:0px; width:36px; height:114px; overflow:hidden">
local im
im = body:tag('span'):cssText('display: block;z-index:10; position:absolute; top:' .. 112-y .. 'px; left:0px; width:36px; height:' .. y+2 .. 'px; overflow:hidden')
--- Обработка фреймов local first = true for frame in mw.text.gsplit(args[1], '%s*;%s*') do local item if frame ~= or frame == and animated then item = body:tag('span'):addClass('invslot-item') if imgClass then item:addClass(imgClass) end if imgStyle then item:cssText(imgStyle) end end
if frame == then (item or body):tag('br') else local category local parts = p.getParts(frame, args["мод"]) local title = parts.title or mw.text.trim(args["назв"] or ) local mod = parts.mod
local name = parts.name
local num = parts.num local description = parts.text
--- Добавляем к доп тексту название мода
local img, idData, en_name if mod then local modData = modIds[mod] if not modData and mw.title.new('Модуль:ИнвСпрайт/' .. mod).exists then local modDataModule = mw.loadData('Модуль:ИнвСпрайт/' .. mod) local idListOverride = modDataModule['настройки']['списокID'] if idListOverride then modData = mw.loadData('Модуль:' .. idListOverride)['IDы'] else modData = modDataModule['IDы'] end modIds[mod] = modData end if modData and modData[name] then idData = modData[name]
en_name = idData["en"]
else img = name .. ' (' .. mod .. ')' end elseif ids[name] then idData = ids[name] else img = name end
local link = args["ссылка"] or if link == then if mod then link = mod .. '/' .. name else link = mw.ustring.gsub(name, '^Повреждённ[ыао][йяе] ', ) end elseif mw.ustring.lower(link) == 'нет' then link = nil end if link == pageName then link = nil end
local formattedTitle local plainTitle if title == then plainTitle = name elseif mw.ustring.lower(title) ~= 'нет' then plainTitle = mw.ustring.gsub(mw.ustring.gsub(title, '\\\\', '\'), '\\&', '&')
local formatPattern = '&[0-9a-fk-or]' if mw.ustring.match(plainTitle, formatPattern) then formattedTitle = title plainTitle = mw.ustring.gsub(plainTitle, formatPattern, ) end
if plainTitle == then plainTitle = name else plainTitle = mw.ustring.gsub(mw.ustring.gsub(plainTitle, '\', '\\'), '&', '&') end elseif link then if img then formattedTitle = else plainTitle = end end
if mod and mod == 'GregTech' and idData and idData["страница"] and mw.title.new('Модуль:GregTechProc/Материалы/' .. idData["страница"]).exists then local mat_info = mw.loadData('Модуль:GregTechProc/Материалы/' .. idData["страница"]) if mat_info then local formula = mat_info["Формула"] local melt = mat_info["Плавление"] local boil = mat_info["Испарение"] if not description then description = end description = description .. '/&7Формула: &e' .. formula .. '/&6t° плавления: ' .. melt .. 'K/&ct° испарения: ' .. boil .. 'K' end end
item:attr{ ['data-minetip-title'] = formattedTitle, ['data-minetip-text'] = description, ['data-modinfo-text'] = mod,
['data-minetip-lowtitle'] = en_name
}
if img then
-- & is re-escaped because mw.html treats attributes
-- as plain text, but MediaWiki doesn't
local escapedTitle = ( plainTitle or ):gsub( '&', '&' )
item:addClass('invslot-item-image')
:wikitext('', escapedTitle, '')
:css('width', scale * 32 .. 'px')
:css('height', scale * 32 .. 'px')
else
if not sprite then
sprite = require(Модуль:Спрайт).sprite
end
local image
if mod then
image = (args["таблспрайтов"] or mod or "Inv") .. 'CSS.png'
end
if link then
item:wikitext('[[', link, '|')
end
local image, spriteCat; if not mod then image, spriteCat = sprite{ ["масштаб"] = scale, ["данныеID"] = idData, ["назв"] = plainTitle, ["изобр"] = image, ["данные"] = 'ИнвСпрайт' } else image, spriteCat = sprite{ ["масштаб"] = scale, ["данныеID"] = idData, ["назв"] = plainTitle, ["изобр"] = image, ["данные"] = 'ИнвСпрайт/' .. mod } end item:node(image) category = spriteCat end
if num and num > 1 and num < 1000 then if img and link then item:wikitext('') end local number = item :tag('span') :addClass('invslot-stacksize') :attr{title = plainTitle} :wikitext(num) if numStyle then number:cssText(numStyle) end if img and link then item:wikitext('') end end
if idData and link then item:wikitext(']]') end
item:wikitext(category) end
if first then if animated and item then item:addClass('active') end first = false end end
return tostring( body ) end
function p.expandAlias( frameParts, alias ) -- If the frame has no parts, we can just return the alias as-is --[[if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then return alias end--]]
local expandedFrames = {} for aliasFrame in mw.text.gsplit(alias, '%s*;%s*') do local aliasParts = p.getParts(aliasFrame) aliasParts.title = frameParts.title or aliasParts.title or aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft' aliasParts.num = frameParts.num or aliasParts.num or aliasParts.text = frameParts.text or aliasParts.text or
table.insert(expandedFrames, mw.ustring.format( '[%s]%s:%s,%s[%s]', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text )) end
return table.concat(expandedFrames, ';') end
function p.getParts(frame, mod)
Функция получает название предмета в формате "[титл]мод:имя[доп.текст],число"
parts.title = титл, название предмета при наведении
parts.mod = мод
parts.name = имя
parts.text = текст, дополнительный текст при наведении на предмет
parts.num = число
local parts = {} parts.title = mw.ustring.match(frame, '^%[%s*([^%]]+)%s*%]')
local modPattern if mw.ustring.match(frame, '^%[.*%]([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):') then modPattern = '^%[.*%]([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):' else modPattern = '^([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):' end
parts.mod = mw.text.trim(mw.ustring.match(frame, modPattern) or mod or ) ---- Получаем название мода
local vanilla = {v = 1, vanilla = 1, mc = 1, minecraft = 1} if parts.mod == or vanilla[mw.ustring.lower(parts.mod)] then parts.mod = nil else if p.modAliases[parts.mod] then parts.mod = p.modAliases[parts.mod]
end
parts.mod = mw.ustring.gsub(parts.mod,'_',' ')
end
local _, nameStartV = mw.ustring.find( frame, '^%^%*%]' ) local nameStart = ( ({mw.ustring.find( frame, modPattern )})[2] or nameStartV or 0 ) + 1 if nameStart - 1 == #frame then nameStart = 1 end parts.name = mw.text.trim( mw.ustring.sub( frame, nameStart, ( mw.ustring.find( frame, '[,%[]', nameStart ) or 0 ) - 1 ) )
parts.num = math.floor(mw.ustring.match(frame, ',%s*(%d+)') or 0) if parts.num == 0 then parts.num = nil end
parts.text = mw.ustring.match(frame, '%[%s*([^%]]+)%s*%]$')
return parts end
return p