Module:Gifted item

From Little-Known Galaxy Wiki
Jump to navigation Jump to search
local p = {}
local lib = require('Module:Feature')
local Icon_list = require('Module:Icon list')._main
local noDupe = {}
local cargo = mw.ext.cargo

-- once more characters are in the cargo table, just get unique character names from the table instead
local allCharacters = mw.loadData('Module:Gifted item/data')
local categories = mw.html.create()
local order = { 'love', 'like', 'neutral', 'dislike' }
local blankReturn = {
	love	= 'No character loves this item.',
	like	= 'No character likes this item.',
	neutral = 'No character is neutral towards this item.',
	dislike = 'No character dislikes this item.',
}

local function adj(preference, cap)
	if preference == 'neutral' then
		if cap then return 'Neutral' else return 'neutral' end
	else
		if cap then return preference:gsub("^%l", string.upper) .. 'd' else return preference .. 'd' end
	end
end

function p.main(frame)
    local args = require('Module:Arguments').getArgs(frame, { parentFirst = true })
    return p._main(args)
end

function p._main(args)
    local itemName = mw.title.getCurrentTitle().text
    local data = p.parseCharacters(itemName, args)
    local result = mw.html.create('table'):addClass('lkg-table tdc1 tdbg1 tdwid1 tablemedium')
    local tr = result:tag('tr')
    tr:tag('th'):css{ width = '10%' }
    tr:tag('th'):wikitext('Characters')

    for _, preference in ipairs(order) do
    	local characters = data[preference]
        local tr = result:tag('tr')
        tr:tag('th'):wikitext(adj(preference, true))

        local td = tr:tag('td')
        if next(characters) == nil then
            td:tag('i'):wikitext(blankReturn[preference])
        else
            local list = {}
            local settings = { prefix = ' portrait crop ' }
            for _, character in pairs(characters) do
                table.insert(list, character)
            end
            local iconListArgs = {
                delim = ',',
                display = 'stacked',
                col = 'true',
                [1] = table.concat(list, ',')
            }
            td:node(Icon_list(iconListArgs))
        end
    end

	--add categories
	result:node(require('Module:Namespace detect').main{main=categories})

    return tostring(result)
end

function p.parseCharacters(itemName, args)
    local data = {
        love    = {},
        like    = {},
        neutral = {},
        dislike = {},
    }

    local result = mw.ext.cargo.query(
    	"npcPreferences",
    	"name,preferenceLevel",
    	{
    		where = "item=\"" .. itemName .. "\""
    	}
    )
    for r = 1, #result do
    	local preference = result[r].preferenceLevel:gsub('d$', '')
    	local character = result[r].name
    	table.insert(data[preference], character)
		noDupe[character] = true
    end
    for _, preference in ipairs(order) do
		if lib.isNotEmpty(args[preference]) then
			if args[preference] == 'universal' then
				categories:wikitext('[[Category:Item universally ', adj(preference),']]')
				for _, character in pairs(allCharacters) do
			    	if noDupe[character] == nil 
			    		then table.insert(data[preference], character)
			    	end
				end
			end
		end
	end   
    return data
end

return p