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]
No edit summary
(Fat Colour change)
(19 intermediate revisions by 2 users not shown)
Line 6: Line 6:


-- 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 item = args.name
  local itemTable = itemData.items[item]
    local itemTable = itemData.items[item]


  if itemTable == nil then
    if itemTable == nil then
    return item .. ' could not be found in Module:ItemData.'
        return item .. ' could not be found in Module:ItemData.'
  end
    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
    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'
     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


  elseif itemTable.group == 'Skill Books' then
     infobox = infobox .. text_colour .. ';\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
     infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
     local icon = Utils.build_icon(item)
     -- Items:Skill Book Icon Image
     infobox = infobox .. '|-\n| colspan=\"2\" style=\"padding: 10px;\" | '..icon .. '\n'
     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
     -- 'Description' section header
     infobox = infobox .. '#FFCF4D;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
     infobox = infobox .. sectionHeader('Description')
    -- 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
    if itemTable.description == nil or itemTable.description == '' then
    infobox = infobox .. '#78B1FF;\"\n| colspan=\"2\" | \'\'\'' .. itemTable.group .. '\'\'\'\n'
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | \'\'\'' .. L.t('None') .. '\'\'\'\n'
     -- Items: Other Icon Image
     else
    local image = 'NoImage.png|link=https://wiki.play.eco/index.php?title=Special:Upload&wpDestFile=' .. itemimagename .. '_Icon.png|[[Category:Pages_with_missing_icon]]'
        infobox = infobox .. '|- style=\"text-align: center;\"\n| colspan=\"2\" | ' .. itemTable.description .. '\n'
    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
     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
    --Crafting
  infobox = infobox .. sectionHeader('Description')
    local craftingRecipes = mw.loadData("Module:CraftingRecipes")


  if itemTable.description == nil then
     infobox = infobox .. generalSection(item, itemTable, craftingRecipes, args)
     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
    infobox = infobox .. IDsSection(itemTable)
  local craftingRecipes = mw.loadData( "Module:CraftingRecipes" )


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


  -- Tags Header
    -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
  if itemTable.tagGroups ~= nil and itemTable.tagGroups ~= {} then
    if itemTable.group == L.t('Block Items') or itemTable.group == L.t('World Object Items') then
    infobox = infobox .. tagSection(itemTable, itemData)
        infobox = infobox .. placementSection(itemTable, itemimagename)
  end


  -- 'Item' World Object header (if itemTable.group = Placeable or Blocks)
        -- Object Form Image
  if itemTable.group == 'Block Items' or itemTable.group == 'World Object Items' then
        if itemTable.group == L.t('Block Items') then
    infobox = infobox .. placementSection(itemTable, itemimagename)
            infobox = infobox .. objectFormSection(itemTable, itemimagename)
        end
 
        -- 'Housing' section (if there is a Room Category)
        if itemTable.roomCategory ~= nil then
            infobox = infobox .. housingSection(itemTable)
        end


    -- Object Form Image
        -- 'Storage' Section (if inventorySlots is not nil)
    if itemTable.group == 'Block Items' then
        if itemTable.inventorySlots ~= nil then
      infobox = infobox .. objectFormSection(itemTable, itemimagename)
            infobox = infobox .. storageSection(itemTable)
    end
        end


    -- 'Housing' section (if there is a Room Category)
        -- 'Power' section (if EngeryType is ``not nil)
    if itemTable.roomCategory ~= nil then
        if itemTable.energyType ~= nil then
      infobox = infobox .. housingSection(itemTable)
            infobox = infobox .. powerSection(itemTable)
    end


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


    -- 'Power' section (if EngeryType is ``not nil)
        -- 'Fuel' Section (if fuelsUsed by Object)
    if itemTable.energyType ~= nil then
        if itemTable.fuelsUsed ~= nil then
      infobox = infobox .. powerSection(itemTable)
            infobox = infobox .. fuelsSection(itemTable)
        end


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


     -- 'Fuel' Section (if fuelsUsed by Object)
     -- Road Object header (if group == Road Items)
     if itemTable.fuelsUsed ~= nil then
     if itemTable.group == L.t('Road Items') then
      infobox = infobox .. fuelsSection(itemTable)
        infobox = infobox .. roadItemsSection(itemTable, itemimagename)
     end
     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


    -- 'Fluid' section (if fludisUsed is not nil)  
function sectionRow(label, content, count, unit)
     if itemTable.fluidsUsed ~= nil or itemTable.fluidsProduced ~= nil then
     if unit ~= nil then
      infobox = infobox .. fluidsSection(itemTable)
        content = tonumber(content)
        unit = L.t(unit, content)
        local lang = mw.getContentLanguage()
        content = lang:formatNum(content)
    else
        unit = ''
     end
     end
  end
    return '|-\n| ' .. L.t(label, count) .. ':\n| style=\"text-align: right; padding: 3px;\" | ' .. content .. unit .. '\n'
end


  -- Road Object header (if group == Road Items)
function sectionImage(imageName, suffix)
  if itemTable.group == 'Road Items' then
     local image = checkImage(imageName, suffix)
     infobox = infobox .. roadItemsSection(itemTable, itemimagename)
    return '|-\n| colspan=\"2\" style=\"padding: 10px;\" | [[File:' .. image .. '|center|border|240px]]\n'
  end
  infobox = infobox .. '|}'
  return infobox
end
end


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


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


function generalSection(itemTable, craftingRecipes)
local function craftingSubSection(title, item, productsOrIngredients, recipes)
-- 'General' section header
  section = sectionHeader('General')
 
  local recipes = craftingRecipes.recipes
 
 
  -- Is a product at these tables
  if craftingRecipes.products[item] ~= nil and #craftingRecipes.products[item] >= 1 then
    local count = 0
     local stations = {}
     local stations = {}
     local sortStations = {}
     local sortStations = {}
     local stationString = ''
     local stationString = ''
    local found = false
     for _, recipeName in ipairs(productsOrIngredients[item]) do
     for k, v in ipairs( craftingRecipes.products[item] ) do
        local currentRecipe = recipes[recipeName]
      if recipes[v] ~= nil then
        if currentRecipe ~= nil then
        for num = 1, #recipes[v].numberOfVariants do
            if currentRecipe.variants[recipeName] ~= nil then
          if (recipes[v].variants[v] ~= nil and recipes[v].numberOfVariants <= tostring(1)) then
                local currentStation = currentRecipe.craftStn[1][1]
            if setNotContains(stations, recipes[v].craftStn[1][1]) then
                if setNotContains(stations, currentStation) then
              addToSet(stations, recipes[v].craftStn[1][1])
                    addToSet(stations, currentStation)
              count = count + 1
                end
            end
            if found == false then
              found = true
              infobox = infobox .. '|-\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
        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
      end
        table.sort(sortStations)
      infobox = infobox .. stationString .. '\n'
        for i, n in ipairs(sortStations) do
    else
            stationString = stationString .. ' [[' .. n .. ']]'
      infobox = infobox .. '|-\n| Created at:\n| style=\"text-align: right; padding: 3px;\" | N/A\n'
            if (n ~= sortStations[#sortStations]) then
    end
                -- add a comma
  end
                stationString = stationString .. ', '
 
  -- Is an ingredient at these tables
  if craftingRecipes.ingredients[item] ~= nil and #craftingRecipes.ingredients[item] >= 1 then
    local count = 0
    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
              infobox = infobox .. '|-\n| Used At:\n| style=\"text-align: right; padding: 3px;\" |'
             end
             end
          end
         end
         end
      end
        return sectionRow(title, stationString)
    else
        return sectionRow(title, L.t('N/A'))
     end
     end
end


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


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


  -- calories and nutrients (if itemTable.group == 'Food')
     -- Is an ingredient at these tables
  if itemTable.group == 'Food' then
     if craftingRecipes.ingredients[item] ~= nil and Utils.tableLen(craftingRecipes.ingredients[item]) >= 1 then
     infobox = infobox .. '|-\n| Calories:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.calories .. '\n|- valign=\"center\"\n| rowspan=\"4\" | Nutrients:\n'
        section = section .. craftingSubSection('Used at', item, craftingRecipes.ingredients, craftingRecipes.recipes)
     infobox = infobox .. '| style=\"color: red; text-align: right; padding: 3px;\" | Carbs: ' .. itemTable.carbs .. '\n'
     end
    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
    -- calories and nutrients (if itemTable.group == 'Food')
  if args.carried ~= nil and args.carried ~= '' then
    if itemTable.group == L.t('Food') then
    infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. args.carried .. '\n'
        section = section .. sectionRow('Calorie', itemTable.calories, tonumber(itemTable.calories), 'cal')
  else
        section = section .. '|- valign=\"center\"\n| rowspan=\"4\" | ' .. L.t('Nutrients') .. ':\n'
    infobox = infobox .. '|-\n| Carried in:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.carried .. '\n'
        section = section .. '| style=\"color: red; text-align: right; padding: 3px;\" | ' .. L.t('Carbs') .. ': ' .. itemTable.carbs .. '\n'
  end
        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


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


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


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


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


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


function sectionHeader(title, count)
    -- currency
  return [[|- style="background-color: #4688C0; text-align: center;"\n| colspan="2" | \'\'\']] .. L.t(title, count) .. [[\'\'\'\n]]
    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
end


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


  -- 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
end
end


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


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


  return section
    return section
end
end


function placementSection(itemTable, itemImageName)
function placementSection(itemTable, itemImageName)
  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
  --Placement Header
    --Placement Header
  section = section .. sectionHeader('Placement')
    section = section .. sectionHeader('Placement')


  --Vechile
    --Vechile
  if itemTable.mobile ~= nil then
    if itemTable.mobile ~= nil then
    section = section .. '|-\n| Vehicle/Mobile Object:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.mobile .. '\n'
        section = section .. sectionRow('Vehicle/Mobile Object', itemTable.mobile)
  end
    end


  --Dimensions  
    --Dimensions
  if itemTable.footprint ~= nil then
    if itemTable.footprint ~= nil then
    section = section .. '|-\n| Dimensions (X,Y,Z):\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.footprint .. '\n'
        section = section .. sectionRow('Dimensions (X,Y,Z)', itemTable.footprint)
  end
    end


  --Material Tier
    --Material Tier
  if itemTable.materialTier ~= nil or itemTable.materialTier == 0 then
    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'
        section = section .. sectionRow('Room Material', itemTable.materialTier) .. '[[Category:Tier ' .. itemTable.materialTier .. ']]\n'
  end
    end


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


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


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


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


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


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


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


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


      --Dim. Return % of Object
            --Dim. Return % of Object
      section = section .. '|-\n| Dim. Return %:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.repeatsDepreciation .. '\n'  
            section = section .. sectionRow('Dim. Return %', itemTable.repeatsDepreciation * 100, nil, '%')
        end
     end
     end
  end


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


  return section
    return section
end
end


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


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


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


  return section
    return section
end
end


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


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


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


  --Energy Produced
    --Energy Produced
  section = section .. '|-\n| Energy Produced:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyProduced .. 'W\n'
    section = section .. sectionRow('Energy Produced', itemTable.energyProduced, nil, 'w')


  --Energy Used
    --Energy Used
  section = section .. '|-\n| Energy Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.energyUsed .. 'W\n'
    section = section .. sectionRow('Energy Used', itemTable.energyUsed, nil, 'w')


  return section
    return section
end
end


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


  --Fuels Used by Object
    --Fuels Used by Object
  section = section .. '|-\n| Fuels Used:\n| style=\"text-align: right; padding: 3px;\" | ' .. itemTable.fuelsUsed .. '\n'
    section = section .. sectionRow('Fuels Used', '[[' .. L.t('%s Tag'):format(itemTable.fuelsUsed:gsub('[%[%]]+', '')) .. ']]')


  return section
    return section
end
end


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


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


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


return section
    return section
end
end


function roadItemsSection(itemTable, itemImageName)
function roadItemsSection(itemTable, itemImageName)
  section = sectionHeader('Road Object')
    section = sectionHeader('Road 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'
    return section
  return section
end
end


function checkImage(imageName, suffix)
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()..']]'
    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
    if mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.png').file.exists then
    image = imageName .. '_'..suffix..'.png'
        image = imageName .. '_' .. suffix .. '.png'
  elseif mw.title.makeTitle('File', imageName .. '_'..suffix..'.jpg').file.exists then
    elseif mw.title.makeTitle('File', imageName .. '_' .. suffix .. '.jpg').file.exists then
    image = imageName .. '_'..suffix..'.jpg'
        image = imageName .. '_' .. suffix .. '.jpg'
  end
    end
  return image
    return image
end
end


-- Main entry point for the Module
-- Main entry point for the Module
function p.ItemMain(frame)
function p.ItemMain(frame)
  -- 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 = mw.loadData( "Module:ItemData" )
    local itemData = mw.loadData("Module:ItemData")
  return itemBox( args, itemData )
    return itemBox(args, itemData)
end
end


return p
return p

Revision as of 12:38, 30 April 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: '

    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
    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)

    -- 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 = 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