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:RecipeTable: Difference between revisions

From Eco - English Wiki
[checked revision][checked revision]
No edit summary
No edit summary
Line 2: Line 2:
local p = {}
local p = {}


local Utils = require("Module:Utils")
local L = require("Module:Localization")
local L = require("Module:Localization")


-- Header for the wikitable
-- Header for the wikitable
function header(args)
function header( args )
     local headerStr = '{| class=\"wikitable mw-collapsible\" style=\"text-align: center;\"\n|-\n'
     local headerStr = '{| class=\"wikitable mw-collapsible\" style=\"text-align: center;\"\n|-\n'


Line 13: Line 12:
         headerStr = headerStr .. '! ' .. L.t('Crafting Station') .. ' !'
         headerStr = headerStr .. '! ' .. L.t('Crafting Station') .. ' !'
     end
     end
    -- Item, Level Needed, Materials, Crafting Time, Labour Cost and XP Gained Specialty
-- Item, Level Needed, Materials, Crafting Time, Labour Cost and XP Gained Specialty
    headerStr = headerStr .. '! colspan=\"4\" | ' .. L.t('Item') .. ' !! colspan=\"4\" | ' .. L.t('Materials') .. ' !! ' .. L.t('Level Needed') .. ' !! ' .. L.t('Crafting Time<br>(mins)') .. ' !! ' .. L.t('Labour Cost') .. ' || ' .. L.t('XP Gained') .. ' !!\n'
    headerStr = headerStr .. '! colspan=\"4\" | ' .. L.t('Item') .. ' !! colspan=\"4\" | ' .. L.t('Materials') .. ' !! ' .. L.t('Level Needed') .. ' !! ' .. L.t('Crafting Time<br>(mins)') .. ' !! ' .. L.t('Labour Cost') .. ' || ' .. L.t('XP Gained') .. ' !!\n'
     return headerStr
     return headerStr
end
end


function imagedisp(name, nameEN, style, borderColour)
function imagedisp( name, nameEN, style, borderColour )
    local str = ''
 
    if name then
        name = string.gsub(name, '.skillbook', 'skillbook')
    end
     local borderImageClass = ''
     local borderImageClass = ''
    if borderColour == 'green' then
        if borderColour == 'green' then
        borderImageClass = ' borderGreen'
            borderImageClass = ' borderGreen'
    elseif borderColour == 'yellow' then
        elseif borderColour == 'yellow' then
        borderImageClass = ' borderYellow'
            borderImageClass = ' borderYellow'
     end
     end


     local iconBG
     local iconClass = 'iconRecipe'
     if style == 'tag' then
     if style == 'tag' then
         iconBG = 'iconWhite'
         iconClass = 'iconRecipe iconWhite'
         name = name .. L.t('Tag')
         name = name .. L.t('Tag')
         nameEN = nameEN .. 'Tag'
         nameEN = nameEN .. 'Tag'
     elseif style == 'skill' then
     elseif style == 'skill' then
         iconBG = 'iconBrightBlue'
         iconClass = 'iconRecipe iconBrightBlue'
     end
     end
 
 
     return Utils.build_icon(name, 'iconRecipe', iconBG, borderImageClass, true)
     -- Manual override for image file
    if nameEN then
        image = string.gsub(nameEN, ' ', '') .. '_Icon.png'
else
image = 'NoImage.png'
end
str = str .. '<div class="iconContainer" style="width:64px; height:64px"><div class="iconStack">[[File:' .. image .. '|frameless|class='..iconClass..'|link=' .. name ..']]</div><div class="iconBorder' .. borderImageClass .. '" style=\"position:absolute;\"></div></div>\n[[' .. name .. ']]'
return str
end
end


function stationcell(args)
function stationcell( args )
    local str = ''
  local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[2])
str = str .. '| ' .. imagedisp(args[1],args[2])
    return str
return str
end
end


function itemcell(args)
function itemcell( args )
    local str = ''
local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3])
str = str .. '| ' .. imagedisp(args[1],args[3])
    str = str .. '<br>x' .. args[2] .. '\n'
str = str .. '<br>x' .. args[2] .. '\n'
    return str
return str
end
end


function ingredientcell(args)
function ingredientcell( args )
    local str = ''
local str = ''
    local borderColour
        local borderColour
    if args[4] == 'False' then
        if args[4] == 'False' then
        borderColour = 'green'
            borderColour = 'green'
    elseif args[4] == 'True' then
        elseif args[4] == 'True' then
        borderColour = 'yellow'
            borderColour = 'yellow'
    end
        end
    if args[1] == 'TAG' then
if args[1] == 'TAG' then
        style = 'tag'
            style = 'tag'
    else
        else
        style = nil
            style = nil
    end
        end
    return str .. '| ' .. imagedisp(args[2], args[5], style, borderColour) .. '<br>x' .. args[3] .. '\n'
return str .. '| ' .. imagedisp(args[2], args[5], style, borderColour) .. '<br>x' .. args[3] .. '\n'
end
end


function skillreqcell(args)
function skillreqcell( args )
     local str = ''
     local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3], 'skill')
str = str .. '| ' .. imagedisp(args[1],args[3], 'skill')
    str = str .. '<br> ' .. L.t('Level') .. ' ' .. args[2] .. ' \n'
str = str .. '<br> ' .. L.t('Level') .. ' ' .. args[2] .. ' \n'
    return str
return str
end
end


 
-- Does this even exist anymore?
-- Does this even exist anymore?
--function groupedskillcell( args )
--function groupedskillcell( args )
Line 86: Line 98:


-- Create a wikitable of recipes
-- Create a wikitable of recipes
function p.main(recipes)
function p.main( recipes )
     local rows = ''
     local rows = ''
 
     -- Get each row
     -- Get each row
     for i = 1, #recipes do
     for i = 1, #recipes do
        -- get information from the current recipe for building
-- get information from the current recipe for building
        local checkImage = recipes[i].checkImage
local checkImage = recipes[i].checkImage
        local craftStn = recipes[i].craftStn
local craftStn = recipes[i].craftStn
        local skillNeeds = recipes[i].skillNeeds
local skillNeeds = recipes[i].skillNeeds
        --use last variant as this is always the default variant
--use last variant as this is always the default variant
        local numberOfVariants = recipes[i].numberOfVariants
local numberOfVariants = recipes[i].numberOfVariants
        local products = { { '', '', '' } }
local products = {{'','',''}}
        local ingredients = { { '', '' } }
local ingredients = {{'',''}}
 
        --loop through variants to select default variant ingredients
--loop through variants to select default variant ingredients
        for k, v in pairs(recipes[i].variants) do
for k, v in pairs(recipes[i].variants) do
            --given pairs doesn't guarantee order, check that product matches default variant
--given pairs doesn't guarantee order, check that product matches default variant
            if k == recipes[i].defaultVariant then
if k == recipes[i].defaultVariant then
                ingredients = v.ingredients
ingredients = v.ingredients
                products = v.products
products = v.products
            end
end
        end
end
        local baseCraftTime = recipes[i].baseCraftTime
local baseCraftTime = recipes[i].baseCraftTime
        local baseLaborCost = recipes[i].baseLaborCost
local baseLaborCost = recipes[i].baseLaborCost
        local baseXPGain = recipes[i].baseXPGain
local baseXPGain = recipes[i].baseXPGain
 
        -- determine the size needed for products to display correctly
-- determine the size needed for products to display correctly
        local ingrednum = #ingredients
local ingrednum = #ingredients
        local rowspan = '|'
local rowspan = '|'
        local rowspanProducts = '|'
local rowspanProducts = '|'
 
        --Code to incorporate rowspan for ingrediants and variants here
--Code to incorporate rowspan for ingrediants and variants here
        local rowspanCount = 0
local rowspanCount = 0
 
        --accomodate both variants and multiple ingredients
 
        if ingrednum > 4 then
            rowspanCount = rowspanCount + 2
        end
        --suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
        if (#recipes == 1) then
            --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
            if tonumber(recipes[i].numberOfVariants) > 1 then
                rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end
        if rowspanCount > 0 then
            rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
            if (#recipes > 1) then
                rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
            else
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end
 
        -- String to return
        local row = '|-\n'
 
        -- Add new row if products or ingredients are passed in with at least 1 item
        if (products[1] and ingredients[1]) then
 
            -- Show or hide the Crafting Station column
            if recipes[i].dispCraftStn == '1' then
                row = row .. rowspan .. stationcell({ craftStn[1][1], craftStn[1][2] }) .. '\n'
            end
 
            -- Add the products columns
            local prodnum = #products
            for a = 1, prodnum do
                if prodnum == 1 then
                    row = row .. rowspanProducts .. ' colspan=\"4\" '
                end
                if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
                    row = row .. rowspanProducts .. ' colspan=\"2\" '
                end
                row = row .. itemcell({ products[a][1], products[a][2], products[a][3] })
                if (tonumber(numberOfVariants) > 1) then
                    row = row .. '<i>' .. L.t('Has Variants') .. '</i> \n'
                end
            end
 
            -- Add the FIRST row of Ingredients column
            local numing = ingrednum
            if ingrednum > 4 then
                numing = 4
            end
            for b = 1, numing do
                if (ingrednum == 1) then
                    row = row .. '| colspan=\"4\" '
                end
                if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                    row = row .. '| colspan=\"2\" '
                end
                row = row .. ingredientcell(ingredients[b])
            end
 
            -- Add the Skill needed column
            if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
                row = row .. rowspan .. skillreqcell({ skillNeeds[1][1], skillNeeds[1][2], skillNeeds[1][3] })
            else
                row = row .. rowspan
                if ingrednum > 4 then
                    row = row .. '|'
                end
                row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
            end
 
            -- Add the Crafting time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseCraftTime then
                row = row .. baseCraftTime .. '\n'
            else
 
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
 
            -- Add the Labour time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseLaborCost then
                row = row .. baseLaborCost .. '\n'
            else
 
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
 
            -- Add the XP gain column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseXPGain then
                row = row .. baseXPGain .. '\n'
            else
 
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
 
            -- Add the SECOND row of ingredients to ingredients column if applicable
            if ingrednum > 4 then
                row = row .. '|-\n'
                for b = 5, ingrednum do
                    if (ingrednum == 5) then
                        row = row .. '| colspan=\"4\" '
                    end
                    if ((ingrednum == 6) or (ingrednum == 7 and b == 6)) then
                        row = row .. '| colspan=\"2\" '
                    end
                    row = row .. ingredientcell(ingredients[b])
                end
            end
 
            rows = rows .. row
        end


        --Show variants in table if only 1 recipe in list
--accomodate both variants and multiple ingredients
        if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
            for k, v in pairs(recipes[i].variants) do
if ingrednum > 4 then
                --start new row for variants
rowspanCount = rowspanCount + 2
                row = '|-\n'
end
                --Skip default variant
--suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
                if v.products[1][1] ~= recipes[i].defaultVariant then
if(#recipes == 1) then --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
                    local prodnum = #products
if tonumber(recipes[i].numberOfVariants) > 1 then
                    for a = 1, prodnum do
rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
                        if prodnum == 1 then
rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
                            row = row .. rowspanProducts .. ' colspan=\"4\" '
end
                        end
end
                        if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
if rowspanCount > 0 then
                            row = row .. rowspanProducts .. ' colspan=\"2\" '
rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
                        end
if(#recipes > 1) then
                        row = row .. itemcell({ v.products[a][1], v.products[a][2], v.products[a][3] })
rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
                    end
else
rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
end
end
-- String to return
local row = '|-\n'
-- Add new row if products or ingredients are passed in with at least 1 item
if (products[1] and ingredients[1]) then
     
-- Show or hide the Crafting Station column
if recipes[i].dispCraftStn == '1' then
row = row .. rowspan .. stationcell({craftStn[1][1],craftStn[1][2]}) .. '\n'
end
       
-- Add the products columns
local prodnum = #products
for a = 1, prodnum do
if prodnum == 1 then
row = row .. rowspanProducts .. ' colspan=\"4\" '
end
if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
row = row .. rowspanProducts .. ' colspan=\"2\" '
end
row = row .. itemcell({products[a][1], products[a][2], products[a][3]})
if (tonumber(numberOfVariants) > 1) then
row = row .. '<i>' .. L.t('Has Variants') .. '</i> \n'
end
end
-- Add the FIRST row of Ingredients column
local numing = ingrednum
if ingrednum > 4 then
numing = 4
end
for b = 1, numing do
if (ingrednum == 1) then
row = row .. '| colspan=\"4\" '
end
if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
row = row .. '| colspan=\"2\" '
end
row = row .. ingredientcell(ingredients[b])
end


                    --will need to cycle ingrediants to fill out complete table
-- Add the Skill needed column
                    --row = row .. itemcell({v.products[1][1], v.products[1][2]})
if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
                    local numing = ingrednum
row = row .. rowspan .. skillreqcell({skillNeeds[1][1], skillNeeds[1][2],skillNeeds[1][3]})
                    if ingrednum > 4 then
else
                        numing = 4
row = row .. rowspan
                    end
if ingrednum > 4 then
                    for b = 1, numing do
row = row .. '|'
                        if (ingrednum == 1) then
end
                            row = row .. '| colspan=\"4\" '
row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
                        end
end
                        if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                            row = row .. '| colspan=\"2\" '
-- Add the Crafting time column
                        end
row = row .. rowspan
                        row = row .. ingredientcell(v.ingredients[b])
if rowspanCount > 1 then
                    end
row = row .. '|'
end
if baseCraftTime then
row = row .. baseCraftTime .. '\n'
else
row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
end
-- Add the Labour time column
row = row .. rowspan
if rowspanCount > 1 then
row = row .. '|'
end
if baseLaborCost then
row = row .. baseLaborCost .. '\n'
else
row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
end
-- Add the XP gain column
row = row .. rowspan
if rowspanCount > 1 then
row = row .. '|'
end
if baseXPGain then
row = row .. baseXPGain .. '\n'
else
row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
end
-- Add the SECOND row of ingredients to ingredients column if applicable
if ingrednum > 4 then
row = row .. '|-\n'
for b = 5, ingrednum do
if (ingrednum == 5) then
row = row .. '| colspan=\"4\" '
end
if ((ingrednum == 6) or (ingrednum == 7 and b == 6)) then
row = row .. '| colspan=\"2\" '
end
row = row .. ingredientcell(ingredients[b])
end
end
rows = rows .. row
end


--Show variants in table if only 1 recipe in list
if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
for k, v in pairs(recipes[i].variants) do
--start new row for variants
row = '|-\n'
--Skip default variant
if v.products[1][1] ~= recipes[i].defaultVariant then
local prodnum = #products
for a = 1, prodnum do
if prodnum == 1 then
row = row .. rowspanProducts .. ' colspan=\"4\" '
end
if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
row = row .. rowspanProducts .. ' colspan=\"2\" '
end
row = row .. itemcell({v.products[a][1], v.products[a][2], v.products[a][3]})
end


                end
--will need to cycle ingrediants to fill out complete table
                rows = rows .. row
--row = row .. itemcell({v.products[1][1], v.products[1][2]})
            end
local numing = ingrednum
        end
if ingrednum > 4 then
    end
numing = 4
 
end
for b = 1, numing do
if (ingrednum == 1) then
row = row .. '| colspan=\"4\" '
end
if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
row = row .. '| colspan=\"2\" '
end
row = row .. ingredientcell(v.ingredients[b])
end
end
rows = rows .. row
end
end
end
     -- Return the full wikitable
     -- Return the full wikitable
    return header({ recipes[1].dispCraftStn }) .. rows .. '|-\n|}\n'
return header({recipes[1].dispCraftStn}) .. rows .. '|-\n|}\n'
end
end


return p
return p

Revision as of 13:45, 16 March 2021

Documentation

This module is a part of the Template:GetRecipes, and is used to generate a wikitable of recipes. It returns a wikitable as a string. The wikitable contains all of the recipes that were passed into the module.

If the template is passed, this module is used with the following Modules:


-- Module:RecipeTable https://wiki.play.eco/en/Module:RecipeTable
local p = {}

local L = require("Module:Localization")

-- Header for the wikitable
function header( args )
    local headerStr = '{| class=\"wikitable mw-collapsible\" style=\"text-align: center;\"\n|-\n'

    -- Show or hide the Crafting Station column
    if args[1] == '1' then
        headerStr = headerStr .. '! ' .. L.t('Crafting Station') .. ' !'
    end
	-- Item, Level Needed, Materials, Crafting Time, Labour Cost and XP Gained Specialty
     headerStr = headerStr .. '! colspan=\"4\" | ' .. L.t('Item') .. ' !! colspan=\"4\" | ' .. L.t('Materials') .. ' !! ' .. L.t('Level Needed') .. ' !! ' .. L.t('Crafting Time<br>(mins)') .. ' !! ' .. L.t('Labour Cost') .. ' || ' .. L.t('XP Gained') .. ' !!\n'
    return headerStr
end

function imagedisp( name, nameEN, style, borderColour )
    local str = ''

    if name then
        name = string.gsub(name, '.skillbook', 'skillbook')
    end
 
    local borderImageClass = ''
        if borderColour == 'green' then
            borderImageClass = ' borderGreen'
        elseif borderColour == 'yellow' then
            borderImageClass = ' borderYellow'
    end

    local iconClass = 'iconRecipe'
    if style == 'tag' then
        iconClass = 'iconRecipe iconWhite'
        name = name .. L.t('Tag')
        nameEN = nameEN .. 'Tag'
    elseif style == 'skill' then
        iconClass = 'iconRecipe iconBrightBlue'
    end
  
    -- Manual override for image file
    if nameEN then
        image = string.gsub(nameEN, ' ', '') .. '_Icon.png'
	else
		image = 'NoImage.png'
	end
			str = str .. '<div class="iconContainer" style="width:64px; height:64px"><div class="iconStack">[[File:' .. image .. '|frameless|class='..iconClass..'|link=' .. name ..']]</div><div class="iconBorder' .. borderImageClass .. '" style=\"position:absolute;\"></div></div>\n[[' .. name .. ']]'
	return str
end

function stationcell( args )
  local str = ''
	str = str .. '| ' .. imagedisp(args[1],args[2])
	return str
end

function itemcell( args )
	local str = ''
	str = str .. '| ' .. imagedisp(args[1],args[3])
	str = str .. '<br>x' .. args[2] .. '\n'
	return str
end

function ingredientcell( args )
	local str = ''
        local borderColour
        if args[4] == 'False' then
            borderColour = 'green'
        elseif args[4] == 'True' then
            borderColour = 'yellow'
        end
	if args[1] == 'TAG' then
            style = 'tag'
        else
            style = nil
        end
	return str .. '| ' .. imagedisp(args[2], args[5], style, borderColour) .. '<br>x' .. args[3] .. '\n'
end

function skillreqcell( args )
    local str = ''
	str = str .. '| ' .. imagedisp(args[1],args[3], 'skill')
	str = str .. '<br> ' .. L.t('Level') .. ' ' .. args[2] .. ' \n'
	return str
end

								
-- Does this even exist anymore?
--function groupedskillcell( args )
--    local str = ''
--	str = str .. '| ' .. imagedisp(args[1],args[3])
--	if args[2] ~= nil then
--		str = str .. ' <br> ' .. imagedisp(args[2])
--	end
--	return str
--end

-- Create a wikitable of recipes
function p.main( recipes )
    local rows = ''
	
    -- Get each row
    for i = 1, #recipes do
	-- get information from the current recipe for building
		local checkImage = recipes[i].checkImage
		local craftStn = recipes[i].craftStn
		local skillNeeds = recipes[i].skillNeeds
		--use last variant as this is always the default variant
		local numberOfVariants = recipes[i].numberOfVariants
		local products = {{'','',''}}
		local ingredients = {{'',''}}
		
		--loop through variants to select default variant ingredients
		for k, v in pairs(recipes[i].variants) do
			--given pairs doesn't guarantee order, check that product matches default variant
			if k == recipes[i].defaultVariant then
				ingredients = v.ingredients
				products = v.products		
			end
		end
		local baseCraftTime = recipes[i].baseCraftTime
		local baseLaborCost = recipes[i].baseLaborCost
		local baseXPGain = recipes[i].baseXPGain
			
		-- determine the size needed for products to display correctly
		local ingrednum = #ingredients
		local rowspan = '|'
		local rowspanProducts = '|'
		
		--Code to incorporate rowspan for ingrediants and variants here
		local rowspanCount = 0

		--accomodate both variants and multiple ingredients
		
		if ingrednum > 4 then
			rowspanCount = rowspanCount + 2
		end
		--suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
		if(#recipes == 1) then --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
			if tonumber(recipes[i].numberOfVariants) > 1 then
				rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
				rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
			end
		end
		if rowspanCount > 0 then
			rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
			if(#recipes > 1) then
				rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
			else
				rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
			end
		end
		
		-- String to return
		local row = '|-\n'
	
		-- Add new row if products or ingredients are passed in with at least 1 item
		if (products[1] and ingredients[1]) then
      	
			-- Show or hide the Crafting Station column
			if recipes[i].dispCraftStn == '1' then
				row = row .. rowspan .. stationcell({craftStn[1][1],craftStn[1][2]}) .. '\n'
			end
        
			-- Add the products columns
			local prodnum = #products
			for a = 1, prodnum do
				if prodnum == 1 then
					row = row .. rowspanProducts .. ' colspan=\"4\" '
				end
				if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
					row = row .. rowspanProducts .. ' colspan=\"2\" '
				end
				row = row .. itemcell({products[a][1], products[a][2], products[a][3]})
				if (tonumber(numberOfVariants) > 1) then
					row = row .. '<i>' .. L.t('Has Variants') .. '</i> \n'
				end
			end
			
			-- Add the FIRST row of Ingredients column	
			local numing = ingrednum
			if ingrednum > 4 then 
				numing = 4
			end
			for b = 1, numing do
				if (ingrednum == 1) then
					row = row .. '| colspan=\"4\" '
				end
				if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
					row = row .. '| colspan=\"2\" '
				end
				row = row .. ingredientcell(ingredients[b])
			end

			-- Add the Skill needed column	
			if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
				row = row .. rowspan .. skillreqcell({skillNeeds[1][1], skillNeeds[1][2],skillNeeds[1][3]})
			else
				row = row .. rowspan 
				if ingrednum > 4 then
					row = row .. '|'
				end
				row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
			end
			
			-- Add the Crafting time column
			row = row .. rowspan 
			if rowspanCount > 1 then
				row = row .. '|'
			end
			if baseCraftTime then					
				row = row .. baseCraftTime .. '\n'
			else
				
				row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
			end
			
			-- Add the Labour time column
			row = row .. rowspan 
			if rowspanCount > 1 then
				row = row .. '|'
			end
			if baseLaborCost then					
				row = row .. baseLaborCost .. '\n'
			else
				
				row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
			end
			
			-- Add the XP gain column
			row = row .. rowspan 
			if rowspanCount > 1 then
				row = row .. '|'
			end
			if baseXPGain then					
				row = row .. baseXPGain .. '\n'
			else
				
				row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
			end
				
			-- Add the SECOND row of ingredients to ingredients column if applicable
			if ingrednum > 4 then
				row = row .. '|-\n'
				for b = 5, ingrednum do
					if (ingrednum == 5) then
						row = row .. '| colspan=\"4\" '
					end
					if ((ingrednum == 6) or (ingrednum == 7 and b == 6)) then
						row = row .. '| colspan=\"2\" '
					end
					row = row .. ingredientcell(ingredients[b])
				end
			end
			
			rows = rows .. row
		end

		--Show variants in table if only 1 recipe in list
		if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
			for k, v in pairs(recipes[i].variants) do
				--start new row for variants
				row = '|-\n'
				--Skip default variant
				if v.products[1][1] ~= recipes[i].defaultVariant then
					local prodnum = #products
					for a = 1, prodnum do
						if prodnum == 1 then
							row = row .. rowspanProducts .. ' colspan=\"4\" '
						end
						if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
							row = row .. rowspanProducts .. ' colspan=\"2\" '
						end
						row = row .. itemcell({v.products[a][1], v.products[a][2], v.products[a][3]})
					end

					--will need to cycle ingrediants to fill out complete table
					--row = row .. itemcell({v.products[1][1], v.products[1][2]})
					local numing = ingrednum
					if ingrednum > 4 then 
						numing = 4
					end
					for b = 1, numing do
						if (ingrednum == 1) then
							row = row .. '| colspan=\"4\" '
						end
							if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
							row = row .. '| colspan=\"2\" '
						end
							row = row .. ingredientcell(v.ingredients[b])
					end
					
					
				end
				rows = rows .. row
			end			
		end
	end
			
    -- Return the full wikitable
	return header({recipes[1].dispCraftStn}) .. rows .. '|-\n|}\n'
end

return p