ATTENTION! The process of updating WiKi to version Eco 10.x has begun. Those wishing to participate can find out more Information on our ECO Contribution Wiki Discord.
From April 26 to May 12, errors may occur in the Wiki, as we will be carrying out a major update to the information processing modules.

Module:Infobox Item: Difference between revisions

From Eco - English Wiki
[unchecked revision][checked revision]
m (Only include header with value)
No edit summary
 
(28 intermediate revisions by 4 users not shown)
Line 3: Line 3:
local p = {}
local p = {}
local Utils = require('Module:Utils')
local Utils = require('Module:Utils')
local L = require('Module:Localization')


-- Build an Item Infobox
-- Build an Item Infobox
function itemBox( args, itemData )
function itemBox(args, itemData)
     -- check that all necessary arguments are passed correctly
     -- check that all necessary arguments are passed correctly
     if args.name == nil or args.name == '' then
     if args.name == nil or args.name == '' then
         return '\'name\' must be specified.'
         return '\'name\' must be specified.'
     end
     end
   
local item = args.name
local itemTable = itemData.items[item]


if itemTable == nil then
    local item = args.name
return item .. ' could not be found in Module:ItemData.'
    local itemTable = itemData.items[item]
end
 
    if itemTable == nil then
        return item .. ' could not be found in Module:ItemData. [[Category:MissingItem]]'
    end


     local itemType = itemTable.type
     local itemType = itemTable.type
local itemEN = string.sub (itemType, 1, -5)
    local itemEN = string.sub(itemType, 1, -5)
local itemimagename = string.gsub(itemEN, ' ', '')
    local itemimagename = string.gsub(itemEN, ' ', '')
   
 
     -- string used to build the infobox
     -- string used to build the infobox
     local infobox = '{| class=\"infobox\"\n'
     local infobox = '{| class=\"infobox\"\n'
      
 
-- 'Name and Image' section
     -- 'Name and Image' section
-- name of the item
    -- name of the item
infobox = infobox .. '|- style=\"color: white; background-color: #1165AF; text-align: center;\"\n| colspan=\"2\" | \'\'\'<big>' .. item .. '</big>\'\'\'\n'
    infobox = infobox .. '|- style=\"color: white; background-color: #1165AF; text-align: center;\"\n| colspan=\"2\" | \'\'\'<big>' .. item .. '</big>\'\'\'\n'
      
 
-- the item's type (ItemData - group)
     -- the item's type (ItemData - group)
infobox = infobox .. '|- style=\"text-align: center; color: white; background-color: '
    infobox = infobox .. '|- style=\"text-align: center; color: white; background-color: '
 
if itemTable.group == 'Food' then
    local text_colour = '#78B1FF'
infobox = infobox .. '#85D66B;\"\n| colspan=\"2\" | \'\'\'Food\'\'\'\n'
 
-- Items:Food Icon Image
    if itemTable.group == L.t('Food') then
local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Icon.png|[[Category:Pages_with_missing_icon]]'
        text_colour = '#85D66B'
if mw.title.makeTitle('File', itemimagename .. '_Icon.png').file.exists then
    elseif itemTable.group == L.t('Skill Books') or itemTable.group == L.t('Skill Scrolls') then
image = itemimagename .. '_Icon.png'
        text_colour = '#FFCF4D'
elseif mw.title.makeTitle('File', itemimagename .. '_Icon.jpg').file.exists then
    elseif itemTable.group == L.t('Skill Scrolls') then
image = itemimagename .. '_Icon.jpg'
        text_colour = '#FFCF4D'
end
    end
 
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:' .. image .. '|frameless|class=iconGreen]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'
    infobox = infobox .. text_colour .. ';\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    local icon = Utils.build_icon(item)
elseif itemTable.group == 'Skill Books' then
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | '..icon .. '\n'
infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
 
-- Items:Skill Book Icon Image
    -- 'Description' section header
infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:SkillBook.png|link=https://wiki.play.eco/File:SkillBook.png|frameless|class=iconGold]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'
    infobox = infobox .. sectionHeader('Description')
 
elseif itemTable.group == 'Skill Scrolls' then
    if itemTable.description == nil or itemTable.description == '' then
infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'' .. L.t('None') .. '\'\'\'\n'
-- Items:Skill Scrolls Icon Image
    else
infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:SkillScroll.png|link=https://wiki.play.eco/File:SkillScroll.png|frameless|class=iconGold]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. itemTable.description .. '\n'
    end
else
 
infobox = infobox .. '#78B1FF;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    --Crafting
-- Items: Other Icon Image
    local craftingRecipes = mw.loadData("Module:CraftingRecipes")
local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Icon.png|[[Category:Pages_with_missing_icon]]'
 
if mw.title.makeTitle('File', itemimagename .. '_Icon.png').file.exists then
    infobox = infobox .. generalSection(item, itemTable, craftingRecipes, args)
image = itemimagename .. '_Icon.png'
 
elseif mw.title.makeTitle('File', itemimagename .. '_Icon.jpg').file.exists then
    infobox = infobox .. IDsSection(itemTable)
image = itemimagename .. '_Icon.jpg'
 
end
    -- Tags Header
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | <div class="iconContainer"><div class="iconStack">[[File:' .. image .. '|frameless|class=iconBlue]]</div><div class=iconBorder style=\"position:absolute;\"></div></div> \n'
    if itemTable.tagGroups ~= nil and itemTable.tagGroups ~= {} then
end
        infobox = infobox .. tagSection(itemTable, itemData)
      
    end
  -- 'Description' section header
 
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Description\'\'\'\n'
    -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
    if itemTable.group == L.t('Block Items') or itemTable.group == L.t('World Object Items') then
if itemTable.description == nil then
        infobox = infobox .. placementSection(itemTable, itemimagename)
infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'None\'\'\'\n'
 
elseif itemTable.description == '' then
        -- Object Form Image
infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'None\'\'\'\n'
        if itemTable.group == L.t('Block Items') then
else
            infobox = infobox .. objectFormSection(itemTable, itemimagename)
infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. itemTable.description .. '\n'
        end
end
 
        -- 'Housing' section (if there is a Room Category)
        if itemTable.roomCategory ~= nil then
            infobox = infobox .. housingSection(itemTable)
        end
 
        -- 'Storage' Section (if inventorySlots is not nil)
        if itemTable.inventorySlots ~= nil then
            infobox = infobox .. storageSection(itemTable)
        end
 
        -- 'Power' section (if EngeryType is ``not nil)
        if itemTable.energyType ~= nil then
            infobox = infobox .. powerSection(itemTable)
 
        end
 
        -- 'Fuel' Section (if fuelsUsed by Object)
        if itemTable.fuelsUsed ~= nil then
            infobox = infobox .. fuelsSection(itemTable)
        end
 
        -- 'Fluid' section (if fludisUsed is not nil)
        if itemTable.fluidsUsed ~= nil or itemTable.fluidsProduced ~= nil then
            infobox = infobox .. fluidsSection(itemTable)
        end
     end
 
    -- Road Object header (if group == Road Items)
    if itemTable.group == L.t('Road Items') then
        infobox = infobox .. roadItemsSection(itemTable, itemimagename)
    end
    infobox = infobox .. '|}'
    return infobox
end
 
function sectionHeader(title, count)
    return "|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t(title, count) .. "'''\n"
end
 
function sectionRow(label, content, count, unit)
    if unit ~= nil then
        content = tonumber(content)
        unit = L.t(unit, content)
        local lang = mw.getContentLanguage()
        content = lang:formatNum(content)
    else
        unit = ''
    end
    return '|-\n| ' .. L.t(label, count) .. ':\n| style=\"text-align: right; padding: 3px;\" | ' .. content .. unit .. '\n'
end
 
function sectionImage(imageName, suffix)
    local image = checkImage(imageName, suffix)
    return '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
end
 
local function addToSet(set, key)
    set[key] = true
end
 
local function setNotContains(set, key)
    return set[key] == nil
end
 
local function craftingSubSection(title, item, productsOrIngredients, recipes)
    local stations = {}
    local sortStations = {}
    local stationString = ''
    for _, recipeName in ipairs(productsOrIngredients[item]) do
        local currentRecipe = recipes[recipeName]
        if currentRecipe ~= nil then
            if currentRecipe.variants[recipeName] ~= nil then
                local currentStation = currentRecipe.craftStn[1][1]
                if setNotContains(stations, currentStation) then
                    addToSet(stations, currentStation)
                end
            end
        end
    end
 
    if stations then
        for a, _ in pairs(stations) do
            table.insert(sortStations, a)
        end
        table.sort(sortStations)
        for i, n in ipairs(sortStations) do
            stationString = stationString .. ' [[' .. n .. ']]'
            if (n ~= sortStations[#sortStations]) then
                -- add a comma
                stationString = stationString .. ', '
            end
        end
        return sectionRow(title, stationString)
    else
        return sectionRow(title, L.t('N/A'))
    end
end
 
function generalSection(item, itemTable, craftingRecipes, args)
     -- 'General' section header
     -- 'General' section header
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'General\'\'\'\n'
    section = sectionHeader('General')
   
 
--Crafting
    -- Is a product at these tables
local craftingRecipes = require( "Module:CraftingRecipes" )
    if craftingRecipes.products[item] ~= nil and Utils.tableLen(craftingRecipes.products[item]) >= 1 then
local recipes = craftingRecipes.recipes
        section = section .. craftingSubSection('Created at', item, craftingRecipes.products, craftingRecipes.recipes)
    end
local function addToSet(set, key)
 
set[key] = true
    -- Is an ingredient at these tables
end
    if craftingRecipes.ingredients[item] ~= nil and Utils.tableLen(craftingRecipes.ingredients[item]) >= 1 then
        section = section .. craftingSubSection('Used at', item, craftingRecipes.ingredients, craftingRecipes.recipes)
local function setNotContains(set, key)
    end
return set[key] == nil
 
end
    -- calories and nutrients (if itemTable.group == 'Food')
    if itemTable.group == L.t('Food') then
-- Is a product at these tables
        section = section .. sectionRow('Calorie', itemTable.calories, tonumber(itemTable.calories), 'cal')
if craftingRecipes.products[item] ~= nil and #craftingRecipes.products[item] >= 1 then
        section = section .. '|- valign=\"center\"\n| rowspan=\"4\" | ' .. L.t('Nutrients') .. ':\n'
local count = 0
        section = section .. '| style=\"color: red; text-align: right; padding: 3px;\" | ' .. L.t('Carbs') .. ': ' .. itemTable.carbs .. '\n'
local stations = {}
        section = section .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | ' .. L.t('Protein') .. ': ' .. itemTable.protein .. '\n'
local sortStations = {}
        section = section .. '|- valign=\"center\"\n| style=\"color: darkkhaki; text-align: right; padding: 3px;\" | ' .. L.t('Fat') .. ': ' .. itemTable.fat .. '\n'
local stationString = ''
        section = section .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | ' .. L.t('Vitamins') .. ': ' .. itemTable.vitamins .. '\n'
local found = false
        section = section .. sectionRow('Nutrition Density', L.t('%s per 100 cals'):format(itemTable.density))
for k, v in ipairs( craftingRecipes.products[item] ) do
    end
if recipes[v] ~= nil then
 
for num = 1, #recipes[v].numberOfVariants do
    -- carried
if (recipes[v].variants[v] ~= nil and recipes[v].numberOfVariants <= tostring(1)) then
    local carried
if setNotContains(stations, recipes[v].craftStn[1][1]) then
    if args.carried ~= nil and args.carried ~= '' then
addToSet(stations, recipes[v].craftStn[1][1])
        carried = args.carried
count = count + 1
    else
end
        carried = itemTable.carried
if found == false then
    end
found = true
    section = section .. sectionRow('Carried in', carried)
infobox = infobox .. '|-\n| Created At:\n| style=\"text-align: right; padding: 3px;\" |'
 
end
     -- weight
end
    local weight
end
    if itemTable.weight ~= nil then
end
        weight = itemTable.weight/100
end
    else
        weight = '0.0'
local track = 0
    end
    section = section .. sectionRow('Weight', weight, nil, 'kg')
if found == true then
 
for a, b in pairs(stations) do
     -- stack limit
table.insert(sortStations, a)
    if itemTable.maxStack ~= nil then
end
        section = section .. sectionRow('Stack limit', itemTable.maxStack)
table.sort(sortStations)
    end
for i, n in ipairs(sortStations) do
 
stationString = stationString .. ' [[' .. n .. ']]'
    -- yield
track = track + 1
    if itemTable.yield ~= nil then
if track ~= count then -- Changed these line to produce comma if not last table.
        section = section .. sectionRow('Improve Gathering', itemTable.yield)
stationString = stationString .. ','
    end
end
 
end
    -- fuel
infobox = infobox .. stationString .. '\n'
    if itemTable.fuel ~= nil then
else
        section = section .. sectionRow('Fuel energy', itemTable.fuel, nil, 'J')
infobox = infobox .. '|-\n| Created at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
    end
end
 
end
     -- currency
    if itemTable.currency ~= nil then
-- Is an ingredient at these tables
        section = section .. "|- style=\"text-align: center;\"\n| colspan=\"2\" | " .. L.t('Can back a currency') .. "\n"
if craftingRecipes.ingredients[item] ~= nil and #craftingRecipes.ingredients[item] >= 1 then
    end
local count = 0
    return section
local stations = {}
end
local sortStations = {}
 
local stationString = ''
function IDsSection(itemTable)
local found = false
for k, v in ipairs( craftingRecipes.ingredients[item] ) do
if recipes[v] ~= nil then
for num = 1, #recipes[v].numberOfVariants do
if (recipes[v].variants[v] ~= nil and recipes[v].numberOfVariants <= tostring(1)) then
if setNotContains(stations, recipes[v].craftStn[1][1]) then
addToSet(stations, recipes[v].craftStn[1][1])
count = count + 1
end
if found == false then
found = true
infobox = infobox .. '|-\n| Used At:\n| style=\"text-align: right; padding: 3px;\" |'
end
end
end
end
end
local track = 0
if found == true then
for a, b in pairs(stations) do
table.insert(sortStations, a)
end
table.sort(sortStations)
for i, n in ipairs(sortStations) do
stationString = stationString .. ' [[' .. n .. ']]'
track = track + 1
if track ~= count then -- Changed these line to produce comma if not last table.
stationString = stationString .. ','
end
end
infobox = infobox .. stationString .. '\n'
else
infobox = infobox .. '|-\n| Used at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
end
end
-- calories and nutrients (if itemTable.group == 'Food')
if itemTable.group == 'Food' then
infobox = infobox .. '|-\n| Calories:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.calories .. '\n|- valign=\"center\"\n| rowspan=\"4\" | Nutrients:\n'
infobox = infobox .. '| style=\"color: red; text-align: right; padding: 3px;\" | Carbs: ' .. itemTable.carbs .. '\n'
infobox = infobox .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | Protein: ' .. itemTable.protein .. '\n'
infobox = infobox .. '|- valign=\"center\"\n| style=\"color: yellow; text-align: right; padding: 3px;\" | Fat: ' .. itemTable.fat .. '\n'
infobox = infobox .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | Vitamins: ' .. itemTable.vitamins .. '\n'
infobox = infobox .. '|-\n| Nutrition Density:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.density .. ' per 100 cals\n'
end
-- carried
if args.carried ~= nil and args.carried ~= '' then
infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. args.carried .. '\n'
else
infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.carried .. '\n'
end
      
-- weight
if itemTable.weight ~= nil then
infobox = infobox .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | ' .. itemTable.weight .. ' kg\n'
else
infobox = infobox .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | 0.00kg\n'
end
      
-- stack limit
if itemTable.maxStack ~= nil then
infobox = infobox .. '|-\n| Stack limit:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.maxStack .. '\n'
end
-- yield  
if itemTable.yield ~= nil then
infobox = infobox .. '|-\n| Improve Gathering: \n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.yield .. '\n'
end
-- fuel
if itemTable.fuel ~= nil then
infobox = infobox .. '|-\n| Fuel energy:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuel .. ' J\n'
end
      
-- currency
if itemTable.currency ~= nil then
infobox = infobox .. '|-\n| Used as Currency:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.currency .. '\n'
end
     -- 'IDs' section header
     -- 'IDs' section header
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'IDs\'\'\'\n'
    section = sectionHeader('ID', 2)
      
 
-- item id (type)
     -- item id (type)
infobox = infobox .. '|- valign=\"center\"\n| Item ID:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.type .. '\n'
    section = section .. sectionRow('Item ID', itemTable.type)
   
-- id number (type id)
infobox = infobox .. '|- valign=\"center\"\n| ID Number:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.typeID .. '\n'


-- Tags Header
    return section
if itemTable.tagGroups ~= nil and itemTable.tagGroups ~= {} then
end
            -- Tags Header
            infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Tags\'\'\'\n'
            local tags = itemTable.tagGroups
            local list = ''
            -- for each item in the list (a is position, b is value)           
            for a,b in ipairs(tags) do
            --if not these tags listed here
                if (b ~='Object' or b ~= 'World  Object' or b ~= 'Housing  Object') then
                    -- add the tag to the list
                    -- HACK: Some tag localisations have spaces in the tag name, but not in the tag data
                    local tagLink
                    -- Some tags have multiple spaces? Possible data quality issue
                    bClean = b:gsub("%s+", " ")
                    if itemData.tags[bClean] ~= nil then
                        tagLink = bClean .. 'Tag'
                    else
                        tagLink = bClean:gsub(' ', '') .. 'Tag'
                    end


                    list = list .. '[[' .. tagLink ..'|' .. bClean ..']][[Category:' .. bClean .. ']]'
function tagSection(itemTable, itemData)
                end
    -- Tags Header
                -- if not the last item in the list
    local tags = itemTable.tagGroups
                if (b ~= tags[#tags]) then
    section = sectionHeader('Tag', Utils.tableLen(tags))
                    -- add a comma
    local list = ''
                    list = list .. ', '
    -- for each item in the list (a is position, b is value)
                end
    for a, b in ipairs(tags) do
        --if not these tags listed here
        if (b ~= L.t('Object') or b ~= L.t('World  Object') or b ~= L.t('Housing  Object')) then
            -- add the tag to the list
            -- HACK: Some tag localisations have spaces in the tag name, but not in the tag data
            local tagLink
            -- Some tags have multiple spaces? Possible data quality issue
            bClean = b:gsub("%s+", " ")
            if itemData.tags[bClean] ~= nil then
                tagLink = L.t('%s Tag'):format(bClean)
            else
                tagLink = L.t('%s Tag'):format(bClean:gsub(' ', ''))
             end
             end
             -- Now the list is made add it to the infobox
 
            infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. list .. '\n'
             list = list .. '[[' .. tagLink .. '|' .. bClean .. ']][[Category:' .. bClean .. ']]'
        end
        -- if not the last item in the list
        if (b ~= tags[#tags]) then
            -- add a comma
            list = list .. ', '
         end
         end
    end
    -- Now the list is made add it to the infobox
    section = section .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. list .. '\n'
    return section
end
function placementSection(itemTable, itemImageName)
    section = sectionHeader('World Object')
    -- Object Placed Image
    section = section .. sectionImage(itemImageName, 'Placed')
    -- 'Placement' section
    --Placement Header
    section = section .. sectionHeader('Placement')
    --Vechile
    if itemTable.mobile ~= nil then
        section = section .. sectionRow('Vehicle/Mobile Object', itemTable.mobile)
    end
    --Dimensions
    if itemTable.footprint ~= nil then
        section = section .. sectionRow('Dimensions (X,Y,Z)', itemTable.footprint)
    end
    --Material Tier
    if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
        section = section .. sectionRow('Room Material', itemTable.materialTier) .. '[[Category:Tier ' .. itemTable.materialTier .. ']]\n'
    end
    --Room Req.
    if itemTable.roomContainReq ~= nil then
        section = section .. sectionRow('Room Required', itemTable.roomContainReq)
    end
    --Room Size. Req.
    if itemTable.roomSizeReq ~= nil then
        section = section .. sectionRow('Room Size', itemTable.roomSizeReq, nil, 'm³')
    end
    --Room Mat. Req.
    if itemTable.roomMatReq ~= nil then
        section = section .. sectionRow('Room Materials', itemTable.roomMatReq)
    end
    return section
end
function objectFormSection(itemTable, itemImageName)
    return sectionImage(itemImageName, 'Form')
end
function housingSection(itemTable)
    -- Housing Header
    section = sectionHeader('Housing')
    --roomCategory
    section = section .. sectionRow('Room Category', itemTable.roomCategory) .. '[[Category:' .. itemTable.roomCategory .. ']]\n'


     -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
     if itemTable.roomCategory ~= L.t('Industrial') then
if itemTable.group == 'Block Items' or itemTable.group == 'World Object Items' then
        if itemTable.furnitureType ~= nil then
infobox = infobox .. '|- style=\"text-align: center; background-color: #517ab2;\"\n| colspan=\"2\" | \'\'\'World Object\'\'\'\n'
            --furnitureType
            section = section .. sectionRow('Furniture Type', itemTable.furnitureType) .. '[[Category:' .. itemTable.furnitureType .. ']]\n'
-- Object Placed Image
 
local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Placed.png|[[Category:Pages_with_missing_placed]]'
            --Value of the object
if mw.title.makeTitle('File', itemimagename .. '_Placed.png').file.exists then
            section = section .. sectionRow('Value', itemTable.skillValue)
image = itemimagename .. '_Placed.png'
 
elseif mw.title.makeTitle('File', itemimagename .. '_Placed.jpg').file.exists then
            --Dim. Return % of Object
image = itemimagename .. '_Placed.jpg'
            section = section .. sectionRow('Dim. Return %', itemTable.repeatsDepreciation * 100, nil, '%')
end
        end
infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
    end
 
 
-- 'Placement' section
    if itemTable.roomCategory == L.t('Industrial') then
--Placement Header
        section = section .. "|- style=\"background-color: #red; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t('ALL ROOM VALUE LOST') .. "'''\n"
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Placement\'\'\'\n'
    end
 
    return section
end
 
function storageSection(itemTable)
    -- Storage Header
    section = sectionHeader('Storage')
 
    --Inventory Slots
    section = section .. sectionRow('Inventory Slots', itemTable.inventorySlots)
 
    --inventoryMaxWeight
    if itemTable.inventoryMaxWeight ~= nil then
        maxWeightKg = itemTable.inventoryMaxWeight / 1000
        section = section .. sectionRow('Inventory Max Weight', maxWeightKg, nil, 'kg')
    else
        section = section .. sectionRow('Inventory Max Weight', L.t('Unlimited'))
    end
 
    return section
end
 
function powerSection(itemTable)
    -- Power Header
    section = sectionHeader('Power')
 
    --EngergyType
    section = section .. sectionRow('Energy Type', itemTable.energyType) .. '[[Category:' .. itemTable.energyType .. ']]\n'
 
    --Grid Radius
    section = section .. sectionRow('Grid Radius', itemTable.gridRadius, nil, 'm')
 
    --Energy Produced
    section = section .. sectionRow('Energy Produced', itemTable.energyProduced, nil, 'w')
 
    --Energy Used
    section = section .. sectionRow('Energy Used', itemTable.energyUsed, nil, 'w')


--Vechile
    return section
if itemTable.mobile ~= nil then
end
infobox = infobox .. '|-\n| Vehicle/Mobile Object:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.mobile .. '\n'
end
--Dimensions
if itemTable.footprint ~= nil then
infobox = infobox .. '|-\n| Dimensions (X,Y,Z):\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.footprint .. '\n'
end
--Material Tier
if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
infobox = infobox .. '|-\n| Room Material:\n| style=\"text-align: right; padding: 3px;\" | Tier ' .. itemTable.materialTier .. '[[Category:Tier '.. itemTable.materialTier ..']]\n'
end
--Room Req.
if itemTable.roomContainReq ~= nil then
infobox = infobox .. '|-\n| Room Required:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomContainReq .. '\n'
end
--Room Size. Req.
if itemTable.roomSizeReq ~= nil then
infobox = infobox .. '|-\n| Room Size:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomSizeReq .. ' m³\n'
end
--Room Mat. Req.
if itemTable.roomMatReq ~= nil then
infobox = infobox .. '|-\n| Room Materials:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomMatReq .. '\n'
end
-- Object Form Image
if itemTable.group == 'Block Items' then
local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Form.png|[[Category:Pages_with_missing_form]]'
if mw.title.makeTitle('File', itemimagename .. '_Form.png').file.exists then
image = itemimagename .. '_Form.png'
elseif mw.title.makeTitle('File', itemimagename .. '_Form.jpg').file.exists then
image = itemimagename .. '_Form.jpg'
end
infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
end


-- 'Housing' section (if there is a Room Category)
function fuelsSection(itemTable)
if itemTable.roomCategory ~= nil then 
    -- Fuel Header
-- Housing Header
     section = sectionHeader('Fuel')
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Housing\'\'\'\n'
      
--roomCategory
infobox = infobox .. '|-\n| Room Category:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomCategory .. '[[Category:' .. itemTable.roomCategory .. ']]\n'


if itemTable.roomCategory ~= 'Industrial' then
    --Fuels Used by Object
if itemTable.furnitureType ~= nil then
    section = section .. sectionRow('Fuels Used', '[[' .. L.t('%s Tag'):format(itemTable.fuelsUsed:gsub('[%[%]]+', '')) .. ']]')
--furnitureType
infobox = infobox .. '|-\n| Furniture Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.furnitureType .. '[[Category:' .. itemTable.furnitureType .. ']]\n'
           
--Value of the object
infobox = infobox .. '|-\n| Value:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.skillValue .. '\n'
           
--Dim. Return % of Object 
infobox = infobox .. '|-\n| Dim. Return %:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.repeatsDepreciation .. '\n'  
end
end
if itemTable.roomCategory == 'Industrial' then
infobox = infobox .. '|- style=\"background-color: red; text-align: center;\"\n| colspan=\"2\" | \'\'\'ALL ROOM VALUE LOST\'\'\'\n'
end
end
-- 'Storage' Section (if inventorySlots is not nil)
if itemTable.inventorySlots ~= nil then
-- Storage Header
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Storage\'\'\'\n'


--Inventory Slots
    return section
infobox = infobox .. '|-\n| Inventory Slots:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.inventorySlots .. '\n'
end
--inventoryMaxWeight
if itemTable.inventoryMaxWeight ~= nil then
maxWeightKg = itemTable.inventoryMaxWeight/1000
infobox = infobox .. '|-\n| Inventory Max Weight:\n| style=\"text-align: right; padding: 3px;\" | ' .. maxWeightKg .. ' Kg\n'
else
infobox = infobox .. '|-\n| Inventory Max Weight:\n| style=\"text-align: right; padding: 3px;\" | Unlimited \n'
end
end


-- 'Power' section (if EngeryType is ``not nil)
function fluidsSection(itemTable)
if itemTable.energyType ~= nil then 
    -- Liquid/Gas Header
-- Power Header
    section = sectionHeader('Liquid/Gas')
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Power\'\'\'\n'


--EngergyType
    --Input (fludisUsed)
infobox = infobox .. '|-\n| Energy Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyType .. '[[Category:' .. itemTable.energyType .. ']]\n'
    if itemTable.fluidsUsed ~= nil then
        local list = ''
--Grid Radius
        for a, b in ipairs(itemTable.fluidsUsed) do
infobox = infobox .. '|-\n| Grid Radius:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.gridRadius .. ' m\n'
            local acceptedType = b[1]
            local cRateString = string.gsub(b[2], "%s+", "")
--Energy Produced
            local consumingRate = tonumber(cRateString)
infobox = infobox .. '|-\n| Energy Produced:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyProduced .. 'W\n'
            list = list .. L.t('%s at %sL'):format(acceptedType, consumingRate)
--Energy Used
infobox = infobox .. '|-\n| Energy Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyUsed .. 'W\n'
end


-- 'Fuel' Section (if fuelsUsed by Object)
             if (a ~= #itemTable.fluidsUsed) then
if itemTable.fuelsUsed ~= nil then
                list = list .. ', '
-- Fuel Header
            end
infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Fuel\'\'\'\n'
        end
        section = section .. sectionRow('Input', list)
--Fuels Used by Object
    end
infobox = infobox .. '|-\n| Fuels Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuelsUsed .. '\n'
 
end
    --Output (liquidProduced)
    if itemTable.fluidsProduced ~= nil then
-- 'Fluid' section (if fludisUsed is not nil)   
        local list = ''
            if itemTable.fluidsUsed ~= nil or itemTable.fluidsProduced ~= nil then
        for a, b in ipairs(itemTable.fluidsProduced) do
            -- Liquid/Gas Header
            local producedType = b[1]
                infobox = infobox .. '|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | \'\'\'Liquid/Gas\'\'\'\n'
            local pRateString = string.gsub(b[2], "%s+", "")
              
            local producingRate = tonumber(pRateString)
                --Input (fludisUsed)
            if (producingRate == 0) then
                if itemTable.fluidsUsed ~= nil then
                producingRate = 'Rate of Input'
                infobox = infobox .. '|-\n| Input: \n| style=\"text-align: right; padding: 3px;\" | '
            end
                if itemTable.fluidsUsed ~= nil then
            list = list .. L.t('%s at %sL'):format(producedType, producingRate)
                    for a,b in ipairs(itemTable.fluidsUsed) do
            if (a ~= #itemTable.fluidsProduced) then
                        local acceptedType =  b[1]
                list = list .. ', '
                        local cRateString = string.gsub(b[2], "%s+", "")
            end
                        local consumingRate = tonumber(cRateString)
        end
                        infobox = infobox .. acceptedType .. ' at ' .. consumingRate .. ' L'
        section = section .. sectionRow('Output', list)
                        if (a ~= #itemTable.fluidsUsed) then
    end
                            infobox = infobox .. ', '
 
                        end
    return section
                    end
end
                end
 
                infobox = infobox .. '\n'
function roadItemsSection(itemTable, itemImageName)
            end
    section = sectionHeader('Road Object')
 
--Output (liquidProduced)
    -- Object Placed Image
if itemTable.fluidsProduced ~= nil then
    section = section .. sectionImage(itemImageName, 'Placed')
infobox = infobox .. '|-\n| Output: \n| style=\"text-align: right; padding: 3px;\" | '
    return section
for a,b in ipairs(itemTable.fluidsProduced) do
end
local producedType = b[1]
 
                        local pRateString = string.gsub(b[2], "%s+", "")
function checkImage(imageName, suffix)
                        local producingRate = tonumber(pRateString)
    local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. imageName .. '_' .. suffix .. '.png|[[Category:Pages_with_missing_' .. suffix:lower() .. ']]'
if (producingRate == 0) then
    if mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.png').file.exists then
producingRate = 'Rate of Input'
        image = imageName .. '_' .. suffix .. '.png'
end
    elseif mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.jpg').file.exists then
infobox = infobox .. producedType .. ' at ' .. producingRate .. ' L'
        image = imageName .. '_' .. suffix .. '.jpg'
if (a ~= #itemTable.fluidsProduced) then
    end
infobox = infobox .. ', '
    return image
end
end
end
infobox = infobox .. '\n'
end
end
end
-- Road Object header (if group == Road Items)
if itemTable.group == 'Road Items' then
infobox = infobox .. '|- style=\"text-align: center; background-color: #517ab2;\"\n| colspan=\"2\" | \'\'\'Road Object\'\'\'\n'
-- Object Placed Image
local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Placed.png|[[Category:Pages_with_missing_placed]]'
if mw.title.makeTitle('File', itemimagename .. '_Placed.png').file.exists then
image = itemimagename .. '_Placed.png'
elseif mw.title.makeTitle('File', itemimagename .. '_Placed.jpg').file.exists then
image = itemimagename .. '_Placed.jpg'
end
infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
end
infobox = infobox .. '|}'
return infobox
end


-- Main entry point for the Module
-- Main entry point for the Module
Line 458: Line 466:
     -- get args from the Template
     -- get args from the Template
     local args = Utils.normaliseArgs(frame)
     local args = Utils.normaliseArgs(frame)
   
 
     -- get item data
     -- get item data
     local itemData = require( "Module:ItemData" )
     local itemData = mw.loadData("Module:ItemData")
     return itemBox( args, itemData )
     return itemBox(args, itemData)
end
end


return p
return p

Latest revision as of 18:44, 7 January 2024

Documentation[edit source]

This module provides the back end functionality of the Template:Infobox_Item.

If the template is passed an Infobox will be made using details from the following Modules:

Credit[edit source]

Original Infobox (now known as Infobox_Item) created by Pradoxzon was then edited by Nesphit and TreeNuts0. Fyre (FishAus) and Scotty (ZeelNightwolf) further edited the Infobox_Item. They then duplicated and used as a base for Infobox_Skill, Infobox_Plant, and Infobox_Animal.


-- Credit: Original Infobox (now known as Infobox_Item) created by Pradoxzon was then edited by Nesphit and TreeNuts0. Fyre (FishAus) and Scotty (ZeelNightwolf) further edited the Infobox_Item. They then duplicated and used as a base for Infobox_Skill, Infobox_Plant, and Infobox_Animal.

local p = {}
local Utils = require('Module:Utils')
local L = require('Module:Localization')

-- Build an Item Infobox
function itemBox(args, itemData)
    -- check that all necessary arguments are passed correctly
    if args.name == nil or args.name == '' then
        return '\'name\' must be specified.'
    end

    local item = args.name
    local itemTable = itemData.items[item]

    if itemTable == nil then
        return item .. ' could not be found in Module:ItemData. [[Category:MissingItem]]'
    end

    local itemType = itemTable.type
    local itemEN = string.sub(itemType, 1, -5)
    local itemimagename = string.gsub(itemEN, ' ', '')

    -- string used to build the infobox
    local infobox = '{| class=\"infobox\"\n'

    -- 'Name and Image' section
    -- name of the item
    infobox = infobox .. '|- style=\"color: white; background-color: #1165AF; text-align: center;\"\n| colspan=\"2\" | \'\'\'<big>' .. item .. '</big>\'\'\'\n'

    -- the item's type (ItemData - group)
    infobox = infobox .. '|- style=\"text-align: center; color: white; background-color: '

    local text_colour = '#78B1FF'

    if itemTable.group == L.t('Food') then
        text_colour = '#85D66B'
    elseif itemTable.group == L.t('Skill Books') or itemTable.group == L.t('Skill Scrolls') then
        text_colour = '#FFCF4D'
    elseif itemTable.group == L.t('Skill Scrolls') then
        text_colour = '#FFCF4D'
    end

    infobox = infobox .. text_colour .. ';\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    local icon = Utils.build_icon(item)
    infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | '..icon .. '\n'

    -- 'Description' section header
    infobox = infobox .. sectionHeader('Description')

    if itemTable.description == nil or itemTable.description == '' then
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'' .. L.t('None') .. '\'\'\'\n'
    else
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. itemTable.description .. '\n'
    end

    --Crafting
    local craftingRecipes = mw.loadData("Module:CraftingRecipes")

    infobox = infobox .. generalSection(item, itemTable, craftingRecipes, args)

    infobox = infobox .. IDsSection(itemTable)

    -- Tags Header
    if itemTable.tagGroups ~= nil and itemTable.tagGroups ~= {} then
        infobox = infobox .. tagSection(itemTable, itemData)
    end

    -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
    if itemTable.group == L.t('Block Items') or itemTable.group == L.t('World Object Items') then
        infobox = infobox .. placementSection(itemTable, itemimagename)

        -- Object Form Image
        if itemTable.group == L.t('Block Items') then
            infobox = infobox .. objectFormSection(itemTable, itemimagename)
        end

        -- 'Housing' section (if there is a Room Category)
        if itemTable.roomCategory ~= nil then
            infobox = infobox .. housingSection(itemTable)
        end

        -- 'Storage' Section (if inventorySlots is not nil)
        if itemTable.inventorySlots ~= nil then
            infobox = infobox .. storageSection(itemTable)
        end

        -- 'Power' section (if EngeryType is ``not nil)
        if itemTable.energyType ~= nil then
            infobox = infobox .. powerSection(itemTable)

        end

        -- 'Fuel' Section (if fuelsUsed by Object)
        if itemTable.fuelsUsed ~= nil then
            infobox = infobox .. fuelsSection(itemTable)
        end

        -- 'Fluid' section (if fludisUsed is not nil)
        if itemTable.fluidsUsed ~= nil or itemTable.fluidsProduced ~= nil then
            infobox = infobox .. fluidsSection(itemTable)
        end
    end

    -- Road Object header (if group == Road Items)
    if itemTable.group == L.t('Road Items') then
        infobox = infobox .. roadItemsSection(itemTable, itemimagename)
    end
    infobox = infobox .. '|}'
    return infobox
end

function sectionHeader(title, count)
    return "|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t(title, count) .. "'''\n"
end

function sectionRow(label, content, count, unit)
    if unit ~= nil then
        content = tonumber(content)
        unit = L.t(unit, content)
        local lang = mw.getContentLanguage()
        content = lang:formatNum(content)
    else
        unit = ''
    end
    return '|-\n| ' .. L.t(label, count) .. ':\n| style=\"text-align: right; padding: 3px;\" | ' .. content .. unit .. '\n'
end

function sectionImage(imageName, suffix)
    local image = checkImage(imageName, suffix)
    return '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
end

local function addToSet(set, key)
    set[key] = true
end

local function setNotContains(set, key)
    return set[key] == nil
end

local function craftingSubSection(title, item, productsOrIngredients, recipes)
    local stations = {}
    local sortStations = {}
    local stationString = ''
    for _, recipeName in ipairs(productsOrIngredients[item]) do
        local currentRecipe = recipes[recipeName]
        if currentRecipe ~= nil then
            if currentRecipe.variants[recipeName] ~= nil then
                local currentStation = currentRecipe.craftStn[1][1]
                if setNotContains(stations, currentStation) then
                    addToSet(stations, currentStation)
                end
            end
        end
    end

    if stations then
        for a, _ in pairs(stations) do
            table.insert(sortStations, a)
        end
        table.sort(sortStations)
        for i, n in ipairs(sortStations) do
            stationString = stationString .. ' [[' .. n .. ']]'
            if (n ~= sortStations[#sortStations]) then
                -- add a comma
                stationString = stationString .. ', '
            end
        end
        return sectionRow(title, stationString)
    else
        return sectionRow(title, L.t('N/A'))
    end
end

function generalSection(item, itemTable, craftingRecipes, args)
    -- 'General' section header
    section = sectionHeader('General')

    -- Is a product at these tables
    if craftingRecipes.products[item] ~= nil and Utils.tableLen(craftingRecipes.products[item]) >= 1 then
        section = section .. craftingSubSection('Created at', item, craftingRecipes.products, craftingRecipes.recipes)
    end

    -- Is an ingredient at these tables
    if craftingRecipes.ingredients[item] ~= nil and Utils.tableLen(craftingRecipes.ingredients[item]) >= 1 then
        section = section .. craftingSubSection('Used at', item, craftingRecipes.ingredients, craftingRecipes.recipes)
    end

    -- calories and nutrients (if itemTable.group == 'Food')
    if itemTable.group == L.t('Food') then
        section = section .. sectionRow('Calorie', itemTable.calories, tonumber(itemTable.calories), 'cal')
        section = section .. '|- valign=\"center\"\n| rowspan=\"4\" | ' .. L.t('Nutrients') .. ':\n'
        section = section .. '| style=\"color: red; text-align: right; padding: 3px;\" | ' .. L.t('Carbs') .. ': ' .. itemTable.carbs .. '\n'
        section = section .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | ' .. L.t('Protein') .. ': ' .. itemTable.protein .. '\n'
        section = section .. '|- valign=\"center\"\n| style=\"color: darkkhaki; text-align: right; padding: 3px;\" | ' .. L.t('Fat') .. ': ' .. itemTable.fat .. '\n'
        section = section .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | ' .. L.t('Vitamins') .. ': ' .. itemTable.vitamins .. '\n'
        section = section .. sectionRow('Nutrition Density', L.t('%s per 100 cals'):format(itemTable.density))
    end

    -- carried
    local carried
    if args.carried ~= nil and args.carried ~= '' then
        carried = args.carried
    else
        carried = itemTable.carried
    end
    section = section .. sectionRow('Carried in', carried)

    -- weight
    local weight
    if itemTable.weight ~= nil then
        weight = itemTable.weight/100
    else
        weight = '0.0'
    end
    section = section .. sectionRow('Weight', weight, nil, 'kg')

    -- stack limit
    if itemTable.maxStack ~= nil then
        section = section .. sectionRow('Stack limit', itemTable.maxStack)
    end

    -- yield
    if itemTable.yield ~= nil then
        section = section .. sectionRow('Improve Gathering', itemTable.yield)
    end

    -- fuel
    if itemTable.fuel ~= nil then
        section = section .. sectionRow('Fuel energy', itemTable.fuel, nil, 'J')
    end

    -- currency
    if itemTable.currency ~= nil then
        section = section .. "|- style=\"text-align: center;\"\n| colspan=\"2\" | " .. L.t('Can back a currency') .. "\n"
    end
    return section
end

function IDsSection(itemTable)
    -- 'IDs' section header
    section = sectionHeader('ID', 2)

    -- item id (type)
    section = section .. sectionRow('Item ID', itemTable.type)

    return section
end

function tagSection(itemTable, itemData)
    -- Tags Header
    local tags = itemTable.tagGroups
    section = sectionHeader('Tag', Utils.tableLen(tags))
    local list = ''
    -- for each item in the list (a is position, b is value)
    for a, b in ipairs(tags) do
        --if not these tags listed here
        if (b ~= L.t('Object') or b ~= L.t('World  Object') or b ~= L.t('Housing  Object')) then
            -- add the tag to the list
            -- HACK: Some tag localisations have spaces in the tag name, but not in the tag data
            local tagLink
            -- Some tags have multiple spaces? Possible data quality issue
            bClean = b:gsub("%s+", " ")
            if itemData.tags[bClean] ~= nil then
                tagLink = L.t('%s Tag'):format(bClean)
            else
                tagLink = L.t('%s Tag'):format(bClean:gsub(' ', ''))
            end

            list = list .. '[[' .. tagLink .. '|' .. bClean .. ']][[Category:' .. bClean .. ']]'
        end
        -- if not the last item in the list
        if (b ~= tags[#tags]) then
            -- add a comma
            list = list .. ', '
        end
    end
    -- Now the list is made add it to the infobox
    section = section .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. list .. '\n'

    return section
end

function placementSection(itemTable, itemImageName)
    section = sectionHeader('World Object')
    -- Object Placed Image
    section = section .. sectionImage(itemImageName, 'Placed')

    -- 'Placement' section
    --Placement Header
    section = section .. sectionHeader('Placement')

    --Vechile
    if itemTable.mobile ~= nil then
        section = section .. sectionRow('Vehicle/Mobile Object', itemTable.mobile)
    end

    --Dimensions
    if itemTable.footprint ~= nil then
        section = section .. sectionRow('Dimensions (X,Y,Z)', itemTable.footprint)
    end

    --Material Tier
    if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
        section = section .. sectionRow('Room Material', itemTable.materialTier) .. '[[Category:Tier ' .. itemTable.materialTier .. ']]\n'
    end

    --Room Req.
    if itemTable.roomContainReq ~= nil then
        section = section .. sectionRow('Room Required', itemTable.roomContainReq)
    end

    --Room Size. Req.
    if itemTable.roomSizeReq ~= nil then
        section = section .. sectionRow('Room Size', itemTable.roomSizeReq, nil, 'm³')
    end

    --Room Mat. Req.
    if itemTable.roomMatReq ~= nil then
        section = section .. sectionRow('Room Materials', itemTable.roomMatReq)
    end
    return section
end

function objectFormSection(itemTable, itemImageName)
    return sectionImage(itemImageName, 'Form')
end

function housingSection(itemTable)
    -- Housing Header
    section = sectionHeader('Housing')

    --roomCategory
    section = section .. sectionRow('Room Category', itemTable.roomCategory) .. '[[Category:' .. itemTable.roomCategory .. ']]\n'

    if itemTable.roomCategory ~= L.t('Industrial') then
        if itemTable.furnitureType ~= nil then
            --furnitureType
            section = section .. sectionRow('Furniture Type', itemTable.furnitureType) .. '[[Category:' .. itemTable.furnitureType .. ']]\n'

            --Value of the object
            section = section .. sectionRow('Value', itemTable.skillValue)

            --Dim. Return % of Object
            section = section .. sectionRow('Dim. Return %', itemTable.repeatsDepreciation * 100, nil, '%')
        end
    end

    if itemTable.roomCategory == L.t('Industrial') then
        section = section .. "|- style=\"background-color: #red; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t('ALL ROOM VALUE LOST') .. "'''\n"
    end

    return section
end

function storageSection(itemTable)
    -- Storage Header
    section = sectionHeader('Storage')

    --Inventory Slots
    section = section .. sectionRow('Inventory Slots', itemTable.inventorySlots)

    --inventoryMaxWeight
    if itemTable.inventoryMaxWeight ~= nil then
        maxWeightKg = itemTable.inventoryMaxWeight / 1000
        section = section .. sectionRow('Inventory Max Weight', maxWeightKg, nil, 'kg')
    else
        section = section .. sectionRow('Inventory Max Weight', L.t('Unlimited'))
    end

    return section
end

function powerSection(itemTable)
    -- Power Header
    section = sectionHeader('Power')

    --EngergyType
    section = section .. sectionRow('Energy Type', itemTable.energyType) .. '[[Category:' .. itemTable.energyType .. ']]\n'

    --Grid Radius
    section = section .. sectionRow('Grid Radius', itemTable.gridRadius, nil, 'm')

    --Energy Produced
    section = section .. sectionRow('Energy Produced', itemTable.energyProduced, nil, 'w')

    --Energy Used
    section = section .. sectionRow('Energy Used', itemTable.energyUsed, nil, 'w')

    return section
end

function fuelsSection(itemTable)
    -- Fuel Header
    section = sectionHeader('Fuel')

    --Fuels Used by Object
    section = section .. sectionRow('Fuels Used', '[[' .. L.t('%s Tag'):format(itemTable.fuelsUsed:gsub('[%[%]]+', '')) .. ']]')

    return section
end

function fluidsSection(itemTable)
    -- Liquid/Gas Header
    section = sectionHeader('Liquid/Gas')

    --Input (fludisUsed)
    if itemTable.fluidsUsed ~= nil then
        local list = ''
        for a, b in ipairs(itemTable.fluidsUsed) do
            local acceptedType = b[1]
            local cRateString = string.gsub(b[2], "%s+", "")
            local consumingRate = tonumber(cRateString)
            list = list .. L.t('%s at %sL'):format(acceptedType, consumingRate)

            if (a ~= #itemTable.fluidsUsed) then
                list = list .. ', '
            end
        end
        section = section .. sectionRow('Input', list)
    end

    --Output (liquidProduced)
    if itemTable.fluidsProduced ~= nil then
        local list = ''
        for a, b in ipairs(itemTable.fluidsProduced) do
            local producedType = b[1]
            local pRateString = string.gsub(b[2], "%s+", "")
            local producingRate = tonumber(pRateString)
            if (producingRate == 0) then
                producingRate = 'Rate of Input'
            end
            list = list .. L.t('%s at %sL'):format(producedType, producingRate)
            if (a ~= #itemTable.fluidsProduced) then
                list = list .. ', '
            end
        end
        section = section .. sectionRow('Output', list)
    end

    return section
end

function roadItemsSection(itemTable, itemImageName)
    section = sectionHeader('Road Object')

    -- Object Placed Image
    section = section .. sectionImage(itemImageName, 'Placed')
    return section
end

function checkImage(imageName, suffix)
    local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. imageName .. '_' .. suffix .. '.png|[[Category:Pages_with_missing_' .. suffix:lower() .. ']]'
    if mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.png').file.exists then
        image = imageName .. '_' .. suffix .. '.png'
    elseif mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.jpg').file.exists then
        image = imageName .. '_' .. suffix .. '.jpg'
    end
    return image
end

-- Main entry point for the Module
function p.ItemMain(frame)
    -- get args from the Template
    local args = Utils.normaliseArgs(frame)

    -- get item data
    local itemData = mw.loadData("Module:ItemData")
    return itemBox(args, itemData)
end

return p