Eternal Card Game Wiki
Register
Advertisement

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

-- <pre> -- Module - HoverTooltip
--[==============================================================================[  
This module contains functions to format and return content for with this wiki's
  'hover' toolip templates. Descriptions for keywords and glossary terms are
  stored in the sub-module HoverTooltip/Keywords.
]==============================================================================]

--=======================================
--[==[Load Data Tables]==]

local data = mw.loadData("Module:HoverTooltip/Keywords")

local keywords = data.keywords
local glossary = data.glossary

-- -----------------------------------------------------
--[======[Non-Invokable Functions ]======]
-- These functions cannot be accessed from wiki articles or templates. They are
--   used by other parts of this module.
-- See 'Invokable Functions' section below for accessable functions.

-- Lookup and return keyword description
function getDescription(kw)
    kw = string.lower(kw)
    if not keywords[kw] then -- check against keyword list
        return "Error, the '" .. Kw .. "' keyword is not in the database. Check spelling."
    end
    
    kw = keywords[kw]
    return kw
end


-- Build combined tooltip text
function kwText(t, display)
        local tooltip = {}
        local temp = {}
   
        -- clean up keywords (ex. add Destiny to Revenge)
        t = kwFix(t)
        table.sort(t)
        
        for i,v in ipairs(t) do
            local tip = getDescription(v)
            
            -- fix for instances of multiple spellings for the same keyword
            -- (ex. Curse & Curses)
            -- place descriptions as indexes in temp table to check against
            if not temp[tip] then 
                temp[tip] = i
                table.insert(tooltip, tip)
            end
        end
        
        -- build combined tooltip text
        display = display or 'default'
        if display == 'table' then
            tooltip = table.concat(tooltip, "\n|-\n|")
            tooltip = [=[
{| class = "article-table"
|-
|]=] .. tooltip .. [=[

|}
]=]
        else
            tooltip = table.concat(tooltip, "<br /><br />")
        end
        return tooltip
end

-- Clean up requested keywords for special cases
function kwFix(t)
    -- build table with keywords as index for easier lookup
    -- also combines multiple entries of the same keyword
    -- NOTE: does NOT fix multiple spellings of the same keyword
    --       this is done later by discarding multiples of the same description
    local kwIndex = {}
    for i,v in ipairs(t) do
        kwIndex[string.lower(v)] = ''
    end
    
    -- if BOTH Night & Nightfall, remove redundant description
    if kwIndex['night'] and kwIndex['nightfall'] then
       kwIndex['nightfall'] = nil
    end
    
    -- if BOTH Mentor & Student, remove redundant description
    if kwIndex['mentor'] and kwIndex['student'] then
       kwIndex['student'] = nil
    end
    
    -- if Revenge, add Destiny
    if kwIndex['revenge'] and not kwIndex['destiny'] then
       kwIndex['destiny'] = ''
    end
    
    -- if Berserk, add Reckless
    if kwIndex['berserk'] and not kwIndex['reckless'] then
       kwIndex['reckless'] = ''
    end
    
    -- rebuild keyword table
    t = {}
    local index = 0
    for i,v in pairs(kwIndex) do
        index = index + 1
        t[index] = i
    end
    
    return t
end

-- convert string list into a table list
--   use for named template parameters which may contain one or more values
function listToTable(string, pattern)
    local table1 = {} -- first pass, remove text between parentheses ()
    local table2 = {} -- second pass, split text using separator
    local tableCombined
    local capture = '%(([^%(%)]*)%)'
    local seperator = pattern or ','
    local n -- throwaway variable for gsub returns
    
    -- capture text tagged with parantheses, place into table1
	for value in string.gmatch(string, capture) do
		table.insert(table1, value)
	end
    
    -- remove captured text from the string
    string, n = string.gsub(string, capture .. ',', '')
    string, n = string.gsub(string, capture, '')
        
    -- split text at commas, place into table2
    table2 = mw.text.split(string, seperator)
    
    -- combine tables
    tableCombined = mergeTables(table1, table2)
        
    -- clean excess whitespace
    for i,v in pairs(tableCombined) do
        tableCombined[i] = mw.text.trim(v)
        -- remove 'whitespace' values
        if tableCombined[i] == '' then table.remove(tableCombined, i) end
    end
    
    return tableCombined
end

-- Create a table of another table's keys
function keysToTable(t)
    local keyset={}
    local n=0

    for k,v in pairs(t) do
        n=n+1
        keyset[n]=k
    end

    return keyset
end

-- Combine two tables together. Merge any values with non-number keys, append 
--   the rest to the end of the 1st table
function mergeTables(t1, t2)
    -- error correct for nil arguments
    if t1 and not t2 then return t1 end
    if t2 and not t1 then return t2 end
    
    -- throw error if an argument isn't a table
    if type(t1) ~= 'table' or type(t2) ~= 'table' then
       error("Module:HoverTooltip - 'mergeTables' requires two tables. It was given a "
        .. type(t1) .. " and a " .. type(t2) .. ".")
    end
    
    -- error correct for empty table arguments
    local keys1 = keysToTable(t1)
    if not keys1[1] then return t2 end
    
    local keys2 = keysToTable(t2)
    if not keys2[1] then return t1 end
    
    -- find max numerical key for the first table
    local keyMax = 0
    for k,_ in ipairs(t1) do
        if type(k) == 'number' and k >= keyMax then
            keyMax = k
        end
    end
    
    -- combine tables
    for k,v in ipairs(t2) do
        if type(k) == 'number' then -- append # keyed values to end
            keyMax = keyMax + 1
            t1[keyMax] = v
        else --                        merge/add anything else
            t1[k] = v
        end
    end
    
    return t1
end

--=======================================
--[==[Invokable Functions]==]
-- These Frame Object functions can be called from a wiki article or template 
--   with the syntax: {{#invoke:ModuleName|functionName|arg1|arg2|...}}
local p = {}

-- Main function for the 'KeywordHover' wiki template.
-- Returns description for one or more keywords.
--   Finds keywords listed in 'keywords' parameter, otherwise any unnamed
--     parameters in the parent template will be checked for descriptions.
--   Optional parameter 'single = true' forces only the first unnamed parameter
--     to be returned - for use in in-line text hover tooltips.
function p.keywordTip(frame)
    local args = frame.args
    local parent = frame:getParent().args
    
    local kw = {} -- table to hold keywords
    local display = args.display or parent.display or 'default'
    
    -- test for input
    if args['keywords'] or parent['keywords'] then
    
        -- get list of keywords (string value)
        kw = args['keywords'] or parent['keywords']
        
        -- convert to table
        kw = listToTable(kw)
        
        -- get & return tooltip(s)
        kw = kwText(kw)
        
        return kw
    elseif args['namedOnly'] == 'true' or parent['namedOnly'] == 'true' then
 
        -- if the parameter 'namedOnly == true' is specified, then return
        -- nothing, skipping unnamed parameters (use for 'Card' or similar
        -- templates, where processing unnamed parameters is unwanted) 
        return
    elseif args[1] or parent[1] then
    
        -- use first argument only, if 'single = true' is specified
        if args['single'] == 'true' or parent['single'] == 'true' then
            kw[1] = args[1] or parent[1]
        
        -- otherwise get multiple arguments    
        else
            kw = mergeTables(args, parent)
        end
        
        -- get & return tooltip(s)
        kw = kwText(kw, string.lower(display))
        
        return kw
    else
        return "Error, no keyword was specified."
    end
end

-- Returns token card images
--   Meant to be displayed below keyword description tooltips.
function p.tokenTip(frame)
    local args = frame.args
    local parent = frame:getParent().args
    
    -- get list of images (string value)
    local tImg = args['tokens'] or parent['tokens'] or ''
    
    -- test for input
    if tImg == '' then
        return "Error, no images were specified."
    else
        -- convert to table
        tImg = listToTable(tImg)
        
        -- convert image names to image wikitext calls
        table.sort(tImg)
        for i,image in ipairs(tImg) do
            tImg[i] = "[[File:Token - " .. image .. ".png|250px|link=" .. image 
                      .. "|alt=" .. image .. " Token]]"
        end
        
        -- combine images for tooltip
        tImg = table.concat(tImg, "<br />")
        return tImg
    end
end

-- Check parent template for either the 'keywords' or 'tokens' named parameters.
--   For cases such as the 'Card' template, where use with an #ifeq parser check
--   may avoid adding extraneous hover html and css if not needed.
function p.checkParams(frame)
    local args = frame.args
    local parent = frame:getParent().args
    
    local kwChk = args['keywords'] or parent['keywords'] or ''
    local imgChk = args['tokens'] or parent['tokens'] or ''
    
    if kwChk == '' and imgChk == '' then
        return 'false'
    else
        return 'true'
    end
end    

-- -----------------------------------------------------
return p
-- </pre> [[Category:Eternal Wiki Modules]]
Advertisement