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]
(Refactor infobox)
(Refactor infobox)
Line 76: Line 76:
   local craftingRecipes = mw.loadData( "Module:CraftingRecipes" )
   local craftingRecipes = mw.loadData( "Module:CraftingRecipes" )


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


   infobox = infobox .. IDsSection(itemTable)
   infobox = infobox .. IDsSection(itemTable)
Line 127: Line 127:
   infobox = infobox .. '|}'
   infobox = infobox .. '|}'
   return 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
end


Line 137: Line 158:
end
end


function generalSection(itemTable, craftingRecipes, args)
local function craftingSubSection(title, item, productsOrIngredients, recipes)
-- 'General' section header
   local stations = {}
  section = sectionHeader('General')
  local sortStations = {}
 
  local stationString = ''
  local recipes = craftingRecipes.recipes
  for _, recipeName in ipairs( productsOrIngredients[item] ) do
 
    local currentRecipe = recipes[recipeName]
 
    if currentRecipe ~= nil then
  -- Is a product at these tables
      if currentRecipe.variants[recipeName] ~= nil then
   if craftingRecipes.products[item] ~= nil and #craftingRecipes.products[item] >= 1 then
        local currentStation = currentRecipe.craftStn[1][1]
    local count = 0
        if setNotContains(stations, currentStation) then
    local stations = {}
          addToSet(stations, currentStation)
    local sortStations = {}
         end
    local stationString = ''
    local found = false
    for k, v in ipairs( craftingRecipes.products[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
              section = section .. '|-\n| Created At:\n| style=\"text-align: right; padding: 3px;\" |'
            end
          end
         end
       end
       end
     end
     end
  end


    local track = 0
  if stations then
 
    for a, _ in pairs(stations) do
    if found == true then
      table.insert(sortStations, a)
      for a, b in pairs(stations) do
    end
        table.insert(sortStations, a)
    table.sort(sortStations)
      end
    for i, n in ipairs(sortStations) do
      table.sort(sortStations)
      stationString = stationString .. ' [[' .. n .. ']]'
      for i, n in ipairs(sortStations) do
      if (n ~= sortStations[#sortStations]) then
        stationString = stationString .. ' [[' .. n .. ']]'
        -- add a comma
        track = track + 1
        stationString = stationString .. ', '
        if track ~= count then -- Changed these line to produce comma if not last table.
          stationString = stationString .. ','
        end
       end
       end
      section = section .. stationString .. '\n'
    else
      section = section .. '|-\n| Created at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
     end
     end
    return sectionRow(title, stationString)
  else
    return sectionRow(title, L.t('N/A'))
   end
   end
end


  -- Is an ingredient at these tables
function generalSection(item, itemTable, craftingRecipes, args)
  if craftingRecipes.ingredients[item] ~= nil and #craftingRecipes.ingredients[item] >= 1 then
-- 'General' section header
    local count = 0
  section = sectionHeader('General')
    local stations = {}
    local sortStations = {}
    local stationString = ''
    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
              section = section .. '|-\n| Used At:\n| style=\"text-align: right; padding: 3px;\" |'
            end
          end
        end
      end
    end


     local track = 0
  -- 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


    if found == true then
  -- Is an ingredient at these tables
      for a, b in pairs(stations) do
  if craftingRecipes.ingredients[item] ~= nil and Utils.tableLen(craftingRecipes.ingredients[item]) >= 1 then
        table.insert(sortStations, a)
     section = section .. craftingSubSection('Used at', item, craftingRecipes.ingredients, craftingRecipes.recipes)
      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
      section = section .. stationString .. '\n'
     else
      section = section .. '|-\n| Used at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
    end
   end
   end


Line 243: Line 217:


   -- carried
   -- carried
   if args.carried ~= nil and args.carried ~= '' then
  local carried
    section = section .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. args.carried .. '\n'
   if args.carried ~= nil and args.carried ~= '' then carried = args.carried else carried = itemTable.carried end
   else
   section = section .. sectionRow('Carried in', carried)
    section = section .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.carried .. '\n'
  end


   -- weight
   -- weight
   if itemTable.weight ~= nil then
  local weight
    section = section .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | ' .. itemTable.weight .. ' kg\n'
   if itemTable.weight ~= nil then weight = itemTable.weight else weight = '0.0' end
   else
   section = section .. sectionRow('Weight', weight, nil, 'kg')
    section = section .. '|-\n| Weight:\n| style="text-align: right; padding: 3px;" | 0.00kg\n'
  end


   -- stack limit
   -- stack limit
   if itemTable.maxStack ~= nil then
   if itemTable.maxStack ~= nil then
     section = section .. '|-\n| Stack limit:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.maxStack .. '\n'
     section = section .. sectionRow('Stack limit', itemTable.maxStack)
   end
   end


   -- yield  
   -- yield  
   if itemTable.yield ~= nil then
   if itemTable.yield ~= nil then
     section = section .. '|-\n| Improve Gathering: \n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.yield .. '\n'
     section = section .. sectionRow('Improve Gathering', itemTable.yield)
   end
   end


   -- fuel
   -- fuel
   if itemTable.fuel ~= nil then
   if itemTable.fuel ~= nil then
     section = section .. '|-\n| Fuel energy:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuel .. ' J\n'
     section = section .. sectionRow('Fuel energy', itemTable.fuel, nil, 'W')
   end
   end


   -- currency
   -- currency
   if itemTable.currency ~= nil then
   if itemTable.currency ~= nil then
     section = section .. '|-\n| Used as Currency:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.currency .. '\n'
     section = section .. sectionRow('Used as Currency', itemTable.currency)
   end
   end
   return section
   return section
end
function sectionHeader(title, count)
  return "|- style=\"background-color: #4688C0; text-align: center;\"\n| colspan=\"2\" | '''" .. L.t(title, count) .. "'''\n"
end
end


Line 287: Line 253:


   -- item id (type)
   -- item id (type)
   section = section .. '|- 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)
   -- id number (type id)
   section = section .. '|- valign=\"center\"\n| ID Number:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.typeID .. '\n'
   section = section .. sectionRow('ID Number', itemTable.typeID)


   return section
   return section
Line 332: Line 298:
   section = sectionHeader('World Object')
   section = sectionHeader('World Object')
-- Object Placed Image
-- Object Placed Image
   local image = checkImage(itemImageName, 'Placed')
   section = section .. sectionImage(itemImageName, 'Placed')
  section = section .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'


   -- 'Placement' section
   -- 'Placement' section
Line 372: Line 337:


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


Line 498: Line 462:


   -- Object Placed Image
   -- Object Placed Image
   local image = checkImage(itemImageName, 'Placed')
   section = section .. sectionImage(itemImageName, 'Placed')
  section = section .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
   return section
   return section
end
end

Revision as of 15:38, 1 March 2021

Documentation

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

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.'
  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: '

  if itemTable.group == 'Food' then
    infobox = infobox .. '#85D66B;\"\n| colspan=\"2\" | \'\'\'Food\'\'\'\n'
    -- Items:Food Icon Image
    local image = checkImage(itemimagename, 'Icon')

    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'

  elseif itemTable.group == 'Skill Books' then
    infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items:Skill Book Icon Image
    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'

  elseif itemTable.group == 'Skill Scrolls' then
    infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items:Skill Scrolls Icon Image
    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'

  else
    infobox = infobox .. '#78B1FF;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
    -- Items: Other Icon Image
    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
      image = itemimagename .. '_Icon.png'
    elseif mw.title.makeTitle('File', itemimagename .. '_Icon.jpg').file.exists then
      image = itemimagename .. '_Icon.jpg'
    end
    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'
  end

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

  if itemTable.description == nil then
    infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'None\'\'\'\n'
  elseif itemTable.description == '' then
    infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'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 == 'Block Items' or itemTable.group == 'World Object Items' then
    infobox = infobox .. placementSection(itemTable, itemimagename)				

    -- Object Form Image
    if itemTable.group == '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 == '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 == 'Food' then
    section = section .. '|-\n| Calories:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.calories .. '\n|- valign=\"center\"\n| rowspan=\"4\" | Nutrients:\n'
    section = section .. '| style=\"color: red; text-align: right; padding: 3px;\" | Carbs: ' .. itemTable.carbs .. '\n'
    section = section .. '|- valign=\"center\"\n| style=\"color: orange; text-align: right; padding: 3px;\" | Protein: ' .. itemTable.protein .. '\n'
    section = section .. '|- valign=\"center\"\n| style=\"color: yellow; text-align: right; padding: 3px;\" | Fat: ' .. itemTable.fat .. '\n'
    section = section .. '|- valign=\"center\"\n| style=\"color: limegreen; text-align: right; padding: 3px;\" | Vitamins: ' .. itemTable.vitamins .. '\n'
    section = section .. '|-\n| Nutrition Density:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.density .. ' per 100 cals\n'
  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 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, 'W')
  end

  -- currency
  if itemTable.currency ~= nil then
    section = section .. sectionRow('Used as Currency', itemTable.currency)
  end
  return section
end

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

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

  -- id number (type id)
  section = section .. sectionRow('ID Number', itemTable.typeID)

  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 = bClean .. L.t('Tag')
      else
        tagLink = bClean:gsub(' ', '') .. L.t('Tag')
      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 .. '|-\n| Vehicle/Mobile Object:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.mobile .. '\n'
  end			

  --Dimensions 
  if itemTable.footprint ~= nil then
    section = section .. '|-\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
    section = section .. '|-\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
    section = section .. '|-\n| Room Required:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomContainReq .. '\n'
  end	

  --Room Size. Req.
  if itemTable.roomSizeReq ~= nil then
    section = section .. '|-\n| Room Size:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomSizeReq .. ' m³\n'
  end

  --Room Mat. Req.
  if itemTable.roomMatReq ~= nil then
    section = section .. '|-\n| Room Materials:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomMatReq .. '\n'
  end	
  return section
end

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

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

  --roomCategory
  section = section .. '|-\n| Room Category:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.roomCategory .. '[[Category:' .. itemTable.roomCategory .. ']]\n'

  if section.roomCategory ~= 'Industrial' then
    if section.furnitureType ~= nil then 
      --furnitureType
      section = section .. '|-\n| Furniture Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.furnitureType .. '[[Category:' .. itemTable.furnitureType .. ']]\n'

      --Value of the object
      section = section .. '|-\n| Value:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.skillValue .. '\n'

      --Dim. Return % of Object  
      section = section .. '|-\n| Dim. Return %:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.repeatsDepreciation .. '\n'    
    end
  end

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

  return section
end

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

  --Inventory Slots
  section = section .. '|-\n| Inventory Slots:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.inventorySlots .. '\n'

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

  return section
end


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

  --EngergyType 
  section = section .. '|-\n| Energy Type:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyType .. '[[Category:' .. itemTable.energyType .. ']]\n'

  --Grid Radius
  section = section .. '|-\n| Grid Radius:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.gridRadius .. ' m\n'

  --Energy Produced
  section = section .. '|-\n| Energy Produced:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyProduced .. 'W\n'

  --Energy Used
  section = section .. '|-\n| Energy Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyUsed .. 'W\n'	

  return section
end

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

  --Fuels Used by Object
  section = section .. '|-\n| Fuels Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuelsUsed .. '\n'

  return section
end

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

--Input (fludisUsed) 
  if itemTable.fluidsUsed ~= nil then
    section = section .. '|-\n| Input: \n| style=\"text-align: right; padding: 3px;\" | ' 
    if itemTable.fluidsUsed ~= nil then
      for a,b in ipairs(itemTable.fluidsUsed) do
        local acceptedType =  b[1]
        local cRateString = string.gsub(b[2], "%s+", "")
        local consumingRate = tonumber(cRateString)
        section = section .. acceptedType .. ' at ' .. consumingRate .. ' L'
        if (a ~= #itemTable.fluidsUsed) then
          section = section .. ', '
        end
      end
    end
    section = section .. '\n'
  end

--Output (liquidProduced)
  if itemTable.fluidsProduced ~= nil then
    section = section .. '|-\n| Output: \n| style=\"text-align: right; padding: 3px;\" | '
    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
      section = section .. producedType .. ' at ' .. producingRate .. ' L'
      if (a ~= #itemTable.fluidsProduced) then
        section = section .. ', '
      end
    end
    section = section .. '\n'
  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