Module:Vocal datatable

From Sekaipedia


To generate {{Vocal datatable}}, invoke using the main function.


local getArgs          = require('Module:Arguments').getArgs
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder     = require('Module:QueryBuilder')

local p = {}

local function string_to_list(str, delim)
	if str then
		local list = mw.text.split(str, delim)
		for i,v in ipairs(list) do
			list[i] = mw.text.trim(v)
		end
		
		return list
	end
	
	return {}
end

local function formatJacket(jacket)
	return string.format('[[File:%s|64px]]', jacket)
end

local function formatName(pageName, songName)
	return string.format('[[%s|%s]]', pageName, songName)
end

local function formatUnit(unit)
	local units = string_to_list(unit, ';')
	
	return table.concat(units, '<br>')
end


function p.main(frame)
	local args = getArgs(frame)
	
	local qb = QueryBuilder.new()
	qb
		:setTables('song_versions, songs')
		:setFields([[
			songs._pageName,
			songs.song_name,
			songs.jacket,
			songs.units,
			song_versions.version
		]])
		:setJoinOn('song_versions._pageID = songs._pageID')
		:addWhere('songs.song_id', '>', '0')
	qb
		:addWhereList(
			'songs.units',
			'HOLDS',
			args['unit'],
			';',
			'OR'
		)
		:addWhereList(
			'song_versions.version',
			'=',
			args['versions'],
			',',
			'OR'
		)
		:addWhereList(
			'song_versions.singers',
			'HOLDS',
			args['singers'],
			',',
			args['singers op'] or 'OR'
		)
		:setOrderBy(args['order by'] or 'songs.song_id ASC')
		:setLimit(args['limit'] or 500)
	
	local datatable = DatatableBuilder.new()
	datatable
		:setColumns{
			{
				name = 'jacket',
				header = 'Jacket art',
				dataFields = { 'songs.jacket' },
				func = formatJacket,
				css = { ['width'] = '64px' },
				sortable = false
			},
			{
				name = 'name',
				header = 'Song',
				dataFields = { 'songs._pageName', 'songs.song_name' },
				func = formatName
			},
			{
				name = 'unit',
				header = 'Unit(s)',
				dataFields = { 'songs.units' },
				func = formatUnit
			},
			{
				name = 'version',
				header = 'Version',
				dataFields = { 'song_versions.version' }
			}
		}
		:setData(qb:query())
	
	return datatable:tostring()
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.