Module:Sandbox/Chao: Difference between revisions

From BlazBlue Wiki
mNo edit summary
m (add handler for Gallery Section (BBRadio))
Line 27: Line 27:
--fill in any missing template arguments
--fill in any missing template arguments
--Gallery Section (Cargo)
params.character = _char
params.character = _char
params.source = v2.source or ''
params.source = v2.source or ''
Line 37: Line 38:
params.see_all = v2.see_all or ''
params.see_all = v2.see_all or ''
params.see_cameos = v2.see_cameos or ''
params.see_cameos = v2.see_cameos or ''
--Gallery Section (BBRadio)
params.season = v2.season or ''
params.widths = v2.widths or ''


if v2.template == 'Gallery Section (Cargo)' then
if v2.template == 'Gallery Section (Cargo)' then
params.count_all = p.countImagesCargo(params, false) or 0
params.count_all = p._countImages_GallerySectionCargo(params, false) or 0
params.count_cameos = p.countImagesCargo(params, true) or 0
params.count_cameos = p._countImages_GallerySectionCargo(params, true) or 0
total_images = params.count_all + params.count_cameos
total_images = params.count_all + params.count_cameos
Line 48: Line 52:
if params.count_cameos > 0 then
if params.count_cameos > 0 then
params.count_cameos = 'y'
params.see_cameos = 'y'
end
end
if total_images > 0 then
if total_images > 0 then
expanded_template = p._expandTemplate(frame, params)
expanded_template = p._expandTemplate_GallerySectionCargo(frame, params)
table.insert(t, expanded_template)
table.insert(t, expanded_template)
end
end
elseif v2.template == 'Gallery Section (BBRadio)' then
params.count_all = p._countImages_GallerySectionBBRadio(params) or 0
expanded_template = p._expandTemplate_GallerySectionBBRadio(frame, params)
table.insert(t, expanded_template)
elseif v2.template == 'Gallery Section' then
end
end
end
end
Line 72: Line 82:
end
end


function p.countImagesCargo(v, countCameos)
-- counts the number of images with this character (or cameo) for sections using Template:Gallery Section (Cargo)
-- countCameos: boolean
function p._countImages_GallerySectionCargo(params, countCameos)
tables = 'Files'
tables = 'Files'
fields = 'COUNT(Files._pageName)'
fields = 'COUNT(Files._pageName)'


character = v.character or ''
character = params.character or ''
source = v.source or ''
source = params.source or ''
section = v.section or ''
section = params.section or ''


where_clause_parts = {}
where_clause_parts = {}
Line 96: Line 108:
table.insert(where_clause_parts, "Files.Gallery_Sections HOLDS '" .. section .. "'")
table.insert(where_clause_parts, "Files.Gallery_Sections HOLDS '" .. section .. "'")
end
end
where_clause = concatvalues(where_clause_parts, " AND ")
where_clause = concatparams.lues(where_clause_parts, " AND ")


local args = {
local args = {
Line 108: Line 120:
end
end


function p._expandTemplate(frame, v)
function p._countImages_GallerySectionBBRadio(params)
_character = v.character or ''
tables = 'Files,BBRadio_Cuts'
_source = v.source or ''
fields = 'COUNT(Files._pageName)'
_section = v.section or ''
join_on = 'Files._pageName=BBRadio_Cuts._pageName'
_limit = tonumber(v.limit) or 4
 
_title = v.title or ''
where_clause = 'Files.Characters HOLDS "' .. html_escape(character) .. '" AND BBRadio_Cuts.Season="' .. frame.args[2] .. '"'
_header = v.header or ''
 
_see_all = v.see_all or ''
local args = {
_see_cameos = v.see_cameos or ''
where = where_clause,
_count_all = v.count_all or ''
join = join_on
}
 
result = cargo.query( tables, fields, args )
count = result[1][fields] or '0'
 
return tonumber(count)
end
 
function p._expandTemplate_GallerySectionCargo(frame, params)
_character = params.character or ''
_source = params.source or ''
_section = params.section or ''
_limit = tonumber(params.limit) or 4
_title = params.title or ''
_header = params.header or ''
_see_all = params.see_all or ''
_see_cameos = params.see_cameos or ''
_count_all = params.count_all or ''
gallery = frame:expandTemplate{ title = 'Gallery Section (Cargo)', args = {  
gallery = frame:expandTemplate{ title = 'Gallery Section (Cargo)', args = {  
Line 130: Line 160:
count_all = _count_all,
count_all = _count_all,
count_cameos = _count_cameos
count_cameos = _count_cameos
} }
}}


return gallery
return gallery
end
end


function p.testExpandTemplate(frame)
function p._expandTemplate_GallerySectionBBRadio(frame, params)
_character = params.character or ''
_season = params.season or ''
_episode = params.episode or ''
_header = params.header or ''
_title = params.title or ''
_limit = tonumber(params.limit) or 4
_widths = tonumber(params.widths) or 250
_count_all = params.count_all or ''
 
gallery = frame:expandTemplate { tile = 'Gallery Section (BBRadio)', args = {
_character,
_season,
_episode,
_header,
_title,
widths = _widths,
limit = _limit,
count_all = _count_all
}}
end
 
function p.testExpandTemplate_1(frame)
v = {
v = {
Line 148: Line 200:
count_all = '7'
count_all = '7'
}
}
text = p._expandTemplate(frame, v)
text = p._expandTemplate_GallerySectionCargo(frame, v)
return text
end
 
function p.testExpandTemplate_2(frame)
v = {
character = 'Noel Vermillion',
season = 'NEO',
limit = 8,
title = 'title',
header = 'h3',
see_all = 'y',
count_all = '7',
}
text = p._expandTemplate_GallerySectionBBRadio(frame, v)
return text
return text

Revision as of 18:10, 22 September 2019

Script error: The function "main" does not exist.


--[[
{{#invoke:Sandbox/Chao|GallerySection|character=Noel Vermillion|section=Portraits}}
simulate passing a frame to the function in the console with:
myFrame = { args = { character='Noel Vermillion', section='Portraits' } }
=p.GallerySection ( myFrame )
=p.testExpandTemplate( myFrame )
=p.render(myFrame)

--]]

local p = {}
local cargo = mw.ext.cargo
local sections = mw.loadData('Module:Sandbox/Chao/data').sections

function p.render(frame)
	text = {}
	_char = frame.args['character'] or ''
	
	for k,v in pairs (sections) do
		section = k

		-- v is a table of templates in this section
		t = {}
		for k2,v2 in pairs (v) do
			
			params = {}
			
			--fill in any missing template arguments
			--Gallery Section (Cargo)
			params.character = _char
			params.source = v2.source or ''
			params.section = v2.section or ''
			params.limit = v2.limit or ''
			params.widths = v2.widths or ''
			params.header = v2.header or ''
			params.title = v2.title or v2.section or ''
			params.sort = v2.sort or ''
			params.see_all = v2.see_all or ''
			params.see_cameos = v2.see_cameos or ''
			--Gallery Section (BBRadio)
			params.season = v2.season or ''
			params.widths = v2.widths or ''

			if v2.template == 'Gallery Section (Cargo)' then
				params.count_all = p._countImages_GallerySectionCargo(params, false) or 0
				params.count_cameos = p._countImages_GallerySectionCargo(params, true) or 0
				total_images = params.count_all + params.count_cameos
				
				if params.count_all > 0 then
					params.see_all = 'y'
				end
				
				if params.count_cameos > 0 then
					params.see_cameos = 'y'
				end
				
				if total_images > 0 then
					expanded_template = p._expandTemplate_GallerySectionCargo(frame, params)
					table.insert(t, expanded_template)
				end
			elseif v2.template == 'Gallery Section (BBRadio)' then
				params.count_all = p._countImages_GallerySectionBBRadio(params) or 0

				expanded_template = p._expandTemplate_GallerySectionBBRadio(frame, params)
				table.insert(t, expanded_template)
			elseif v2.template == 'Gallery Section' then
			end
		end
		
		--templates = concatvalues(t,"")
		templates = table.concat(t)
		if templates == "" then
		else
			-- insert the section, prepended by its header, to the final text
			table.insert(text, '<h2>' .. k .. '</h2>\n' .. templates)
		end
	end
	
	gallery = table.concat(text)
	mw.log(dump(gallery))
	return gallery
end

-- counts the number of images with this character (or cameo) for sections using Template:Gallery Section (Cargo)
-- countCameos: boolean
function p._countImages_GallerySectionCargo(params, countCameos)
	tables = 'Files'
	fields = 'COUNT(Files._pageName)'

	character = params.character or ''
	source = params.source or ''
	section = params.section or ''

	where_clause_parts = {}
	if countCameos then
		table.insert(where_clause_parts, "Files.Cameos HOLDS '" .. character .. "'")
	else
		table.insert(where_clause_parts, "Files.Characters HOLDS '" .. character .. "'")
	end
	
	if source == '' then
	else
		table.insert(where_clause_parts, "Files.Source HOLDS '" .. source .. "'")
	end
	
	if section == '' then
	else
		table.insert(where_clause_parts, "Files.Gallery_Sections HOLDS '" .. section .. "'")
	end
	where_clause = concatparams.lues(where_clause_parts, " AND ")

	local args = {
		where = where_clause
	}

	result = cargo.query( tables, fields, args )
	count = result[1][fields] or '0'

	return tonumber(count)
end

function p._countImages_GallerySectionBBRadio(params)
	tables = 'Files,BBRadio_Cuts'
	fields = 'COUNT(Files._pageName)'
	join_on = 'Files._pageName=BBRadio_Cuts._pageName'

	where_clause = 'Files.Characters HOLDS "' .. html_escape(character) .. '" AND BBRadio_Cuts.Season="' .. frame.args[2] .. '"'

	local args = {
		where = where_clause,
		join = join_on
	}

	result = cargo.query( tables, fields, args )
	count = result[1][fields] or '0'

	return tonumber(count)
end

function p._expandTemplate_GallerySectionCargo(frame, params)
	_character = params.character or ''
	_source = params.source or ''
	_section = params.section or ''
	_limit = tonumber(params.limit) or 4
	_title = params.title or ''
	_header = params.header or ''
	_see_all = params.see_all or ''
	_see_cameos = params.see_cameos or ''
	_count_all = params.count_all or ''
	
	gallery = frame:expandTemplate{ title = 'Gallery Section (Cargo)', args = { 
		character = _character,
		source = _source,
		section = _section,
		limit = _limit,
		title = _title,
		header = _header,
		see_all = _see_all,
		see_cameos = _see_cameos,
		count_all = _count_all,
		count_cameos = _count_cameos
	}}

	return gallery
end

function p._expandTemplate_GallerySectionBBRadio(frame, params)
	_character = params.character or ''
	_season = params.season or ''
	_episode = params.episode or ''
	_header = params.header or ''
	_title = params.title or ''
	_limit = tonumber(params.limit) or 4
	_widths = tonumber(params.widths) or 250
	_count_all = params.count_all or ''

	gallery = frame:expandTemplate { tile = 'Gallery Section (BBRadio)', args = {
		_character,
		_season,
		_episode,
		_header,
		_title,
		widths = _widths,
		limit = _limit,
		count_all = _count_all
	}}
end

function p.testExpandTemplate_1(frame)
	
	v = {
		character = 'Noel Vermillion',
		source = 'BlazBlue: Central Fiction', 
		section = '', 
		limit = 8, 
		title = 'title', 
		header = 'h3', 
		see_all = 'y', 
		see_cameos = 'y', 
		count_all = '7'
	}
	text = p._expandTemplate_GallerySectionCargo(frame, v)
	
	return text
end

function p.testExpandTemplate_2(frame)
	
	v = {
		character = 'Noel Vermillion',
		season = 'NEO', 
		limit = 8, 
		title = 'title', 
		header = 'h3', 
		see_all = 'y', 
		count_all = '7',
	}
	text = p._expandTemplate_GallerySectionBBRadio(frame, v)
	
	return text
end

-- concat all the strings in table s together with the given delimiter
function concatvalues(s,delimiter)
    local t = { }
    for k,v in ipairs(s) do
        t[#t+1] = tostring(v)
    end
    return table.concat(t,delimiter)
end

-- concat all the strings in table s together with the given delimiter
-- skips blank entries (where value v = "")
function concatvaluesonly(s,delimiter)
    local t = { }
    for k,v in ipairs(s) do
    	if not (v == '') then
    		t[#t+1] = tostring(v)
    	end
    end
    return table.concat(t,delimiter)
end

function quote_escape(s)
	return (string.gsub(s, "[\"']", {
		["\'"] = "\\'",
		['\"'] = '\\"'
	}))
end

function html_escape(s)
    return (string.gsub(s, "[<>\"'/ ,]", {
        ["<"] = "%3C",
        [">"] = "%3E",
        ['"'] = "%22",
        ["'"] = "%27",
        ["/"] = "%2F",
        [" "] = "+",
        [","] = "%2C"
    }))
end

-- helpful for printing tables
function dump(o)
   if type(o) == 'table' then
      local s = '{ '
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
         s = s .. '['..k..'] = ' .. dump(v) .. ','
      end
      return s .. '} '
   else
      return tostring(o)
   end
end

return p