More actions
m (fixes a bug where sections using Template:Gallery Section displayed a header even if there were no images to show) |
(add additional template parameter "Header" and fix Gallery Sections not showing up) |
||
Line 16: | Line 16: | ||
if params == '' then | if params == '' then | ||
else | else | ||
t_section = {} | |||
t_galleries = {} | |||
images_in_section = 0 | |||
current_subheader = '' | |||
-- add a wrapper div if there's a class to apply to the section | |||
class = params.class or '' | class = params.class or '' | ||
if class | if class ~= '' then | ||
table.insert(t_section, '<div class="' .. class .. '">') | |||
table.insert( | |||
end | end | ||
Line 67: | Line 70: | ||
if total_images > 0 then | if total_images > 0 then | ||
expanded_template = p._expandTemplate_GallerySectionCargo(frame, params) | expanded_template = p._expandTemplate_GallerySectionCargo(frame, params) | ||
table.insert( | table.insert(t_galleries, expanded_template) | ||
images_in_section = images_in_section + total_images | |||
end | end | ||
elseif template == 'Gallery Section (BBRadio)' then | elseif template == 'Gallery Section (BBRadio)' then | ||
Line 73: | Line 77: | ||
params.count_all = p._countImages_GallerySectionBBRadio(params) or 0 | params.count_all = p._countImages_GallerySectionBBRadio(params) or 0 | ||
expanded_template = p._expandTemplate_GallerySectionBBRadio(frame, params) | expanded_template = p._expandTemplate_GallerySectionBBRadio(frame, params) | ||
table.insert( | table.insert(t_galleries, expanded_template) | ||
images_in_section = images_in_section + params.count_all | |||
elseif template == 'Gallery Section' then | elseif template == 'Gallery Section' then | ||
params.count_all = p._countImages_GallerySection( | params.count_all = p._countImages_GallerySection(params) or 0 | ||
expanded_template = p._expandTemplate_GallerySection(frame, params) | expanded_template = p._expandTemplate_GallerySection(frame, params) | ||
table.insert( | table.insert(t_galleries, expanded_template) | ||
images_in_section = images_in_section + params.count_all | |||
elseif template == 'Header' then | |||
-- if this is not the first subheader in this section | |||
if current_subheader ~= '' then | |||
-- check if the previous subheader's galleries had images in them | |||
if images_in_section > 0 then | |||
-- insert the previous subheader into the section | |||
table.insert(t_section, current_subheader) | |||
-- insert the previous subheader's galleries into the section | |||
g = table.concat(t_galleries) | |||
if g ~= "" then | |||
table.insert(t_section, g) | |||
end | |||
-- reset galleries and images for the next subsection | |||
clear_table(t_galleries) | |||
images_in_section = 0 | |||
end | |||
end | |||
-- save the new subheader and wait to see if the following galleries have any images in them | |||
current_subheader = '<' .. params.header .. '>' .. params.title .. '</' .. params.header .. ">\n" | |||
end | end | ||
end | end | ||
if | -- check the number of images in the section | ||
mw.log(category .. " images_in_section = " .. images_in_section) | |||
-- if there is a subheader to insert, then insert it | |||
if current_subheader ~= "" and images_in_section > 0 then | |||
table.insert(t_section, current_subheader) | |||
end | |||
-- if there are galleries to insert, then insert them | |||
g = table.concat(t_galleries) | |||
if g ~= "" then | |||
table.insert(t_section, g) | |||
else | else | ||
table.insert( | mw.log("t_galleries is empty, with " .. images_in_section .. " images total in this section") | ||
end | |||
-- close the wrapping div if one was added | |||
if class ~= "" then | |||
table.insert(t_section, "</div>") | |||
end | end | ||
s = table.concat(t_section) | |||
if s ~= "" then | |||
if | -- insert the section, prepended by the section header, to the final text | ||
table.insert(text, '<h2>' .. category .. '</h2>\n' .. s) | |||
-- insert the section, prepended by | |||
table.insert(text, '<h2>' .. category .. '</h2>\n' .. | |||
end | end | ||
end | end | ||
Line 155: | Line 196: | ||
end | end | ||
function p._countImages_GallerySection( | function p._countImages_GallerySection(params) | ||
cat1 = params. | cat1 = params.character or '' | ||
cat2 = params. | cat2 = params.cat or '' | ||
cat3 = params. | cat3 = params.cat2 or '' | ||
local query = {} | |||
if cat1 | if cat1 ~= '' then table.insert(query, '[[Category:' .. cat1 .. ']]') end | ||
if cat2 | if cat2 ~= '' then table.insert(query, '[[Category:' .. cat2 .. ']]') end | ||
if cat3 | if cat3 ~= '' then table.insert(query, '[[Category:' .. cat3 .. ']]') end | ||
local result = mw.smw.getQueryResult( query ) | |||
count = result.meta.count or 0 | |||
return count | |||
end | end | ||
Revision as of 04:00, 2 November 2019
This page is part of an automated Gallery system. For more details, please refer to Help:Manual of Style/Character Pages/Gallery. See all pages included in this system |
This module creates a character gallery.
Please see Module:Character Gallery/data for the format of the character gallery and how to change it.
Usage
{{#invoke:Character Gallery|render|character=CHARACTER NAME}}
Lua Testing
frame={args={character="Es"}} p.main(frame)
local p = {}
local cargo = mw.ext.cargo
local galleryData = mw.loadData('Module:Character Gallery/data')
local ordering = galleryData.ordering
local sections = galleryData.sections
function p.render(frame)
text = {}
_char = frame.args['character'] or ''
for i,v in ipairs (ordering) do
category = v
params = sections[v] or ''
if params == '' then
else
t_section = {}
t_galleries = {}
images_in_section = 0
current_subheader = ''
-- add a wrapper div if there's a class to apply to the section
class = params.class or ''
if class ~= '' then
table.insert(t_section, '<div class="' .. class .. '">')
end
-- v is a table of templates in this section
for k2,v2 in pairs (params) do
template = v2.template or ''
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 ''
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.episode = v2.episode or ''
params.widths = v2.widths or ''
--Gallery Section
params.cat = v2.category or ''
params.cat2 = v2.category2 or ''
if template == 'Gallery Section (Cargo)' then
params.character = cargo_escape(params.character)
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_galleries, expanded_template)
images_in_section = images_in_section + total_images
end
elseif template == 'Gallery Section (BBRadio)' then
params.character = cargo_escape(params.character)
params.count_all = p._countImages_GallerySectionBBRadio(params) or 0
expanded_template = p._expandTemplate_GallerySectionBBRadio(frame, params)
table.insert(t_galleries, expanded_template)
images_in_section = images_in_section + params.count_all
elseif template == 'Gallery Section' then
params.count_all = p._countImages_GallerySection(params) or 0
expanded_template = p._expandTemplate_GallerySection(frame, params)
table.insert(t_galleries, expanded_template)
images_in_section = images_in_section + params.count_all
elseif template == 'Header' then
-- if this is not the first subheader in this section
if current_subheader ~= '' then
-- check if the previous subheader's galleries had images in them
if images_in_section > 0 then
-- insert the previous subheader into the section
table.insert(t_section, current_subheader)
-- insert the previous subheader's galleries into the section
g = table.concat(t_galleries)
if g ~= "" then
table.insert(t_section, g)
end
-- reset galleries and images for the next subsection
clear_table(t_galleries)
images_in_section = 0
end
end
-- save the new subheader and wait to see if the following galleries have any images in them
current_subheader = '<' .. params.header .. '>' .. params.title .. '</' .. params.header .. ">\n"
end
end
-- check the number of images in the section
mw.log(category .. " images_in_section = " .. images_in_section)
-- if there is a subheader to insert, then insert it
if current_subheader ~= "" and images_in_section > 0 then
table.insert(t_section, current_subheader)
end
-- if there are galleries to insert, then insert them
g = table.concat(t_galleries)
if g ~= "" then
table.insert(t_section, g)
else
mw.log("t_galleries is empty, with " .. images_in_section .. " images total in this section")
end
-- close the wrapping div if one was added
if class ~= "" then
table.insert(t_section, "</div>")
end
s = table.concat(t_section)
if s ~= "" then
-- insert the section, prepended by the section header, to the final text
table.insert(text, '<h2>' .. category .. '</h2>\n' .. s)
end
end
end
gallery = table.concat(text)
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 = concatvalues(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'
_character = params.character or ''
_season = params.season or ''
mw.log(_character)
mw.log(_season)
where_clause = 'Files.Characters HOLDS "' .. _character .. '" AND BBRadio_Cuts.Season="' .. _season .. '"'
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._countImages_GallerySection(params)
cat1 = params.character or ''
cat2 = params.cat or ''
cat3 = params.cat2 or ''
local query = {}
if cat1 ~= '' then table.insert(query, '[[Category:' .. cat1 .. ']]') end
if cat2 ~= '' then table.insert(query, '[[Category:' .. cat2 .. ']]') end
if cat3 ~= '' then table.insert(query, '[[Category:' .. cat3 .. ']]') end
local result = mw.smw.getQueryResult( query )
count = result.meta.count or 0
return 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 ''
_count_cameos = params.count_cameos 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 { title = 'Gallery Section (BBRadio)', args = {
_character,
_season,
_episode,
_header,
_title,
widths = _widths,
limit = _limit,
count_all = _count_all
}}
return gallery
end
function p._expandTemplate_GallerySection(frame, params)
_character = params.character or ''
_cat = params.cat or ''
_cat2 = params.cat2 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 0
gallery = frame:expandTemplate { title = 'Gallery Section', args = {
_character,
_cat,
_cat2,
_header,
_title,
widths = _widths,
limit = _limit,
count_all = _count_all,
}}
return gallery
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
function p.testOrdering()
for i,v in ipairs (ordering) do
section = v
k = sections[v] or ''
mw.log('\n' .. i .. ': ' .. section)
if k == '' then
mw.log('no parameters found')
else
mw.log(k.class)
for k2,v2 in pairs (k) do
mw.log(k2)
end
end
end
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
-- remove characters that can mess up cargo queries
function cargo_escape(s)
return (string.gsub(s, "['\"]", {
["'"] = "",
['"'] = "",
}))
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