Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Vocal datatable: Difference between revisions

From Sekaipedia
Content added Content deleted
mNo edit summary
(deleted 'singer(s)' row [lines 103 through 107])
 
(27 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local builder = require('Module:DatatableBuilder')
local DatatableBuilder = require('Module:DatatableBuilder')
local cargo = mw.ext.cargo
local QueryBuilder = require('Module:QueryBuilder')


local p = {}
local p = {}


local function cargoQuery(cargo_args)
local function string_to_list(str, delim)
if str then

local wheres = {
local list = mw.text.split(str, delim)
for i,v in ipairs(list) do
'Songs.song_id > 0'
list[i] = mw.text.trim(v)
}
local function multi_where(field, fun, arg, delim)
if arg and arg ~= '' then
local splits = mw.text.split(arg, delim)
local split_wheres = {}
for i_split,split in ipairs(splits) do
table.insert(
split_wheres,
string.format(
"%s %s '%s'",
field,
fun,
split
)
)
end
return '(' .. table.concat(split_wheres, ' OR ') .. ')'
end
end
return list
end
end
return {}
local unit_wheres = multi_where(
end
'Songs.unit',
'HOLDS',
cargo_args['unit'],
';'
)
if unit_wheres then
table.insert(wheres, unit_wheres)
end
local version_wheres = multi_where(
'Song_Vocal_Versions.version',
'=',
cargo_args['version'],
','
)
if version_wheres then
table.insert(wheres, version_wheres)
end
local singer_wheres = mutli_where(
'Song_Vocal_Versions.singers',
'HOLDS',
cargo_args['singer'],
','
)
if singer_wheres then
table.insert(wheres, singer_wheres)
end


local function formatJacket(jacket)
local tables = 'Song_Vocal_Versions, Songs'
return string.format('[[File:%s|64px]]', jacket)
local fields = [[
end
Songs._pageName,

Songs.song_name,
local function formatName(pageName, songName)
Songs.image,
return string.format('[[%s|%s]]', pageName, songName)
Song_Vocal_Versions.version,
end
Song_Vocal_Versions.singers

]]
local args = {
local function formatUnit(unit)
local units = string_to_list(unit, ';')
where = table.concat(wheres, ' AND '),
limit = 500,
join = 'Song_Vocal_Versions._pageID = Songs._pageID',
orderBy = 'Songs.date DESC',
}
return cargo.query( tables, fields, args )
return table.concat(units, '<br>')
end
end


Line 84: Line 36:
local args = getArgs(frame)
local args = getArgs(frame)
local results = cargoQuery({
local qb = QueryBuilder.new()
qb
['unit'] = args['unit'],
:setTables('song_versions, songs')
['version'] = args['version'],
:setFields([[
['singer'] = args['singer']
songs._pageName,
})
songs.song_name,

songs.jacket,
local datatable = builder.new()
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
datatable
:setColumns{
:setColumns{
{
{ name = 'jacket', header = 'Jacket art', data_fields = { 'Songs.image' }, func = formatImage },
name = 'jacket',
{ name = 'name', header = 'Song name', data_fields = { 'Songs._pageName', 'Songs.song_name' }, func = formatName },
header = 'Jacket art',
{ name = 'unit', header = 'Unit(s)', data_fields = { 'Songs.unit' }, func = formatUnit },
dataFields = { 'songs.jacket' },
{ name = 'version', header = 'Version', data_fields = { 'Song_Vocal_Versions.version' } },
func = formatJacket,
{ name = 'singer', header = 'Singer(s)', data_fields = { 'Song_Vocal_Versions.singers' } }
css = { ['width'] = '64px' },
}
sortable = false
:setHeaders{
'jacket',
},
'name',
{
'unit',
name = 'name',
'version',
header = 'Song',
dataFields = { 'songs._pageName', 'songs.song_name' },
'singer'
func = formatName
},
{
name = 'unit',
header = 'Unit(s)',
dataFields = { 'songs.units' },
func = formatUnit
},
{
name = 'version',
header = 'Version',
dataFields = { 'song_versions.version' }
}
}
}
:setData(results)
:setData(qb:query())
return datatable:tostring()
return datatable:tostring()

Latest revision as of 16:33, 22 April 2024


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.