Module:Luagallerydata

From Archon Arcana - The KeyForge Wiki

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

--Module:Luacard
--canstage
--Usage: {{#invoke: luagallerydata | getdata}}
--Debug: mw.log(p.getdata())
local p = {}
local cargo = mw.ext.cargo

function combine(tableto, tablefrom)
	for k,v in pairs(tablefrom) do
		tableto[k] = v
	end
end

function append(table, value)
	table[#table+1] = value
	return table
end

function extend(table1, table2)
	for k,v in pairs(table2) do
		append(table1, v)
	end
end

local luajson = require("Module:luajson")

function stachify(table)
	local under_tab = {}
	for k,v in pairs(table) do
		if v==nil then
			table[k] = ''
			v = ''
		end
		if string.find(k, '[.]') then
			local parts = mw.text.split(k, '[.]')
			if not under_tab[parts[1]] then
				under_tab[parts[1]] = {}
			end
			under_tab[parts[1]][parts[2]] = v
		end
	end
	combine(table, under_tab)
end

function cargo_results(ctable, cfields, cargs)
	local table = cargo.query(ctable, cfields, cargs)
	for i,r in ipairs(table) do
		stachify(r)
		if i<#table then
			r['delim'] = true
		end
	end
	return table
end

function apply_sets(frame, ret_data)
	ret_data.cardsets = cargo_results(
		'SetInfo',
		'SetInfo.SetName, SetInfo.ReleaseYear, SetInfo.ReleaseMonth, SetInfo.ShortName, SetInfo.SetNumber, SetInfo.IsMain, SetInfo.IsSpoiler, SetInfo.IsAdventure',
		{
			orderBy='SetInfo.ReleaseYear, SetInfo.ReleaseMonth'
		})
end

function apply_carddata_in_set(carddata_field, collection_name, frame, ret_data)
	for i=1, #ret_data.cardsets do
		local setname = ret_data.cardsets[i]['SetInfo.SetName']
		local results = cargo_results(
		'SetData,CardData',
		'CardData.'..carddata_field,
		{
			groupBy='CardData.'..carddata_field,
			join='SetData._pageTitle=CardData._pageTitle',
			where='SetData.SetName="'..setname..'"'
		})
		ret_data.cardsets[i][collection_name] = {}
		for j=1, #results do
			if(results[j]['CardData']) then
				local found_elements = mw.text.split(results[j]['CardData'][carddata_field], ' • ')
				for _,elem in ipairs(found_elements) do
					ret_data.cardsets[i][collection_name][elem] = 1
				end
			end
		end
	end
end

function apply_traits(frame, ret_data)
	apply_carddata_in_set('Traits', 'Traits', frame, ret_data)
end

function apply_artists(frame, ret_data)
	apply_carddata_in_set('Artist', 'Artists', frame, ret_data)
end

function apply_houses(frame, ret_data)
	apply_carddata_in_set('House', 'Houses', frame, ret_data)
end

function apply_types(frame, ret_data)
	apply_carddata_in_set('Type', 'Types', frame, ret_data)
end

function apply_rarities(frame, ret_data)
	apply_carddata_in_set('Rarity', 'Rarities', frame, ret_data)
end

function apply_keywords(frame, ret_data)
	apply_carddata_in_set('Keywords', 'Keywords', frame, ret_data)
end

function p.getdata(frame)
	local ret_data = {}
	--TODO: Only select sets that are defined in the frame!
	apply_sets(frame, ret_data)
	apply_houses(frame, ret_data)
	apply_artists(frame, ret_data)
	apply_traits(frame, ret_data)
	apply_types(frame, ret_data)
	apply_rarities(frame, ret_data)
	apply_keywords(frame, ret_data)
	return luajson.encode(ret_data)
end

return p