Module:Infobox
From Minetest
Documentation for this module may be created at Module:Infobox/doc
local p = {}
local TableBuilder = require("Module:TableBuilder")
local getLanguageCode = require("Module:Languages").getLanguageCode
local animateImages = require("Module:Animated")._images
local makeInvokeFunc = require("Module:Arguments").makeInvokeFunc
local dataPrefix = "Module:Infobox/"
-- Get data (IDs and names) for infobox row headers.
--
-- @param type Infobox type (e.g. block)
-- @param langCode Language code, defaults to current language
-- @param frame Current frame object
local function getRowHeadersData(type, langCode, frame)
langCode = langCode or getLanguageCode()
frame = frame or mw.getCurrentFrame()
local title = dataPrefix .. langCode
if frame:preprocess("{{#ifexist:" .. title .. "|true}}") ~= "" then
local data = mw.loadData(title)
return data and data[type] or nil
end
return nil
end
-- Create an infobox.
--
-- @param args Infobox arguments
-- @param type Infobox type (e.g. block)
local function infobox(args, type)
local rowHeadersData = getRowHeadersData(type) or getRowHeadersData(type, "en")
local name = args.name
local width = args.width or "200px"
local description = args.description
local image = args.image or "Blank.png"
local imagesize = args.imagesize
local imageText
if string.match(image, ",") then
imageText = animateImages({image, imagesize})
else
if imagesize then
imageText = "[[File:" .. image .. "|" .. imagesize .. "]]"
else
imageText = "[[File:" .. image .. "]]"
end
end
local infobox = TableBuilder.create()
infobox
:addClass("wikitable")
:css("float", "right")
:css("text-align", "left")
:css("margin", "0 0 0.5em 1em")
:css("padding", "5px")
:css("font-size", "90%")
:css("position", "relative")
:css("clear", "right")
:css("overflow", "auto")
:css("z-index", "1")
:attr("width", width)
:addRow()
:addHeader()
:attr("colspan", 2)
:css("font-size", "110%")
:css("text-align", "center")
:wikitext(name)
:done()
:done()
:addRow()
:addHeader()
:attr("colspan", 2)
:tag("div")
:addClass("center")
:wikitext(imageText)
:done()
:done()
:done()
:addRow()
:addHeader()
:attr("colspan", 2)
:attr("align", "center")
:wikitext(description)
for _, rowHeaderData in ipairs(rowHeadersData) do
local rowData = args[rowHeaderData.id]
if rowData and rowData ~= "" then
infobox
:addRow()
:addData()
:wikitext("'''" .. rowHeaderData.name .. "'''")
:done()
:addData()
:wikitext(rowData)
end
end
return infobox
end
function p._block(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "block"))
end
function p._item(args)
args.imagesize = args.imagesize or "160px"
return tostring(infobox(args, "item"))
end
function p._foodItem(args)
args.imagesize = args.imagesize or "160px"
return tostring(infobox(args, "foodItem"))
end
function p._mob(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "mob"))
end
function p._object(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "object"))
end
function p._game(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "game"))
end
function p._mod(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "mod"))
end
function p._server(args)
args.imagesize = args.imagesize or "150px"
return tostring(infobox(args, "server"))
end
p.block = makeInvokeFunc(p._block, {inherited = true})
p.item = makeInvokeFunc(p._item, {inherited = true})
p.foodItem = makeInvokeFunc(p._foodItem, {inherited = true})
p.mob = makeInvokeFunc(p._mob, {inherited = true})
p.object = makeInvokeFunc(p._object, {inherited = true})
p.game = makeInvokeFunc(p._game, {inherited = true})
p.mod = makeInvokeFunc(p._mod, {inherited = true})
p.server = makeInvokeFunc(p._server, {inherited = true})
return p