Module:Inventory slot: Difference between revisions
imported>Ttv pedro270707 m (Added item sets ("Any Wool" and "Any Planks")) |
imported>Ttv pedro270707 mNo edit summary |
||
(135 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
p. | function p.formatDescription(description, preferredLineLength) | ||
local lineLength = 0 | |||
local result = "" | |||
for i = 1, #description do | |||
local c = description:sub(i, i) | |||
if c == " " then | |||
if lineLength > preferredLineLength then | |||
lineLength = 0 | |||
result = result .. "\\n§8" | |||
else | |||
result = result .. c | |||
end | |||
else | |||
lineLength = lineLength + 1 | |||
result = result .. c | |||
end | |||
end | |||
return result | |||
end | |||
function p.createSlot( f ) | function p.createSlot( f ) | ||
local args = f | local args = f | ||
local currentFrame = mw.getCurrentFrame() | |||
if f == currentFrame then | |||
args = require( 'Module:ProcessArgs' ).merge( true ) | args = require( 'Module:ProcessArgs' ).merge( true ) | ||
else | else | ||
f = | f = currentFrame | ||
end | end | ||
local aliases = require( "Module:Inventory slot/aliases" ).aliases | |||
local descriptions = require( "Module:Inventory slot/descriptions" ).descriptions | |||
local sprite = require( "Module:Sprite" ).get | local sprite = require( "Module:Sprite" ).get | ||
Line 53: | Line 39: | ||
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 63: | Line 49: | ||
local slotContainer = mw.html.create( "div" ) | local slotContainer = mw.html.create( "div" ) | ||
slotContainer:addClass( "inventory-slot" ) | slotContainer:addClass( "inventory-slot" ) | ||
:addClass( "animated" ) | |||
:cssText( table.concat( slotContainerCss, ";" ) ) | :cssText( table.concat( slotContainerCss, ";" ) ) | ||
Line 69: | Line 56: | ||
"width: 32px", | "width: 32px", | ||
"height: 32px", | "height: 32px", | ||
"position: relative" | "position: relative", | ||
"padding: 2px" | |||
} | } | ||
for i, value in ipairs(p.parseString( args.item )) do | for i, value in ipairs(p.parseString( args.item )) do | ||
local name = value.name | local name = value.name | ||
local item = value.item | local item = value.item | ||
if | local count = value.count | ||
for j, subvalue in ipairs( | if aliases[item] then | ||
local display = i == j == 1 and "display: inline-block" or "display: none" | for j, subvalue in ipairs(aliases[item]) do | ||
local | local display = i == j == 1 and "display: inline-block" or "display: none" -- sets display of the first element to `inline-block` and the rest to `none` | ||
-- Set name, item and description | |||
local subname = nil | |||
local subitem = nil | |||
local subdescription = nil | |||
if type(subvalue) == "string" then | |||
subname = subvalue | |||
subitem = subvalue | |||
subdescription = subvalue | |||
else | |||
subname = subvalue.name or subvalue.item | |||
subitem = subvalue.item | |||
subdescription = subvalue.description or subvalue.item | |||
end | |||
local slot = mw.html.create( "div" ) | local slot = mw.html.create( "div" ) | ||
slot:addClass( "minecraft-item" ) | slot:addClass( "minecraft-item" ) | ||
:cssText( table.concat( slotCss, ";" ) ) | :cssText( table.concat( slotCss, ";" ) ) | ||
:attr( "data-mctitle", (name | :attr( "data-mctitle", (name or subname or subitem) ) | ||
slot:wikitext( sprite( { data = "InvSprite", id = | if descriptions[subdescription] or descriptions[subitem] or descriptions[subname] then | ||
if | slot:attr( "data-mcdesc", p.formatDescription((descriptions[subdescription] or descriptions[subitem] or descriptions[subname]), 16) ) | ||
link = | end | ||
if not subitem:match( '\.gif$' ) and not subitem:match( '\.png$' ) then | |||
slot:wikitext( sprite( { data = "InvSprite", id = subitem } ) ) | |||
end | |||
-- Set link | |||
local link = nil | |||
if args.link and args.link ~= "y" then | |||
if args.link ~= "n" then | |||
link = args.link | |||
end | |||
elseif (subname ~= pageName and subname) or args.link == "y" then | |||
link = require("Module:Inventory slot/links").links[subname] | |||
end | |||
-- Set the item count | |||
if count then | |||
local itemCount = mw.html.create( "span" ) | |||
itemCount:cssText( "position: absolute; right: 0; bottom: -2px; pointer-events: none;" ) | |||
:addClass( "c-0" ) | |||
:addClass( "shadow" ) | |||
:wikitext( count ) | |||
slot:node( itemCount ) | |||
end | end | ||
if | -- Use an image if the item ends in .gif or .png | ||
if subitem:match( '\.gif$' ) or subitem:match( '\.png$' ) then | |||
slot:wikitext( "<span class=\"sprite pixelated\" style=\"width: 32px; height: 32px;\">[[File:" .. subitem .. "|160px|link=" .. (link or "") .. "]]</span>" ) | |||
slotContainer:wikitext( tostring( slot ) ) | |||
else | else | ||
slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) | if link then | ||
slotContainer:wikitext( "<span style='" .. display .. "' class='no-external-icon'>" .. "[https://bta.miraheze.org/wiki/" .. link:gsub(" ", "_") .. " " .. tostring( slot ) .. "]" .. "</span>" ) | |||
else | |||
slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) | |||
end | |||
end | end | ||
end | end | ||
else | else | ||
local display = i == 1 and "display: inline-block" or "display: none" | local display = i == 1 and "display: inline-block" or "display: none" | ||
if link and | if item ~= 'Air' then | ||
slotContainer:wikitext( "<span style='" .. display .. "'>" .. "[ | local slot = mw.html.create( "div" ) | ||
slot:addClass( "minecraft-item" ) | |||
:cssText( table.concat( slotCss, ";" ) ) | |||
:attr( "data-mctitle", (name or item) ) | |||
if descriptions[item] then | |||
slot:attr( "data-mcdesc", p.formatDescription(descriptions[item], 16) ) | |||
end | |||
slot:wikitext( sprite( { data = "InvSprite", id = item } ) ) | |||
local link = nil | |||
if args.link and args.link ~= "y" then | |||
if args.link ~= "n" then | |||
link = args.link | |||
end | |||
elseif (require("Module:Inventory slot/links").links[item] ~= pageName and item) or args.link == "y" then | |||
link = require("Module:Inventory slot/links").links[item] | |||
end | |||
if count then | |||
local itemCount = mw.html.create( "span" ) | |||
itemCount:cssText( "position: absolute; right: 0; bottom: -2px; pointer-events: none;" ) | |||
:addClass( "c-0" ) | |||
:addClass( "shadow" ) | |||
:wikitext( count ) | |||
slot:node( itemCount ) | |||
end | |||
if link or (args.link and args.link ~= "y" and args.link ~= "n") then | |||
slotContainer:wikitext( "<span style='" .. display .. "' class='no-external-icon'>" .. "[https://bta.miraheze.org/wiki/" .. link:gsub(" ", "_") .. " " .. tostring( slot ) .. "]" .. "</span>" ) | |||
else | |||
slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) | |||
end | |||
else | else | ||
slotContainer:wikitext( "<span style='" .. display .. "'> | slotContainer:wikitext( "<span style='" .. display .. "'><!-- Air --></span>") | ||
end | end | ||
end | end | ||
Line 116: | Line 171: | ||
end | end | ||
p.value = { | |||
["Steel Ingot"] = "Hello", | |||
["Steel Ingot5"] = "Hello", | |||
["Steel Ingot10"] = "Hello" | |||
} | |||
function p.test(value) | |||
if value == 1 then | |||
for i = 1, 1000 do | |||
if require("Module:Inventory slot/descriptions").descriptions["Steel Ingot"] then | |||
mw.log("Exists") | |||
else | |||
mw.log("Does not exist") | |||
end | |||
end | |||
else | |||
for i = 1, 101 do | |||
mw.log(mw.title.new("Steel Ingot" .. i).exists) | |||
end | |||
end | |||
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 | end | ||
return p | return p |
Latest revision as of 22:13, 2 April 2023
This module creates an inventory slot. {{Inventory slot}}
should be preferred, rather than directly invoking this module on the article.
local p = {} function p.formatDescription(description, preferredLineLength) local lineLength = 0 local result = "" for i = 1, #description do local c = description:sub(i, i) if c == " " then if lineLength > preferredLineLength then lineLength = 0 result = result .. "\\n§8" else result = result .. c end else lineLength = lineLength + 1 result = result .. c end end return result end function p.createSlot( f ) local args = f local currentFrame = mw.getCurrentFrame() if f == currentFrame then args = require( 'Module:ProcessArgs' ).merge( true ) else f = currentFrame end local aliases = require( "Module:Inventory slot/aliases" ).aliases local descriptions = require( "Module:Inventory slot/descriptions" ).descriptions 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" ) :addClass( "animated" ) :cssText( table.concat( slotContainerCss, ";" ) ) local slotCss = { "display: inline-block", "width: 32px", "height: 32px", "position: relative", "padding: 2px" } for i, value in ipairs(p.parseString( args.item )) do local name = value.name local item = value.item local count = value.count if aliases[item] then for j, subvalue in ipairs(aliases[item]) do local display = i == j == 1 and "display: inline-block" or "display: none" -- sets display of the first element to `inline-block` and the rest to `none` -- Set name, item and description local subname = nil local subitem = nil local subdescription = nil if type(subvalue) == "string" then subname = subvalue subitem = subvalue subdescription = subvalue else subname = subvalue.name or subvalue.item subitem = subvalue.item subdescription = subvalue.description or subvalue.item end local slot = mw.html.create( "div" ) slot:addClass( "minecraft-item" ) :cssText( table.concat( slotCss, ";" ) ) :attr( "data-mctitle", (name or subname or subitem) ) if descriptions[subdescription] or descriptions[subitem] or descriptions[subname] then slot:attr( "data-mcdesc", p.formatDescription((descriptions[subdescription] or descriptions[subitem] or descriptions[subname]), 16) ) end if not subitem:match( '\.gif$' ) and not subitem:match( '\.png$' ) then slot:wikitext( sprite( { data = "InvSprite", id = subitem } ) ) end -- Set link local link = nil if args.link and args.link ~= "y" then if args.link ~= "n" then link = args.link end elseif (subname ~= pageName and subname) or args.link == "y" then link = require("Module:Inventory slot/links").links[subname] end -- Set the item count if count then local itemCount = mw.html.create( "span" ) itemCount:cssText( "position: absolute; right: 0; bottom: -2px; pointer-events: none;" ) :addClass( "c-0" ) :addClass( "shadow" ) :wikitext( count ) slot:node( itemCount ) end -- Use an image if the item ends in .gif or .png if subitem:match( '\.gif$' ) or subitem:match( '\.png$' ) then slot:wikitext( "<span class=\"sprite pixelated\" style=\"width: 32px; height: 32px;\">[[File:" .. subitem .. "|160px|link=" .. (link or "") .. "]]</span>" ) slotContainer:wikitext( tostring( slot ) ) else if link then slotContainer:wikitext( "<span style='" .. display .. "' class='no-external-icon'>" .. "[https://bta.miraheze.org/wiki/" .. link:gsub(" ", "_") .. " " .. tostring( slot ) .. "]" .. "</span>" ) else slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) end end end else local display = i == 1 and "display: inline-block" or "display: none" if item ~= 'Air' then local slot = mw.html.create( "div" ) slot:addClass( "minecraft-item" ) :cssText( table.concat( slotCss, ";" ) ) :attr( "data-mctitle", (name or item) ) if descriptions[item] then slot:attr( "data-mcdesc", p.formatDescription(descriptions[item], 16) ) end slot:wikitext( sprite( { data = "InvSprite", id = item } ) ) local link = nil if args.link and args.link ~= "y" then if args.link ~= "n" then link = args.link end elseif (require("Module:Inventory slot/links").links[item] ~= pageName and item) or args.link == "y" then link = require("Module:Inventory slot/links").links[item] end if count then local itemCount = mw.html.create( "span" ) itemCount:cssText( "position: absolute; right: 0; bottom: -2px; pointer-events: none;" ) :addClass( "c-0" ) :addClass( "shadow" ) :wikitext( count ) slot:node( itemCount ) end if link or (args.link and args.link ~= "y" and args.link ~= "n") then slotContainer:wikitext( "<span style='" .. display .. "' class='no-external-icon'>" .. "[https://bta.miraheze.org/wiki/" .. link:gsub(" ", "_") .. " " .. tostring( slot ) .. "]" .. "</span>" ) else slotContainer:wikitext( "<span style='" .. display .. "'>" .. tostring( slot ) .. "</span>" ) end else slotContainer:wikitext( "<span style='" .. display .. "'><!-- Air --></span>") end end end return slotContainer end p.value = { ["Steel Ingot"] = "Hello", ["Steel Ingot5"] = "Hello", ["Steel Ingot10"] = "Hello" } function p.test(value) if value == 1 then for i = 1, 1000 do if require("Module:Inventory slot/descriptions").descriptions["Steel Ingot"] then mw.log("Exists") else mw.log("Does not exist") end end else for i = 1, 101 do mw.log(mw.title.new("Steel Ingot" .. i).exists) end end 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