Module:Inventory slot: Difference between revisions
imported>Ttv pedro270707 m (Added count to non-sets too) |
imported>Ttv pedro270707 mNo edit summary |
||
Line 53: | Line 53: | ||
local width = args.width or 32 | local width = args.width or 32 | ||
local height = args.height or 32 | local height = args.height or 32 | ||
local item = args.item | local item = args.item or "" | ||
local pageName = mw.title.getCurrentTitle().text | local pageName = mw.title.getCurrentTitle().text | ||
Line 138: | Line 138: | ||
function p.parseString(input) | function p.parseString(input) | ||
if input then | |||
local strings = {} | |||
for str in input:gmatch("[^;]+") do | |||
table.insert(strings, str:match("^%s*(.-)%s*$")) | |||
end | |||
local result = {} | |||
for _, str in ipairs(strings) do | |||
local name, item, count = str:match("^%[(.-)%](.-),?(%d*)$") | |||
if name then | |||
table.insert(result, { name = name:gsub("^%s*(.-)%s*$", "%1"), item = item:gsub("^%s*(.-)%s*$", "%1"), count = tonumber(count) }) | |||
else | |||
item, count = str:match("(.-),?(%d*)$") | |||
table.insert(result, { name = nil, item = item:gsub("^%s*(.-)%s*$", "%1"), count = tonumber(count) }) | |||
end | |||
end | |||
return result | |||
else | |||
return {} | |||
end | |||
end | end | ||
return p | return p |
Revision as of 03:22, 11 March 2023
This module creates an inventory slot. {{Inventory slot}}
should be preferred, rather than directly invoking this module on the article.
local p = {} p.itemSets = { ["Any Wool"] = { "White Wool", "Orange Wool", "Magenta Wool", "Light Blue Wool", "Yellow Wool", "Lime Wool", "Pink Wool", "Gray Wool", "Light Gray Wool", "Cyan Wool", "Purple Wool", "Blue Wool", "Brown Wool", "Green Wool", "Red Wool", "Black Wool" }, ["Any Planks"] = { "Wooden Planks", "White Wooden Planks", "Orange Wooden Planks", "Magenta Wooden Planks", "Light Blue Wooden Planks", "Yellow Wooden Planks", "Lime Wooden Planks", "Pink Wooden Planks", "Gray Wooden Planks", "Light Gray Wooden Planks", "Cyan Wooden Planks", "Purple Wooden Planks", "Blue Wooden Planks", "Brown Wooden Planks", "Green Wooden Planks", "Red Wooden Planks", "Black Wooden Planks" } } function p.createSlot( f ) local args = f if f == mw.getCurrentFrame() then args = require( 'Module:ProcessArgs' ).merge( true ) else f = mw.getCurrentFrame() end local sprite = require( "Module:Sprite" ).get local ids = mw.loadData( "Module:InvSprite" ).ids local width = args.width or 32 local height = args.height or 32 local item = args.item or "" local pageName = mw.title.getCurrentTitle().text local slotContainerCss = { "width: " .. width .. "px", "height: " .. height .. "px", "position: relative" } local slotContainer = mw.html.create( "div" ) slotContainer:addClass( "inventory-slot" ) :cssText( table.concat( slotContainerCss, ";" ) ) local slotCss = { "display: inline-block", "width: 32px", "height: 32px", "position: relative" } for i, value in ipairs(p.parseString( args.item )) do local name = value.name local item = value.item local count = value.count if p.itemSets[item] then for j, subvalue in ipairs(p.itemSets[item]) do local display = i == j == 1 and "display: inline-block" or "display: none" local link = nil local slot = mw.html.create( "div" ) slot:addClass( "minecraft-item" ) :cssText( table.concat( slotCss, ";" ) ) :attr( "data-mctitle", (name or subvalue) ) slot:wikitext( sprite( { data = "InvSprite", id = subvalue } ) ) if item ~= pageName and subvalue then link = subvalue end if count then local itemCount = mw.html.create( "span" ) itemCount:cssText( "position: absolute; right: -2px; bottom: -5px; pointer-events: none;" ) :addClass( "c-f" ) :addClass( "shadow" ) :wikitext( count ) slot:node( itemCount ) end if link and mw.title.new( link ).exists then slotContainer:wikitext( "<span style='" .. display .. "'>" .. "[[" .. link .. "|" .. tostring( slot ) .. "]]" .. "</span>" ) else slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) end end else local display = i == 1 and "display: inline-block" or "display: none" local link = nil local slot = mw.html.create( "div" ) slot:addClass( "minecraft-item" ) :cssText( table.concat( slotCss, ";" ) ) :attr( "data-mctitle", (name or item) ) slot:wikitext( sprite( { data = "InvSprite", id = item } ) ) if item ~= pageName and item then link = item end if count then local itemCount = mw.html.create( "span" ) itemCount:cssText( "position: absolute; right: -2px; bottom: -5px; pointer-events: none;" ) :addClass( "c-f" ) :addClass( "shadow" ) :wikitext( count ) slot:node( itemCount ) end if link and mw.title.new( link ).exists then slotContainer:wikitext( "<span style='" .. display .. "'>" .. "[[" .. link .. "|" .. tostring( slot ) .. "]]" .. "</span>" ) else slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) end end end return slotContainer end function p.parseString(input) if input then local strings = {} for str in input:gmatch("[^;]+") do table.insert(strings, str:match("^%s*(.-)%s*$")) end local result = {} for _, str in ipairs(strings) do local name, item, count = str:match("^%[(.-)%](.-),?(%d*)$") if name then table.insert(result, { name = name:gsub("^%s*(.-)%s*$", "%1"), item = item:gsub("^%s*(.-)%s*$", "%1"), count = tonumber(count) }) else item, count = str:match("(.-),?(%d*)$") table.insert(result, { name = nil, item = item:gsub("^%s*(.-)%s*$", "%1"), count = tonumber(count) }) end end return result else return {} end end return p