Module:Infobox card

local p = {} local mArguments -- lazy load local mOrb = require("Module:Orb")._main local mLink = require("Module:Link")._main

local util = require( 'Module:Utils' ) local box = require( 'Module:Infobox' ) local style = require( 'Module:Infobox/CSS' ) local auto = require( 'Module:AutoAbilities' ) local COLS = "2" local skills = {} local lang = mw.getContentLanguage local title = mw.title.getCurrentTitle local NAMESPACE = title.namespace local PAGENAME = title.text

function p.main( frame ) mArguments = require("Module:Arguments") local args = mArguments.getArgs(frame)

local autocat = false local cats = {} if NAMESPACE == 0 or args.demospace == 'main' then autocat = true end local jobtype = lang:lc(args.type or '') if jobtype == "healer" then jobtype = "support" end local isMaterial = jobtype == "material" local isScroll = (mw.ustring.find(PAGENAME, "(scroll)", 1, true) or mw.ustring.find(PAGENAME, "(Scroll)", 1, true)) ~= nil local ability = args.ability or '' local hasAbility = ability ~= "" and lang:lc(ability) ~= "none" and lang:lc(ability) ~= "n/a" t = p.parseArgs( args ) boxes = {} -- Remove margin of the table style['table'].margin = "0"

for i, v in ipairs(t) do   html = {} -- Set box colors p.color( lang:lc(v.element) ) html = { [1] = {       ['bbottom'] = false, { p.image( v.image ), attr = { colspan = COLS } } },     [2] = {        { "Job Type", css = style.th }, { p.formatJobtype(v['type']), css = style.td } },     [3] = {        { "Element", css = style.th }, { p.element( v.element ), css = style.td } },   }    if not isMaterial then -- Only non-material cards create skillseeds. html[#html+1] = { { "Skillseeds", css = style.th }, { p.formatSeed( v.seeds ), css = style.td } }   end if hasAbility then html[#html+1] = { ['type'] = "section", { "Ability", css = style.section, attr = {colspan='2'} } }     html[#html+1] = { { "Name", css = style.th }, { p.abilityLink( v.ability ), css = style.td } }     html[#html+1] = { ['type'] = "group", n = 3, ['bbottom'] = true, { " Orbs " .. p.orbs( v.orbs ) }, { " Range " .. (v.range or "") }, { " Max Lv. " .. (v.maxlv or "") }, }     html[#html+1] = { ['type'] = "group", n = 3, { " Attack " .. (v.attack or "") }, { " Break Power " .. (v.breakpower or "") }, { " Crit Chance " .. (v.crit or "") }, }   end if (v.extraskills ~= "" and v.extraskills ~= nil) or next(skills) ~= nil then html[#html+1] = { ['type'] = "section", { "Extra Skills", css = style.section, attr = { colspan = COLS } } }     html[#html+1] = { { p.extraSkills( v.extraskills ), attr = { colspan = COLS } } }   end if v.auto ~= "" and v.auto ~= nil then html[#html+1] = { ['type'] = "section", { "Auto-Abilities", css = style.section, attr = { colspan = COLS } } }     html[#html+1] = { { p.autoAbilities( v.auto ), attr = { colspan = COLS } } }   end if v.augment ~= "" and v.augment ~= nil then -- TODO: Utilize the plus (+) symbolizing Fast Learner cards. local star, plus = string.match(v.star, '(-?%d+)(%+?)') star = tonumber( star ) + 1 html[#html+1] = { ['type'] = "section", { "Augment to " .. util.stars( star ), css = style.section, attr = { colspan = COLS } } }     html[#html+1] = { { p.augment( v.augment ), attr = { colspan = COLS } } }   end

boxes[i] = box.build ( util.sortTable(html), style, COLS ) end -- the root html node local root = mw.html.create

-- tabbed infoboxes local tabs = mw.html.create( 'div' ) tabs :addClass( 'cardtabs' ) :css( 'margin', "10px 10px 20px 20px" ) :css( "width", "300px" ) :wikitext( p.tabber( frame ) ) :allDone root:node(tabs)

-- description quote local info = args.info or args.description or '' if info ~= '' then local quote_node = mw.html.create local quote = frame:expandTemplate{title="quote", args={info, "In-game description"}} quote_node:newline:wikitext(quote) root:node(quote_node) end

-- auto category if autocat then cats[#cats+1] = '' local jobtype_cats = { warrior = '', mage = '', meia = '', ranger = '', sarah = '', monk = '', support = '', healer = '', material = '', }   cats[#cats+1] = jobtype_cats[jobtype] or '' local ele = lang:lc(args.element or '') local ele_cats = { none = '', fire = '', water = '', wind = '', earth = '', light = '', dark = '', life = '', prismatic = '', }   cats[#cats+1] = ele_cats[ele] or '' if hasAbility then local abis = mw.text.split(ability, '%s*//%s*') cats[#cats+1] = '' -- TODO: Allow overrides. Such as if it's expecting augment or ES, but "none" is specified? -- TODO: Check if Meia scrolls have only "Meia Synchro"? if isScroll then -- Scrolls do not have augment, don't track. -- Scrolls do not have extra skills, don't track. else local stars = mw.text.split(args.star or '', "%s*//%s*") local augments = mw.text.split(args.augment or '', "%s*//%s*") local extras = mw.text.split(args.extraskills or '', "%s*//%s*") local hasAugment = true local hasExtra = true for i=1,#stars do         local s=stars[i] or '' local a=augments[i-1] or '' local e=extras[i] or '' mw.log(string.format('"%s", "%s", "%s"', s,a,e), 'augment:', hasAugment, 'extra:', hasExtra) if i > 1 and hasAugment and s ~= "" and a=="" then hasAugment = false end if hasExtra and s ~= "" and e == "" then hasExtra = false end end if not hasAugment and not isScroll then -- Expected augment but found some missing. -- Scrolls do not have augment, don't track. cats[#cats+1] = '' end if not hasExtra then -- Expected extra skill but found some missing. cats[#cats+1] = '' end end end local auto = args.auto or '' if auto == '' and not isScroll and not isMaterial then cats[#cats+1] = '' end root:wikitext(table.concat(cats,"")) end

return tostring( root ) end

function p.tabber( frame ) local param = "" for i, box in ipairs( boxes ) do   param = param .. t[i].star .. "=" .. box if i == #boxes then break end param = param .. "|-|" end return frame:extensionTag( 'tabber', param ) end

-- frame.args are named parameters with several values separated by a // separator. This function creates tables of key, values. Example : star = "1 // 2 // 3"; job = "Mage"; attack = "10 // 20 // 30" gives {   { star = 1, job = "Mage", attack = "10" }    { star = 2, job = "Mage", attack = "20" }    { star = 3, job = "Mage", attack = "30" }  } function p.parseArgs( args ) local t = {} local n = 1 for k, v in pairs( args ) do   params = mw.text.split( v, "%s*//%s*" ) if #params > n then n = #params end for i=1, #params do     if not t[i] then t[i] = {} end t[i][k] = mw.text.trim( params[i] ) end end -- if a value is lacking, get the previous one except for image, extraskills, upgrade mats for k, v in pairs( args ) do   if ( k ~= 'extraskills' and k ~= 'image' and k ~= 'augment' ) then for i=1, n do       if not t[i][k] then t[i][k] = t[i-1][k] end end end end return t end

-- Change box colors based on the element function p.color( element ) if element == "fire" then style.th['background-color'] = "#f44336" style.section['background-color'] = "#b71c1c" style.color.color = "#f44336" elseif element == "water" then style.th['background-color'] = "#448aff" style.section['background-color'] = "#0d47a1" style.color.color = "#2196f3" elseif element == "earth" then style.th['background-color'] = "#795548" style.section['background-color'] = "#3e2723" style.color.color = "#795548" elseif element == "wind" then style.th['background-color'] = "#8bc34a" style.th.color = "#212121" style.section['background-color'] = "#33691e" style.color.color = "#8bc34a" elseif element == "dark" then style.th['background-color'] = "#673ab7" style.section['background-color'] = "#311b92" style.color.color = "#673ab7" elseif element == "light" then style.th['background-color'] = "#ffff8d" style.th.color = "#212121" style.section['background-color'] = "#f57f17" style.color.color = "#ffc107" elseif element == "life" then style.th['background-color'] = "#f48fb1" style.th.color = "#212121" style.section['background-color'] = "#d81b60" style.color.color = "#f06292" elseif element == "prismatic" then style.th['background-color'] = "#cddc39" style.section['background-color'] = "#0d47a1" end end

-- Format image, displays title if no image function p.image( img ) if ( img ~= nil and img ~= "" ) then return "" else local div = mw.html.create( 'div' ) div :wikitext( util.cleanTitle( mw.title.getCurrentTitle.text ) ) :css( { ['font-size'] = "20px", ['background-color'] = "#212121",      color = "white", ['text-align'] = "center" } ) :css( style.td ) return tostring( div ) end end

-- Format skillseeds display function p.formatSeed( data ) local data = data or "" if data == "" then return "" end data = mw.text.trim(data) local elmnt = {} for v in mw.text.gsplit( data, "%s*,%s*" ) do   local ele, qty = string.match(v, '(%a-)%s*x%s*(%d+)') elmnt[#elmnt+1] = string.format("%s x %s", p.seed( ele ), qty) end local seeds = table.concat(elmnt, " ") return seeds end

function p.formatJobtype( jobtype ) local t = lang:lc( jobtype ) local icon, name if t == 'warrior' then icon = 'File:Warrior_Icon.png' name = 'Warrior' elseif t == 'mage' then icon = 'File:Mage_Icon.png' name = 'Mage' elseif t == 'ranger' then icon = 'File:Ranger_Icon.png' name = 'Ranger' elseif t == 'monk' then icon = 'File:Monk_Icon.png' name = 'Monk' elseif t == 'support' or t == 'healer' then icon = 'File:Support_Icon.png' name = 'Support' elseif t == 'material' then icon = 'File:Material_Icon.png' name = 'Material' elseif t == 'meia' then icon = 'File:Meia_Icon.png' name = 'Mage' else return jobtype end return 'link=|x20px ' .. name end

function p.seed(elmt) local elmt = elmt or '' return "" end

-- Format orbs function p.orbs( orb ) local data = mw.text.split( orb, "x" ) local icon = mOrb(data[1]) local text = "x" .. mw.text.trim( data[2] ) return icon .. " " .. text end

-- Format element function p.element( element ) local icon = mOrb(element) local text = util.colorText( lang:ucfirst( element ), element ) return icon .. " " .. text end

-- Add element color to ability name function p.abilityLink( name ) local name = name or "" if name ==  then return  end local span = mw.html.create( 'span' ) span:css( style.color ):wikitext( name ) return "" .. tostring(span) .. "" end

-- Format extra skills display function p.extraSkills( data ) local es = mw.html.create( 'div' ) es:css( style.td ) if ( data ~= nil and data ~= "" ) then for v in mw.text.gsplit( data, ";" ) do     table.insert( skills, v ) end end for i, v in ipairs( skills ) do   local skill = util.explode( ' ', mw.text.trim(v), 2 ) local span = mw.html.create( 'span' ) span:css( { position = "absolute", right = "0", ["padding-left"] = "15px" } ) span:wikitext( "A.Lv. " .. skill[1] ) local div = mw.html.create( 'div' ) local text = skill[2] if text:sub( 1, 1 ) == "*" then text = text:sub( 2 ) skills[i] = "" end div:css( "position", "relative" ):wikitext( mLink{text} ):node( span ) es:node (div ) end -- Clean skills table by removing empty string local n, skillsNew = 1, {} for i, v in ipairs( skills ) do   if v ~= "" then skillsNew[n] = v     n = n + 1 end end skills = skillsNew return tostring(es) end

-- Format auto abilities function p.autoAbilities( data ) local formatString = auto._formatString or auto.formatString local data = data or "" local div = mw.html.create( 'div' ) local text = "" local abilities = mw.text.split( data, "%s*,%s*" ) for i, v in ipairs( abilities ) do   text = text .. " " .. formatString( v ) .. " " end div:css( style.td ):wikitext( text ) return tostring( div ) end

-- Format upgrade mats function p.augment( data ) local data = data or "" local div = mw.html.create( 'div' ) local text = "" local mats = mw.text.split( data, "%s*,%s*" ) for i, v in ipairs( mats ) do   local mat = mw.text.split( v, "x" ) local title = "" if mat[2] then text = text .. " " .. title .. " x" .. mat[2] .. " "   else text = text .. " " .. title .. " "   end end div:css( style.td ):wikitext( text ) return tostring( div ) end

return p