Difference between revisions of "Module:Infobox"

From Minetest Wiki
Jump to navigation Jump to search
m (Added mob, game, and mod)
(FnControlOption changed the content model of the page Module:Infobox from "plain text" to "Scribunto")
Tag: content model change
 
(19 intermediate revisions by 4 users not shown)
Line 2: Line 2:
  
 
local TableBuilder = require("Module:TableBuilder")
 
local TableBuilder = require("Module:TableBuilder")
 +
local getLanguageCode = require("Module:Languages").getLanguageCode
 
local animateImages = require("Module:Animated")._images
 
local animateImages = require("Module:Animated")._images
local getArgs = require('Module:Arguments').getArgs
+
local makeInvokeFunc = require("Module:Arguments").makeInvokeFunc
 +
local dataPrefix = "Module:Infobox/"
  
function p.block(frame)
+
-- Get data (IDs and names) for infobox row headers.
    local args = getArgs(frame, {inherited = true})
+
--
    return p._block(args)
+
-- @param type Infobox type (e.g. block)
end
+
-- @param langCode Language code, defaults to current language
 
+
-- @param frame Current frame object
function p.item(frame)
+
local function getRowHeadersData(type, langCode, frame)
     local args = getArgs(frame, {inherited = true})
+
     langCode = langCode or getLanguageCode()
     return p._item(args)
+
     frame = frame or mw.getCurrentFrame()
end
+
     local title = dataPrefix .. langCode
 
+
     if frame:preprocess("{{#ifexist:" .. title .. "|true}}") ~= "" then
function p.foodItem(frame)
+
        local data = mw.loadData(title)
    local args = getArgs(frame, {inherited = true})
+
        return data and data[type] or nil
    return p._foodItem(args)
+
     end
end
+
     return nil
 
 
function p.mob(frame)
 
     local args = getArgs(frame, {inherited = true})
 
    return p._mob(args)
 
end
 
 
 
function p.game(frame)
 
     local args = getArgs(frame, {inherited = true})
 
    return p._game(args)
 
end
 
 
 
function p.mod(frame)
 
     local args = getArgs(frame, {inherited = true})
 
     return p._mod(args)
 
 
end
 
end
  
local function infobox(args)
+
-- 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 name = args.name
 
     local width = args.width or "200px"
 
     local width = args.width or "200px"
 
 
     local description = args.description
 
     local description = args.description
    local includewhere = args.includewhere ~= false
 
    if description and includewhere then
 
        local wherein = args.wherein or "[[Subgames/Minetest Game|Minetest Game]]"
 
        description = description .. " in " .. wherein
 
    end
 
 
 
     local image = args.image or "Blank.png"
 
     local image = args.image or "Blank.png"
 
     local imagesize = args.imagesize
 
     local imagesize = args.imagesize
Line 59: Line 45:
 
     end
 
     end
  
     return TableBuilder.create()
+
     local infobox = TableBuilder.create()
 +
 
 +
    infobox
 
         :addClass("wikitable")
 
         :addClass("wikitable")
 
         :css("float", "right")
 
         :css("float", "right")
Line 93: Line 81:
 
                 :attr("align", "center")
 
                 :attr("align", "center")
 
                 :wikitext(description)
 
                 :wikitext(description)
                :allDone()
 
end
 
  
local function addInfoRow(infobox, name, info)
+
    for _, rowHeaderData in ipairs(rowHeadersData) do
    local row = infobox:addRow()
+
        local rowData = args[rowHeaderData.id]
    row:addData():wikitext("'''" .. name .. "'''")
+
        if rowData and rowData ~= "" then
    row:addData():wikitext(info)
+
            infobox
 +
                :addRow()
 +
                    :addData()
 +
                        :wikitext("'''" .. rowHeaderData.name .. "'''")
 +
                        :done()
 +
                    :addData()
 +
                        :wikitext(rowData)
 +
        end
 +
    end
 +
 
 +
    return infobox
 
end
 
end
  
 
function p._block(args)
 
function p._block(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "150px"
        name = args.name or args.block_name or "A block",
+
     return tostring(infobox(args, "block"))
        image = args.image,
 
        imagesize = "150px",
 
        description = "A [[Blocks|block]]",
 
        wherein = args.wherein,
 
        width = args.width
 
     })
 
    addInfoRow(infobox, "Type", args.type or args.block_type or "Solid block")
 
    addInfoRow(infobox, "[[Mining#Drops|Drops]]", args.drops or "''Itself''")
 
    addInfoRow(infobox, "[[:Category:Falling|Physics]]", args.physics or "No")
 
    addInfoRow(infobox, "[[:Category:Luminous|Luminance]]", args.luminance or "No")
 
    addInfoRow(infobox, "[[:Category:Flammable|Flammable]]", args.flammable or "No")
 
    addInfoRow(infobox, "[[:Category:Generated_blocks|Generated]]", args.generated or "Yes")
 
    addInfoRow(infobox, "Renewable", args.renewable or "No")
 
    addInfoRow(infobox, "Stackable", args.stackable or "Yes (99)")
 
    addInfoRow(infobox, "[[Itemstrings|Itemstring]]", args.itemstring or "''?''")
 
    return tostring(infobox)
 
 
end
 
end
  
 
function p._item(args)
 
function p._item(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "160px"
        name = args.name or args.item_name or "An item",
+
     return tostring(infobox(args, "item"))
        image = args.image,
 
        imagesize = "160px",
 
        description = "An [[Items|item]]",
 
        wherein = args.wherein,
 
        width = args.width
 
     })
 
    addInfoRow(infobox, "Type", args.type or args.item_type or "Craftitem")
 
    addInfoRow(infobox, "Renewable", args.renewable or "No")
 
    addInfoRow(infobox, "Durability", args.durability or "''N/A''")
 
    addInfoRow(infobox, "Stackable", args.stackable or "Yes (99)")
 
    addInfoRow(infobox, "[[Itemstrings|Itemstring]]", args.itemstring or "''?''")
 
    return tostring(infobox)
 
 
end
 
end
  
 
function p._foodItem(args)
 
function p._foodItem(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "160px"
        name = args.name or args.item_name or "A food",
+
     return tostring(infobox(args, "foodItem"))
        image = args.image,
 
        imagesize = "160px",
 
        description = "A food [[Items|item]]",
 
        wherein = args.wherein,
 
        width = args.width
 
     })
 
    addInfoRow(infobox, "Type", args.type or args.item_type or "Food")
 
    addInfoRow(infobox, "Restores", args.restores or "''?''")
 
    addInfoRow(infobox, "Cookable", args.cookable or "No")
 
    addInfoRow(infobox, "Renewable", args.renewable or "No")
 
    addInfoRow(infobox, "Stackable", args.stackable or "Yes (99)")
 
    addInfoRow(infobox, "[[Itemstrings|Itemstring]]", args.itemstring or "''?''")
 
    return tostring(infobox)
 
 
end
 
end
  
 
function p._mob(args)
 
function p._mob(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "150px"
        name = args.name or args.mob_name or "A mob",
+
     return tostring(infobox(args, "mob"))
        image = args.image,
+
end
        imagesize = "150px",
+
 
        description = "A [[Mobs|mob]]",
+
function p._object(args)
        wherein = args.wherein,
+
     args.imagesize = args.imagesize or "150px"
        width = args.width
+
     return tostring(infobox(args, "object"))
     })
 
    addInfoRow(infobox, "Health", args.health or "''?''")
 
    addInfoRow(infobox, "Armor", args.armor or "''N/A''")
 
     addInfoRow(infobox, "Damage", args.damage or "''N/A''")
 
    addInfoRow(infobox, "Drops", args.drops or "''N/A''")
 
     addInfoRow(infobox, "Entitystring", args.entitystring or "''?''")
 
    return tostring(infobox)
 
 
end
 
end
  
 
function p._game(args)
 
function p._game(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "150px"
        name = args.name or "A subgame",
+
     return tostring(infobox(args, "game"))
        image = args.image,
 
        imagesize = "150px",
 
        description = "A [[Subgames|subgame]]",
 
        includewhere = false,
 
        width = args.width
 
     })
 
    addInfoRow(infobox, "Type", args.type or "''?''")
 
    addInfoRow(infobox, "Author", args.author or "''?''")
 
    addInfoRow(infobox, "Latest version", args.version or "''?''")
 
    addInfoRow(infobox, "Forum topic", args.forum or "''N/A''")
 
    addInfoRow(infobox, "Source code", args.source or "''N/A''")
 
    return tostring(infobox)
 
 
end
 
end
  
 
function p._mod(args)
 
function p._mod(args)
     local infobox = p.infobox({
+
     args.imagesize = args.imagesize or "150px"
        name = args.name or "A mod",
+
     return tostring(infobox(args, "mod"))
        image = args.image,
+
end
        imagesize = "150px",
+
 
        description = "A [[Mods|mod]]",
+
function p._server(args)
        includewhere = false,
+
     args.imagesize = args.imagesize or "150px"
        width = args.width
+
     return tostring(infobox(args, "server"))
     })
 
    addInfoRow(infobox, "Type", args.type or "''?''")
 
    addInfoRow(infobox, "Author", args.author or "''?''")
 
     addInfoRow(infobox, "Latest version", args.version or "''?''")
 
    addInfoRow(infobox, "Forum topic", args.forum or "''N/A''")
 
     addInfoRow(infobox, "Source code", args.source or "''N/A''")
 
    addInfoRow(infobox, "Technical name", args.luaname or "''?''")
 
    return tostring(infobox)
 
 
end
 
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
 
return p

Latest revision as of 17:39, 7 June 2022

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