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 12: Line 13:
         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 iconClass = 'iconRecipe'
     local iconBG
     if style == 'tag' then
     if style == 'tag' then
         iconClass = 'iconRecipe iconWhite'
         iconBG = '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
         iconClass = 'iconRecipe iconBrightBlue'
         iconBG = 'iconBrightBlue'
     end
     end
 
 
     -- Manual override for image file
     return Utils.build_icon(name, 'iconRecipe', iconBG, borderImageClass, False)
    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 98: Line 86:


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


--accomodate both variants and multiple ingredients
        --Show variants in table if only 1 recipe in list
        if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
if ingrednum > 4 then
            for k, v in pairs(recipes[i].variants) do
rowspanCount = rowspanCount + 2
                --start new row for variants
end
                row = '|-\n'
--suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
                --Skip default variant
if(#recipes == 1) then --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
                if v.products[1][1] ~= recipes[i].defaultVariant then
if tonumber(recipes[i].numberOfVariants) > 1 then
                    local prodnum = #products
rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
                    for a = 1, prodnum do
rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
                        if prodnum == 1 then
end
                            row = row .. rowspanProducts .. ' colspan=\"4\" '
end
                        end
if rowspanCount > 0 then
                        if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
                            row = row .. rowspanProducts .. ' colspan=\"2\" '
if(#recipes > 1) then
                        end
rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
                        row = row .. itemcell({ v.products[a][1], v.products[a][2], v.products[a][3] })
else
                    end
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
                    --will need to cycle ingrediants to fill out complete table
if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
                    --row = row .. itemcell({v.products[1][1], v.products[1][2]})
row = row .. rowspan .. skillreqcell({skillNeeds[1][1], skillNeeds[1][2],skillNeeds[1][3]})
                    local numing = ingrednum
else
                    if ingrednum > 4 then
row = row .. rowspan
                        numing = 4
if ingrednum > 4 then
                    end
row = row .. '|'
                    for b = 1, numing do
end
                        if (ingrednum == 1) then
row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
                            row = row .. '| colspan=\"4\" '
end
                        end
                        if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
-- Add the Crafting time column
                            row = row .. '| colspan=\"2\" '
row = row .. rowspan
                        end
if rowspanCount > 1 then
                        row = row .. ingredientcell(v.ingredients[b])
row = row .. '|'
                    end
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
                end
--row = row .. itemcell({v.products[1][1], v.products[1][2]})
                rows = rows .. row
local numing = ingrednum
            end
if ingrednum > 4 then
        end
numing = 4
    end
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:27, 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 Utils = require("Module:Utils")
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 borderImageClass = ''
    if borderColour == 'green' then
        borderImageClass = ' borderGreen'
    elseif borderColour == 'yellow' then
        borderImageClass = ' borderYellow'
    end

    local iconBG
    if style == 'tag' then
        iconBG = 'iconWhite'
        name = name .. L.t('Tag')
        nameEN = nameEN .. 'Tag'
    elseif style == 'skill' then
        iconBG = 'iconBrightBlue'
    end

    return Utils.build_icon(name, 'iconRecipe', iconBG, borderImageClass, False)
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