Module:DplHelper

From Granblue Fantasy Wiki
Jump to navigation Jump to search

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

local p = {}

local util = require('Module:Util')

function p.verifyFields(fields)
	if fields[1] ~= '%PAGE%' then
		table.insert(fields, 1, '%PAGE%')
	end
	if fields[2] ~= 'id' then
		table.insert(fields, 2, 'id')
	end

	return fields
end

function p._fetch(frame, params, fields, callback)
	local data = frame:callParserFunction('#dpl:', params)
	return p.indexResult(data, fields, callback)
end

function p.fetch(frame, category, template, fields, callback)
	-- all calls 
	fields = p.verifyFields(fields)
	local params = {
		namespace = '',
		category = category,
		include = '{' .. template .. '}:' .. table.concat(fields, ':'),
		mode = 'userformat',
		secseparators = '====',
		multisecseparators = '====',
		skipthispage = 'no',
		count = '',
	}
	-- rename %PAGE% to link
	fields[1] = 'link'
	
	return p._fetch(frame, params, fields, callback)
end

function p.fetchById(frame, category, template, id, fields, callback)
	-- all calls 
	fields = p.verifyFields(fields)
	local params = {
		namespace = '',
		category = category,
		include = '{' .. template .. '}:' .. table.concat(fields, ':'),
		mode = 'userformat',
		secseparators = '====',
		multisecseparators = '====',
		skipthispage = 'no',
		includematch = '/id\\s*=\\s*' .. id .. '/',
		count = '',
	}
	-- rename %PAGE% to link
	fields[1] = 'link'
	
	return p._fetch(frame, params, fields, callback)
end

function p.fetchByTitles(frame, category, template, titles, fields, callback)
	-- all calls 
	fields = p.verifyFields(fields)
	local temp_titles = table.concat(titles, '|')
	temp_titles = string.gsub(temp_titles, '[\(]', '\\(')
	temp_titles = string.gsub(temp_titles, '[\)]', '\\)')	
	local params = {
		namespace = '',
		category = category,
		include = '{' .. template .. '}:' .. table.concat(fields, ':'),
		mode = 'userformat',
		secseparators = '====',
		multisecseparators = '====',
		skipthispage = 'no',
		--titleregexp = '^'..temp_titles..'$'
		titlematch = temp_titles,
		count = '',
	}
	mw.logObject(params)
	-- rename %PAGE% to link
	fields[1] = 'link'
	
	return p._fetch(frame, params, fields, callback)
end

function p.indexResult(data, fields, callback)
	local use_callback = (type(callback) == 'function')
	local result = {}
	local ix = 0
	local rows = util.string.split(data, '====')
	for rowix,row in pairs(rows) do
		local args = {}
		local i = 0
		local sargs = util.string.split(row, '\n|')
		for argix,arg in pairs(sargs) do
			i = i+1
			if arg ~= '' then
				local key = fields[i]
				args[key] = arg
			end
		end
		if args.link ~= nil then
			ix = ix + 1
			args.ix = ix
			
			if use_callback then
				table.insert(result, callback(args))
			else 
				table.insert(result, args)
			end
			
		end
	end
	return result
end

function p.getMagicPagename(data)
	local frame = mw.getCurrentFrame()
	return frame:preprocess('{{PAGENAME}}')
end

function p.renderList(frame)
	mw.log('render start: ' .. os.clock())
	local fields = {
		'%PAGE%',
		'id'
	}
	if frame.args.fields ~= nil then
		for w in (frame.args.fields):gmatch('[^,]+') do
			table.insert(fields, w)
		end
	end

	mw.log('load data: ' .. os.clock())
	local rows = p.fetch(frame, frame.args.dpl_category, frame.args.dpl_template, fields, nil)
	
	mw.log('expanding templates: ' .. os.clock())
	local result = {}
	local template = frame.args.template
	for key,row in pairs(rows) do
		table.insert(result, frame:expandTemplate{title = template, args = row})
	end
	mw.log('done: ' .. os.clock())
	return table.concat(result, '')
end

function p.testFetch() 
	local frame = mw.getCurrentFrame()
	local data = p.fetch(frame, 'Weapons&SSR Weapons&Omega Weapons', 'Weapon', { 'name', 'weapon', 'element', 'rarity' })
	for key,value in pairs(data) do
		mw.logObject(value)
	end
end

function p.testFetchById() 
	local frame = mw.getCurrentFrame()
	local data = p.fetchById(frame, 'Weapons&SSR Weapons&Omega Weapons', 'Weapon', '1040301400', { 'name', 'weapon', 'element', 'rarity' })
	for key,value in pairs(data) do
		mw.logObject(value)
	end
end

function p.testFetchByTitles() 
	local frame = mw.getCurrentFrame()
	local data = p.fetchByTitles(frame, 'Characters', 'Character', {'Vira','Katalina'}, { 'name', 'element', 'race', 'rarity' })
	for key,value in pairs(data) do
		mw.logObject(value)
	end
end

function p.testHEAVY()
	local frame = mw.getCurrentFrame()
	mw.log('start')
	local data = p.fetch(frame, 'SSR Weapons', 'Weapon', { 'name', 'weapon', 'element', 'rarity' })
	for key,value in pairs(data) do
		--mw.logObject(value)
	end
	mw.log(#data)
	mw.log('end')
end

return p