Module:Infobox/sandbox: Difference between revisions
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
 More debugging  | 
				 Added research-speed  | 
				||
| (50 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
local util = require("Module:Util")  | |||
local parsing = require("Module:Infobox/parsing/sandbox")  | |||
local p = {}  | local p = {}  | ||
function p.  | function p.base_tab(frame) -- no prefix for args. Used for vanilla tab or if no tabs  | ||
   local args = frame.args  |   local args = frame:getParent().args  | ||
   if not 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  | |||
  if not util._empty_arg(args["technology-trigger"]) then  | |||
    ret[#ret+1] = p._vrow(frame, {"Researched by", args["technology-trigger"], parsing._technology_trigger(frame, args["technology-trigger"])})  | |||
  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  |    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">  | [[<tr class="border-top">  | ||
<td>  | <td>  | ||
%s  | %s  | ||
</td>  | </td>  | ||
<td>  | <td style="width: 70%%;">  | ||
%s  | %s  | ||
</td>  | </td>  | ||
</tr>]],  | </tr>]], label, args["expected-resources"])  | ||
  end  | |||
     args[  | |||
  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, "Rocket capacity",       args["rocket-capacity"], sa)  | |||
  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, "Science capacity",      args["science-capacity"])  | |||
  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, "Radar coverage distance",args["radar-coverage-distance"])  | |||
  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, "Rotation speed",        args["rotation-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection area",       args["asteroid-collection-area"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection arm speed",  args["asteroid-collection-arm-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection arm count",  args["asteroid-collection-arm-count"])  | |||
  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, "Heat output",           args["heat-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, "Research speed",        args["research-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, "Quality",               args["quality"], sa)  | |||
  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_simple(frame, "Resource drain",        args["resource-drain"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Science pack drain",    args["science-pack-drain"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Base productivity",     args["base-productivity"])  | |||
  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_item  (frame, "Buildable only on",     args["buildable-on"], sa)  | |||
  ret[#ret+1] = p._row_item  (frame, "Crafted only on",       args["crafted-on"], sa)  | |||
  ret[#ret+1] = p._row_simple(frame, "Spoil time",            args["spoil-time"], sa)  | |||
  ret[#ret+1] = p._row_item  (frame, "Spoil result",          args["spoil-result"], sa)  | |||
  ret[#ret+1] = p._row_simple(frame, "Weight",                args["vehicle-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, "Recycling results",     args["recycling-results"], sa)  | |||
  ret[#ret+1] = p._extra     (frame,                          args["extra2"])  | |||
  return table.concat(ret)  | |||
end  | end  | ||
function p.  | function p.space_age_tab(frame) -- space-age prefix for some args. Used for space age mod tab  | ||
   local args = frame.args  |    local args = frame:getParent().args  | ||
   if args[  |   local ret = {}  | ||
     local   |   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"])  | |||
  local tech_trigger_arg = util._arg_or(args["space-age-technology-trigger"], args["technology-trigger"])  | |||
  if not util._empty_arg(cost_arg) and cost_arg ~= "none" 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  | |||
  if not util._empty_arg(tech_trigger_arg) and tech_trigger_arg ~= "none" then  | |||
    ret[#ret+1] = p._vrow(frame, {"Researched by", tech_trigger_arg, parsing._technology_trigger(frame, tech_trigger_arg)})  | |||
  end  | |||
  ret[#ret+1] = p._extra     (frame,                          util._arg_or(args["space-age-extra1"], 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",          util._arg_or(args["space-age-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">  | [[<tr class="border-top">  | ||
<td   | <td>  | ||
%s  | %s  | ||
</td>  | </td>  | ||
<td style="width: 70%%;">  | |||
<td   | |||
%s  | %s  | ||
</td>  | </td>  | ||
</tr>]],  | </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",            util._arg_or(args["space-age-stack-size"], args["stack-size"]))  | |||
  ret[#ret+1] = p._row_simple(frame, "Rocket capacity",       args["rocket-capacity"], sa)  | |||
  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, "Science capacity",      args["science-capacity"])  | |||
  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, "Radar coverage distance",args["radar-coverage-distance"])  | |||
  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, "Rotation speed",        args["rotation-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection area",       args["asteroid-collection-area"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection arm speed",  args["asteroid-collection-arm-speed"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Collection arm count",  args["asteroid-collection-arm-count"])  | |||
  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, "Heat output",           args["heat-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, "Research speed",        args["research-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, "Quality",               args["quality"], sa)  | |||
  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_simple(frame, "Resource drain",        args["resource-drain"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Science pack drain",    args["science-pack-drain"])  | |||
  ret[#ret+1] = p._row_simple(frame, "Base productivity",     args["base-productivity"])  | |||
  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_item  (frame, "Buildable only on",     args["buildable-on"], sa)  | |||
  ret[#ret+1] = p._row_item  (frame, "Crafted only on",       args["crafted-on"], sa)  | |||
  ret[#ret+1] = p._row_simple(frame, "Spoil time",            args["spoil-time"], sa)  | |||
  ret[#ret+1] = p._row_item  (frame, "Spoil result",          args["spoil-result"], sa)  | |||
   ret[#ret+1] = p._row_simple(frame, "Weight",                args["vehicle-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  |    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",           util._arg_or(args["space-age-producers"], 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, "Recycling results",     args["recycling-results"], sa)  | |||
  ret[#ret+1] = p._extra     (frame,                          args["extra2"])  | |||
   return table.concat(ret)  |    return table.concat(ret)  | ||
end  | end  | ||
function p.  | function p._translate(frame, str)  | ||
   return frame:expandTemplate{title = "Translation", args = {str}}  | |||
   if   | end  | ||
function p._row_simple(frame, label, arg, label_prefix)  | |||
   if util._empty_arg(arg) or arg == "none" 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  | 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.  | 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   |    return p._vrow(frame, {label, arg, parsing._technology(frame, {arg, color = "228B22"})}, label_prefix)  | ||
end  | end  | ||
function p.  | function p._row(frame, args, label_prefix)  | ||
   if util._empty_arg(args[2]) then  | |||
     return  | |||
     return args[1]   |   end  | ||
  local label = p._translate(frame, args[1])  | |||
  if label_prefix then  | |||
    label = label_prefix .. label  | |||
   end  |    end  | ||
   return string.format(  | |||
[[<tr class="border-top">  | |||
<td>  | |||
%s  | |||
</td>  | |||
<td>  | |||
%s  | |||
</td>  | |||
</tr>]],  | |||
    label,  | |||
    args[3] or args[2])  | |||
end  | end  | ||
function p._vrow(frame, args, label_prefix)  | |||
   if util._empty_arg(args[2]) then  | |||
     return  | |||
function p.  | |||
   end  |    end  | ||
   local label = p._translate(frame, args[1])  | |||
  if label_prefix then  | |||
     label = label_prefix .. label  | |||
   local   | |||
   end  |    end  | ||
   return   |    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  | end  | ||
function p._extra(frame, arg)  | |||
   if util._empty_arg(arg) then  | |||
function p.  |      return  | ||
   if   | |||
     return   | |||
   end  |    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  | end  | ||
return p  | return p  | ||
Latest revision as of 16:16, 29 January 2025
Documentation for this module may be created at Module:Infobox/sandbox/doc
local util = require("Module:Util")
local parsing = require("Module:Infobox/parsing/sandbox")
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
  if not util._empty_arg(args["technology-trigger"]) then
    ret[#ret+1] = p._vrow(frame, {"Researched by", args["technology-trigger"], parsing._technology_trigger(frame, args["technology-trigger"])})
  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, "Rocket capacity",       args["rocket-capacity"], sa)
  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, "Science capacity",      args["science-capacity"])
  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, "Radar coverage distance",args["radar-coverage-distance"])
  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, "Rotation speed",        args["rotation-speed"])
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])
  ret[#ret+1] = p._row_simple(frame, "Collection area",       args["asteroid-collection-area"])
  ret[#ret+1] = p._row_simple(frame, "Collection arm speed",  args["asteroid-collection-arm-speed"])
  ret[#ret+1] = p._row_simple(frame, "Collection arm count",  args["asteroid-collection-arm-count"])
  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, "Heat output",           args["heat-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, "Research speed",        args["research-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, "Quality",               args["quality"], sa)
  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_simple(frame, "Resource drain",        args["resource-drain"])
  ret[#ret+1] = p._row_simple(frame, "Science pack drain",    args["science-pack-drain"])
  ret[#ret+1] = p._row_simple(frame, "Base productivity",     args["base-productivity"])
  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_item  (frame, "Buildable only on",     args["buildable-on"], sa)
  ret[#ret+1] = p._row_item  (frame, "Crafted only on",       args["crafted-on"], sa)
  ret[#ret+1] = p._row_simple(frame, "Spoil time",            args["spoil-time"], sa)
  ret[#ret+1] = p._row_item  (frame, "Spoil result",          args["spoil-result"], sa)
  ret[#ret+1] = p._row_simple(frame, "Weight",                args["vehicle-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, "Recycling 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"])
  local tech_trigger_arg = util._arg_or(args["space-age-technology-trigger"], args["technology-trigger"])
  if not util._empty_arg(cost_arg) and cost_arg ~= "none" 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
  if not util._empty_arg(tech_trigger_arg) and tech_trigger_arg ~= "none" then
    ret[#ret+1] = p._vrow(frame, {"Researched by", tech_trigger_arg, parsing._technology_trigger(frame, tech_trigger_arg)})
  end
  ret[#ret+1] = p._extra     (frame,                          util._arg_or(args["space-age-extra1"], 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",          util._arg_or(args["space-age-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",            util._arg_or(args["space-age-stack-size"], args["stack-size"]))
  ret[#ret+1] = p._row_simple(frame, "Rocket capacity",       args["rocket-capacity"], sa)
  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, "Science capacity",      args["science-capacity"])
  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, "Radar coverage distance",args["radar-coverage-distance"])
  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, "Rotation speed",        args["rotation-speed"])
  ret[#ret+1] = p._row_simple(frame, "Belt speed",            args["belt-speed"])
  ret[#ret+1] = p._row_simple(frame, "Collection area",       args["asteroid-collection-area"])
  ret[#ret+1] = p._row_simple(frame, "Collection arm speed",  args["asteroid-collection-arm-speed"])
  ret[#ret+1] = p._row_simple(frame, "Collection arm count",  args["asteroid-collection-arm-count"])
  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, "Heat output",           args["heat-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, "Research speed",        args["research-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, "Quality",               args["quality"], sa)
  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_simple(frame, "Resource drain",        args["resource-drain"])
  ret[#ret+1] = p._row_simple(frame, "Science pack drain",    args["science-pack-drain"])
  ret[#ret+1] = p._row_simple(frame, "Base productivity",     args["base-productivity"])
  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_item  (frame, "Buildable only on",     args["buildable-on"], sa)
  ret[#ret+1] = p._row_item  (frame, "Crafted only on",       args["crafted-on"], sa)
  ret[#ret+1] = p._row_simple(frame, "Spoil time",            args["spoil-time"], sa)
  ret[#ret+1] = p._row_item  (frame, "Spoil result",          args["spoil-result"], sa)
  ret[#ret+1] = p._row_simple(frame, "Weight",                args["vehicle-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",           util._arg_or(args["space-age-producers"], 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, "Recycling 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) or arg == "none" 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