Module:Infobox/sandbox: Difference between revisions

From Official Factorio Wiki
Jump to navigation Jump to search
(Moved parsing and util methods to separate module)
(Don't show technology or item vrows if the argument is exactly "none")
 
(One intermediate revision by the same user not shown)
Line 96: Line 96:
   ret[#ret+1] = p._row_unit  (frame, "Construction area",    args["construction-area"],    "tiles")
   ret[#ret+1] = p._row_unit  (frame, "Construction area",    args["construction-area"],    "tiles")
   ret[#ret+1] = p._row_simple(frame, "Pollution",            args["pollution"])
   ret[#ret+1] = p._row_simple(frame, "Pollution",            args["pollution"])
   ret[#ret+1] = p._row_unit  (frame, sa .. "Spoil time",     args["spoil-time"],            "minutes")
   ret[#ret+1] = p._row_unit  (frame, "Spoil time",           args["spoil-time"],            "minutes", sa)
   ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
   ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
   ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],              "slots")
   ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],              "slots")
Line 115: Line 115:
   ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
   ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
   ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",      args["used-as-fuel-by"])
   ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",      args["used-as-fuel-by"])
   ret[#ret+1] = p._vrow_item (frame, sa .. "Recyling results",args["recycling-results"])
   ret[#ret+1] = p._vrow_item (frame, "Recyling results",     args["recycling-results"], sa)
   ret[#ret+1] = p._extra    (frame,                          args["extra2"])
   ret[#ret+1] = p._extra    (frame,                          args["extra2"])


Line 217: Line 217:
   ret[#ret+1] = p._row_unit  (frame, "Construction area",    args["construction-area"],    "tiles")
   ret[#ret+1] = p._row_unit  (frame, "Construction area",    args["construction-area"],    "tiles")
   ret[#ret+1] = p._row_simple(frame, "Pollution",            args["pollution"])
   ret[#ret+1] = p._row_simple(frame, "Pollution",            args["pollution"])
   ret[#ret+1] = p._row_unit  (frame, sa .. "Spoil time",     args["spoil-time"],            "minutes")
   ret[#ret+1] = p._row_unit  (frame, "Spoil time",           args["spoil-time"],            "minutes", sa)
   ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
   ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
   ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],              "slots")
   ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],              "slots")
Line 236: Line 236:
   ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
   ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
   ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",      args["used-as-fuel-by"])
   ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",      args["used-as-fuel-by"])
   ret[#ret+1] = p._vrow_item (frame, sa .. "Recyling results",args["recycling-results"])
   ret[#ret+1] = p._vrow_item (frame, "Recyling results",     args["recycling-results"], sa)
   ret[#ret+1] = p._extra    (frame,                          args["extra2"])
   ret[#ret+1] = p._extra    (frame,                          args["extra2"])


Line 246: Line 246:
end
end


function p._row_simple(frame, label, arg)
function p._row_simple(frame, label, arg, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) then return end
    
    
   return p._row(frame, {label, arg})
   return p._row(frame, {label, arg}, label_prefix)
end
end


function p._row_unit(frame, label, arg, unit)
function p._row_unit(frame, label, arg, unit, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) then return end
    
    
   return p._row(frame, {label, arg, arg .. " " .. p._translate(frame, unit)})
   return p._row(frame, {label, arg, arg .. " " .. p._translate(frame, unit)}, label_prefix)
end
end


function p._row_type(frame, label, arg)
function p._row_type(frame, label, arg, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) then return end
    
    
   return p._row(frame, {label, arg, frame:expandTemplate{title = "Type", args = {arg}}})
   return p._row(frame, {label, arg, frame:expandTemplate{title = "Type", args = {arg}}}, label_prefix)
end
end


function p._row_item(frame, label, arg)
function p._row_item(frame, label, arg, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) then return end
    
    
   return p._row(frame, {label, arg, parsing._item(frame, arg)})
   return p._row(frame, {label, arg, parsing._item(frame, arg)}, label_prefix)
end
end


function p._vrow_item(frame, label, arg)
function p._vrow_item(frame, label, arg, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) or arg == "none" then return end
    
    
   return p._vrow(frame, {label, arg, parsing._item(frame, arg)})
   return p._vrow(frame, {label, arg, parsing._item(frame, arg)}, label_prefix)
end
end


function p._vrow_tech(frame, label, arg)
function p._vrow_tech(frame, label, arg, label_prefix)
   if util._empty_arg(arg) then return end
   if util._empty_arg(arg) or arg == "none" then return end
    
    
   return p._vrow(frame, {label, arg, parsing._technology(frame, {arg, color = "228B22"})})
   return p._vrow(frame, {label, arg, parsing._technology(frame, {arg, color = "228B22"})}, label_prefix)
end
end


function p._row(frame, args)
function p._row(frame, args, label_prefix)
   if util._empty_arg(args[2]) then
   if util._empty_arg(args[2]) then
     return
     return
Line 288: Line 288:


   local label = p._translate(frame, args[1])
   local label = p._translate(frame, args[1])
  if label_prefix then
    label = label_prefix .. label
  end


   return string.format(
   return string.format(
Line 302: Line 305:
end
end


function p._vrow(frame, args)
function p._vrow(frame, args, label_prefix)
   if util._empty_arg(args[2]) then
   if util._empty_arg(args[2]) then
     return
     return
Line 308: Line 311:


   local label = p._translate(frame, args[1])
   local label = p._translate(frame, args[1])
  if label_prefix then
    label = label_prefix .. label
  end


   return string.format(
   return string.format(

Latest revision as of 12:24, 25 October 2024

Documentation for this module may be created at Module:Infobox/sandbox/doc

local util = require("Module:Util")
local parsing = require("Module:Infobox/parsing")

local p = {}

function p.base_tab(frame) -- no prefix for args. Used for vanilla tab or if no tabs
  local args = frame:getParent().args
  local ret = {}
  local sa = frame:expandTemplate{title = "Space age"} .. " "

  if not util._empty_arg(args["recipe"]) then
    ret[#ret+1] = p._vrow(frame, {"Recipe",    args["recipe"], parsing._crafting(frame, args["recipe"])})
    ret[#ret+1] = p._vrow(frame, {"Total raw", args["recipe"], parsing._crafting_raw(frame, util._arg_or(args["total-raw"], args["recipe"]))})
  end

  if not util._empty_arg(args["cost"]) then
    local cost = parsing._item(frame, args["cost"]) .. ((not util._empty_arg(args["cost-multiplier"])) and "✖ <big>" .. args["cost-multiplier"] .. "</big>" or "")
    ret[#ret+1] = p._vrow(frame, {"Cost", args["cost"], cost})
  end

  ret[#ret+1] = p._extra     (frame,                          args["extra1"])
  
  if not util._empty_arg(args["map-color"]) then
    local color = frame:expandTemplate{title = 'Color', args = {args["map-color"]}}
    ret[#ret+1] = p._row(frame, {"Map color", args["map-color"], color})
  end

  ret[#ret+1] = p._row_simple(frame, "Map icon",              args["map-icon"])
  ret[#ret+1] = p._row_simple(frame, "Added in",              args["added-in"])
  ret[#ret+1] = p._row_simple(frame, "Walking speed",         args["walking-speed"])
  ret[#ret+1] = p._row_simple(frame, "Storage size",          args["storage-size"])
  ret[#ret+1] = p._row_simple(frame, "Fluid storage volume",  args["fluid-storage-volume"])

  if not util._empty_arg(args["expected-resources"]) then
    local label = p._translate(frame, "Expected resources")
    ret[#ret+1] = string.format(
[[<tr class="border-top">
<td>
%s
</td>
<td style="width: 70%%;">
%s
</td>
</tr>]], label, args["expected-resources"])
  end

  ret[#ret+1] = p._row_simple(frame, "Health",                args["health"])
  ret[#ret+1] = p._row_unit  (frame, "Restores",              args["restores"],             "health")
  ret[#ret+1] = p._row_simple(frame, "Resistances",           args["resistance"])
  ret[#ret+1] = p._row_unit  (frame, "Lifespan",              args["lifespan"],             "seconds")
  ret[#ret+1] = p._row_simple(frame, "Inventory size bonus",  args["inventory-size-bonus"])
  ret[#ret+1] = p._row_simple(frame, "Equipment grid size",   args["grid-size"])
  ret[#ret+1] = p._row_simple(frame, "Stack size",            args["stack-size"])
  ret[#ret+1] = p._row_simple(frame, "Range",                 args["range"])
  ret[#ret+1] = p._row_simple(frame, "Shooting speed",        args["shooting-speed"])
  ret[#ret+1] = p._row_simple(frame, "Damage",                args["damage"])
  ret[#ret+1] = p._row_simple(frame, "Damage bonus",          args["damage-bonus"])
  ret[#ret+1] = p._row_simple(frame, "Cluster size",          args["cluster-size"])
  ret[#ret+1] = p._row_simple(frame, "Area of effect size",   args["area-of-effect-size"])
  ret[#ret+1] = p._row_simple(frame, "Durability",            args["durability"])
  ret[#ret+1] = p._row_simple(frame, "Magazine size",         args["magazine-size"])
  ret[#ret+1] = p._row_item  (frame, "Ammunition",            args["ammunition"])
  ret[#ret+1] = p._vrow_item (frame, "Used as ammunition by", args["used-as-ammo-by"])
  ret[#ret+1] = p._row_simple(frame, "Efficiency",            args["efficiency"])
  ret[#ret+1] = p._row_simple(frame, "Dimensions",            args["dimensions"])
  ret[#ret+1] = p._row_type  (frame, "Energy consumption",    args["energy"])
  ret[#ret+1] = p._row_type  (frame, "Drain",                 args["drain"])
  ret[#ret+1] = p._row_type  (frame, "Robot recharge rate",   args["robot-recharge-rate"])
  ret[#ret+1] = p._row_type  (frame, "Internal buffer recharge rate", args["internal-buffer-recharge-rate"])
  ret[#ret+1] = p._vrow_item (frame, "Placed in",             args["equipped-in"])
  ret[#ret+1] = p._row_simple(frame, "Robot limit",           args["robot-limit"])
  ret[#ret+1] = p._row_simple(frame, "Repair speed",          args["repair-speed"])
  ret[#ret+1] = p._row_simple(frame, "Charging stations",     args["charging-stations"])
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])
  ret[#ret+1] = p._row_simple(frame, "Movement bonus",        args["movement-bonus"])
  ret[#ret+1] = p._row_type  (frame, "Energy capacity",       args["energy-capacity"])
  ret[#ret+1] = p._row_simple(frame, "Power input",           args["power-input"])
  ret[#ret+1] = p._row_simple(frame, "Power output",          args["power-output"])
  ret[#ret+1] = p._row_simple(frame, "Maximum temperature",   args["maximum-temperature"])
  ret[#ret+1] = p._row_simple(frame, "Fluid consumption",     args["fluid-consumption"])
  ret[#ret+1] = p._row_simple(frame, "Shield hitpoints",      args["shield"])
  ret[#ret+1] = p._row_type  (frame, "Energy per hitpoint",   args["energy-per-hitpoint"])
  ret[#ret+1] = p._row_simple(frame, "Maximum recharge speed",args["maximum-recharge-speed"])
  ret[#ret+1] = p._row_simple(frame, "Crafting speed",        args["crafting-speed"])
  ret[#ret+1] = p._row_simple(frame, "Pumping speed",         args["pumping-speed"])
  ret[#ret+1] = p._row_simple(frame, "Mining time",           args["mining-time"])
  ret[#ret+1] = p._row_simple(frame, "Speed",                 args["speed"])
  ret[#ret+1] = p._row_simple(frame, "Productivity",          args["productivity"])
  ret[#ret+1] = p._row_simple(frame, "Mining speed",          args["mining-speed"])
  ret[#ret+1] = p._row_unit  (frame, "Mining area",           args["mining-area"],           "tiles")
  ret[#ret+1] = p._row_type  (frame, "Fuel value",            args["fuel-value"])
  ret[#ret+1] = p._row_simple(frame, "Vehicle acceleration",  args["vehicle-acceleration"])
  ret[#ret+1] = p._row_simple(frame, "Vehicle top speed",     args["vehicle-top-speed"])
  ret[#ret+1] = p._row_unit  (frame, "Supply area",           args["supply-area"],           "tiles")
  ret[#ret+1] = p._row_unit  (frame, "Wire reach",            args["wire-reach"],            "tiles")
  ret[#ret+1] = p._row_unit  (frame, "Construction area",     args["construction-area"],     "tiles")
  ret[#ret+1] = p._row_simple(frame, "Pollution",             args["pollution"])
  ret[#ret+1] = p._row_unit  (frame, "Spoil time",            args["spoil-time"],            "minutes", sa)
  ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
  ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],               "slots")

  if not util._empty_arg(args["prototype-type"]) then
    local prototype_type = frame:expandTemplate{title = 'Prototype page', args = {args["prototype-type"]}}
    ret[#ret+1] = p._row(frame, {"Prototype type", args["prototype-type"], prototype_type})
  end
  ret[#ret+1] = p._row_simple(frame, "Internal name",         args["internal-name"])

  ret[#ret+1] = p._vrow_item (frame, "Accepted equipment",    args["equipment"])
  ret[#ret+1] = p._vrow_tech (frame, "Required technologies", args["required-technologies"])
  ret[#ret+1] = p._vrow_tech (frame, "Allows",                args["allows"])
  ret[#ret+1] = p._vrow_item (frame, "Effects",               args["effects"])
  ret[#ret+1] = p._vrow_tech (frame, "Boosting technologies", args["boosting-technologies"])
  ret[#ret+1] = p._vrow_item (frame, "Produced by",           args["producers"])
  ret[#ret+1] = p._vrow_item (frame, "Consumed by",           args["consumers"])
  ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
  ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",       args["used-as-fuel-by"])
  ret[#ret+1] = p._vrow_item (frame, "Recyling results",      args["recycling-results"], sa)
  ret[#ret+1] = p._extra     (frame,                          args["extra2"])

  return table.concat(ret)
end

function p.space_age_tab(frame) -- space-age prefix for some args. Used for space age mod tab
  local args = frame:getParent().args
  local ret = {}
  local sa = frame:expandTemplate{title = "Space age"} .. " "
  
  local recipe = util._arg_or(args["space-age-recipe"], args["recipe"])
  if not util._empty_arg(recipe) then
    ret[#ret+1] = p._vrow(frame, {"Recipe",    recipe, parsing._crafting(frame, recipe)})
    local vanilla_total_raw = util._arg_or(args["total-raw"], args["recipe"])
    ret[#ret+1] = p._vrow(frame, {"Total raw", recipe, parsing._crafting_raw(frame, util._arg_or(args["space-age-total-raw"],  util._arg_or(args["space-age-recipe"], vanilla_total_raw)))})
  end

  local cost_arg = util._arg_or(args["space-age-cost"], args["cost"])
  if not util._empty_arg(cost_arg) then
    local cost_multiplier_arg = util._arg_or(args["space-age-cost-multiplier"], args["cost-multiplier"])
    local cost = parsing._item(frame, cost_arg) .. ((not util._empty_arg(cost_multiplier_arg)) and "✖ <big>" .. cost_multiplier_arg .. "</big>" or "")
    ret[#ret+1] = p._vrow(frame, {"Cost", cost_arg, cost})
  end

  ret[#ret+1] = p._extra     (frame,                          args["extra1"])
  
  if not util._empty_arg(args["map-color"]) then
    local color = frame:expandTemplate{title = 'Color', args = {args["map-color"]}}
    ret[#ret+1] = p._row(frame, {"Map color", args["map-color"], color})
  end

  ret[#ret+1] = p._row_simple(frame, "Map icon",              args["map-icon"])
  ret[#ret+1] = p._row_simple(frame, "Added in",              args["added-in"])
  ret[#ret+1] = p._row_simple(frame, "Walking speed",         args["walking-speed"])
  ret[#ret+1] = p._row_simple(frame, "Storage size",          args["storage-size"])
  ret[#ret+1] = p._row_simple(frame, "Fluid storage volume",  args["fluid-storage-volume"])

  if not util._empty_arg(args["expected-resources"]) then
    local label = p._translate(frame, "Expected resources")
    ret[#ret+1] = string.format(
[[<tr class="border-top">
<td>
%s
</td>
<td style="width: 70%%;">
%s
</td>
</tr>]], label, args["expected-resources"])
  end

  ret[#ret+1] = p._row_simple(frame, "Health",                args["health"])
  ret[#ret+1] = p._row_unit  (frame, "Restores",              args["restores"],             "health")
  ret[#ret+1] = p._row_simple(frame, "Resistances",           args["resistance"])
  ret[#ret+1] = p._row_unit  (frame, "Lifespan",              args["lifespan"],             "seconds")
  ret[#ret+1] = p._row_simple(frame, "Inventory size bonus",  args["inventory-size-bonus"])
  ret[#ret+1] = p._row_simple(frame, "Equipment grid size",   args["grid-size"])
  ret[#ret+1] = p._row_simple(frame, "Stack size",            args["stack-size"])
  ret[#ret+1] = p._row_simple(frame, "Range",                 args["range"])
  ret[#ret+1] = p._row_simple(frame, "Shooting speed",        args["shooting-speed"])
  ret[#ret+1] = p._row_simple(frame, "Damage",                args["damage"])
  ret[#ret+1] = p._row_simple(frame, "Damage bonus",          args["damage-bonus"])
  ret[#ret+1] = p._row_simple(frame, "Cluster size",          args["cluster-size"])
  ret[#ret+1] = p._row_simple(frame, "Area of effect size",   args["area-of-effect-size"])
  ret[#ret+1] = p._row_simple(frame, "Durability",            args["durability"])
  ret[#ret+1] = p._row_simple(frame, "Magazine size",         args["magazine-size"])
  ret[#ret+1] = p._row_item  (frame, "Ammunition",            args["ammunition"])
  ret[#ret+1] = p._vrow_item (frame, "Used as ammunition by", args["used-as-ammo-by"])
  ret[#ret+1] = p._row_simple(frame, "Efficiency",            args["efficiency"])
  ret[#ret+1] = p._row_simple(frame, "Dimensions",            args["dimensions"])
  ret[#ret+1] = p._row_type  (frame, "Energy consumption",    args["energy"])
  ret[#ret+1] = p._row_type  (frame, "Drain",                 args["drain"])
  ret[#ret+1] = p._row_type  (frame, "Robot recharge rate",   args["robot-recharge-rate"])
  ret[#ret+1] = p._row_type  (frame, "Internal buffer recharge rate", args["internal-buffer-recharge-rate"])
  ret[#ret+1] = p._vrow_item (frame, "Placed in",             args["equipped-in"])
  ret[#ret+1] = p._row_simple(frame, "Robot limit",           args["robot-limit"])
  ret[#ret+1] = p._row_simple(frame, "Repair speed",          args["repair-speed"])
  ret[#ret+1] = p._row_simple(frame, "Charging stations",     args["charging-stations"])
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])
  ret[#ret+1] = p._row_simple(frame, "Movement bonus",        args["movement-bonus"])
  ret[#ret+1] = p._row_type  (frame, "Energy capacity",       args["energy-capacity"])
  ret[#ret+1] = p._row_simple(frame, "Power input",           args["power-input"])
  ret[#ret+1] = p._row_simple(frame, "Power output",          args["power-output"])
  ret[#ret+1] = p._row_simple(frame, "Maximum temperature",   args["maximum-temperature"])
  ret[#ret+1] = p._row_simple(frame, "Fluid consumption",     args["fluid-consumption"])
  ret[#ret+1] = p._row_simple(frame, "Shield hitpoints",      args["shield"])
  ret[#ret+1] = p._row_type  (frame, "Energy per hitpoint",   args["energy-per-hitpoint"])
  ret[#ret+1] = p._row_simple(frame, "Maximum recharge speed",args["maximum-recharge-speed"])
  ret[#ret+1] = p._row_simple(frame, "Crafting speed",        args["crafting-speed"])
  ret[#ret+1] = p._row_simple(frame, "Pumping speed",         args["pumping-speed"])
  ret[#ret+1] = p._row_simple(frame, "Mining time",           args["mining-time"])
  ret[#ret+1] = p._row_simple(frame, "Speed",                 args["speed"])
  ret[#ret+1] = p._row_simple(frame, "Productivity",          args["productivity"])
  ret[#ret+1] = p._row_simple(frame, "Mining speed",          args["mining-speed"])
  ret[#ret+1] = p._row_unit  (frame, "Mining area",           args["mining-area"],           "tiles")
  ret[#ret+1] = p._row_type  (frame, "Fuel value",            args["fuel-value"])
  ret[#ret+1] = p._row_simple(frame, "Vehicle acceleration",  args["vehicle-acceleration"])
  ret[#ret+1] = p._row_simple(frame, "Vehicle top speed",     args["vehicle-top-speed"])
  ret[#ret+1] = p._row_unit  (frame, "Supply area",           args["supply-area"],           "tiles")
  ret[#ret+1] = p._row_unit  (frame, "Wire reach",            args["wire-reach"],            "tiles")
  ret[#ret+1] = p._row_unit  (frame, "Construction area",     args["construction-area"],     "tiles")
  ret[#ret+1] = p._row_simple(frame, "Pollution",             args["pollution"])
  ret[#ret+1] = p._row_unit  (frame, "Spoil time",            args["spoil-time"],            "minutes", sa)
  ret[#ret+1] = p._row_simple(frame, "Weight",                args["weight"])
  ret[#ret+1] = p._row_unit  (frame, "Module slots",          args["modules"],               "slots")

  if not util._empty_arg(args["prototype-type"]) then
    local prototype_type = frame:expandTemplate{title = 'Prototype page', args = {args["prototype-type"]}}
    ret[#ret+1] = p._row(frame, {"Prototype type", args["prototype-type"], prototype_type})
  end
  ret[#ret+1] = p._row_simple(frame, "Internal name",         args["internal-name"])

  ret[#ret+1] = p._vrow_item (frame, "Accepted equipment",    args["equipment"])
  ret[#ret+1] = p._vrow_tech (frame, "Required technologies", util._arg_or(args["space-age-required-technologies"], args["required-technologies"]))
  ret[#ret+1] = p._vrow_tech (frame, "Allows",                util._arg_or(args["space-age-allows"], args["allows"]))
  ret[#ret+1] = p._vrow_item (frame, "Effects",               util._arg_or(args["space-age-effects"], args["effects"]))
  ret[#ret+1] = p._vrow_tech (frame, "Boosting technologies", args["boosting-technologies"])
  ret[#ret+1] = p._vrow_item (frame, "Produced by",           args["producers"])
  ret[#ret+1] = p._vrow_item (frame, "Consumed by",           util._arg_or(args["space-age-consumers"], args["consumers"]))
  ret[#ret+1] = p._vrow_item (frame, "Valid fuel",            args["valid-fuel"])
  ret[#ret+1] = p._vrow_item (frame, "Used as fuel by",       args["used-as-fuel-by"])
  ret[#ret+1] = p._vrow_item (frame, "Recyling results",      args["recycling-results"], sa)
  ret[#ret+1] = p._extra     (frame,                          args["extra2"])

  return table.concat(ret)
end

function p._translate(frame, str)
  return frame:expandTemplate{title = "Translation", args = {str}}
end

function p._row_simple(frame, label, arg, label_prefix)
  if util._empty_arg(arg) then return end
  
  return p._row(frame, {label, arg}, label_prefix)
end

function p._row_unit(frame, label, arg, unit, label_prefix)
  if util._empty_arg(arg) then return end
  
  return p._row(frame, {label, arg, arg .. " " .. p._translate(frame, unit)}, label_prefix)
end

function p._row_type(frame, label, arg, label_prefix)
  if util._empty_arg(arg) then return end
  
  return p._row(frame, {label, arg, frame:expandTemplate{title = "Type", args = {arg}}}, label_prefix)
end

function p._row_item(frame, label, arg, label_prefix)
  if util._empty_arg(arg) then return end
  
  return p._row(frame, {label, arg, parsing._item(frame, arg)}, label_prefix)
end

function p._vrow_item(frame, label, arg, label_prefix)
  if util._empty_arg(arg) or arg == "none" then return end
  
  return p._vrow(frame, {label, arg, parsing._item(frame, arg)}, label_prefix)
end

function p._vrow_tech(frame, label, arg, label_prefix)
  if util._empty_arg(arg) or arg == "none" then return end
  
  return p._vrow(frame, {label, arg, parsing._technology(frame, {arg, color = "228B22"})}, label_prefix)
end

function p._row(frame, args, label_prefix)
  if util._empty_arg(args[2]) then
    return
  end

  local label = p._translate(frame, args[1])
  if label_prefix then
    label = label_prefix .. label
  end

  return string.format(
[[<tr class="border-top">
<td>
%s
</td>
<td>
%s
</td>
</tr>]],
    label,
    args[3] or args[2])
end

function p._vrow(frame, args, label_prefix)
  if util._empty_arg(args[2]) then
    return
  end

  local label = p._translate(frame, args[1])
  if label_prefix then
    label = label_prefix .. label
  end

  return string.format(
[[<tr class="border-top">
<td colspan=2>
%s
</td>
</tr>
<tr>
<td class="infobox-vrow-value" colspan=2>
%s
</td>
</tr>]],
    label,
    args[3] or args[2])
end

function p._extra(frame, arg)
  if util._empty_arg(arg) then
    return
  end

  local label = p._translate(frame, arg)

  return string.format(
[[<tr class="border-top">
<td colspan=2 class="infobox-extra">
%s
</td>
</tr>]],
    label)
end

return p