Module:Gallery: Difference between revisions

From CivWiki
Jump to navigation Jump to search
Content added Content deleted
(simplify with one parameter, state, which when set will make the gallery collapsible with collapsed state = state)
m (49 revisions imported from wikipedia:Module:Gallery)
 
(42 intermediate revisions by 11 users not shown)
Line 3: Line 3:
local p = {}
local p = {}


local HtmlBuilder = require('Module:HtmlBuilder')
local templatestyles = 'Module:Gallery/styles.css'
local yesno = require('Module:Yesno')


function trim(s)
local function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
return mw.ustring.gsub(mw.ustring.gsub(s, '%s', ' '), '^%s*(.-)%s*$', '%1')
end
end


local function _gallery(args)
local tracking, preview
local tbl = HtmlBuilder.create('table')
if args.state then
tbl.css('width', '100%')
tbl.addClass('collapsible')
tbl.addClass(args.state)
end
if args.style then
tbl.cssText(args.style)
else
tbl
.css('background', 'transparent')
.css('border', '1px solid #f0f0f0')
.css('margin-top', '0.5em')
end
if args.align then
tbl.attr('align', args.align)
end
if args.title then
tbl
.tag('tr')
.tag('th')
.attr('colspan', 10)
.css('text-align', 'center')
.css('font-weight', 'bold')
.wikitext(args.title)
end
local mainCell = tbl.tag('tr').tag('td')
local imageCount = math.ceil(#args / 2)
local cellWidth = tonumber(args.cellwidth) or tonumber(args.width) or 180
local imgHeight = tonumber(args.height) or 180
local lines = tonumber(args.lines) or 2
for i = 1, imageCount do
local img = trim(args[i*2 - 1] or '')
local caption = trim(args[i*2] or '')
local imgWidth = tonumber(args['width' .. i]) or tonumber(args.width) or 180
local alt = args['alt' .. i] or ''
local textWidth
if cellWidth < 30 then
textWidth = imgHeight + 27
else
textWidth = cellWidth + 7
end


local function checkarg(k,v)
if img ~= '' then
if k and type(k) == 'string' then
local imgTbl = mainCell.tag('table')
if k == 'align' or k == 'state' or k == 'style' or k == 'title' or
k == 'width' or k == 'height' or k == 'lines' or k == 'whitebg' or
imgTbl
k == 'mode' or k == 'footer' or k == 'perrow' or k == 'noborder' or
.css('width', (cellWidth + 20) .. 'px')
k:match('^alt%d+$') or k:match('^%d+$') then
.css('float', 'left')
-- valid
.css('border-collapse', 'collapse')
elseif k == 'captionstyle' then
.css('margin', '3px')
if not v:match('^text%-align%s*:%s*center[;%s]*$') then
.tag('tr')
table.insert(tracking, '[[Category:Pages using gallery with the captionstyle parameter]]')
.tag('td')
end
.css('height', (imgHeight + 20) .. 'px')
else
.css('border', '1px solid #CCCCCC')
-- invalid
.css('background-color', '#F8F8F8')
local vlen = mw.ustring.len(k)
.css('padding', '0px')
k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)
.css('text-align', 'center')
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
.wikitext(mw.ustring.format('[[%s|center|border|%dx%dpx|alt=%s|%s]]', img, imgWidth, imgHeight, alt, caption))
table.insert(tracking, '[[Category:Pages using gallery with unknown parameters|' .. k .. ']]')
.done()
table.insert(preview, '"' .. k .. '"')
.done()
end
.tag('tr')
end
.css('vertical-align', 'top')
.tag('td')
.css('display', 'block')
.css('font-size', '1em')
.css('height', (0.2 + 1.5*lines) .. 'em')
.css('padding', '0px')
.tag('div')
.addClass('gallerytext')
.css('height', (0.1 + 1.5*lines) .. 'em')
.css('width', textWidth .. 'px')
.css('line-height', '1.3em')
.css('padding', '2px 6px 1px 6px')
.css('overflow-y', 'auto')
.css('margin', '0px')
.css('border', 'none')
.css('border-width', '0px')
.wikitext(caption .. '&nbsp;')
end
end
if args.footer then
tbl
.tag('tr')
.tag('td')
.attr('colspan', 10)
.css('text-align', 'right')
.css('font-size', '80%')
.css('line-height', '1em')
.wikitext(args.footer)
end
return tostring(tbl)
end
end


function p.gallery(frame)
function p.gallery(frame)
-- If called via #invoke, use the args passed into the invoking template.
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs = (type(frame.getParent) == 'function') and frame:getParent().args or frame
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- ParserFunctions considers the empty string to be false, so to preserve the previous
Line 128: Line 43:
-- them false too.
-- them false too.
local args = {}
local args = {}
tracking, preview = {}, {}
for k, v in pairs(origArgs) do
for k, v in pairs(origArgs) do
if v ~= '' then
if v ~= '' then
args[k] = v
args[k] = v
end
checkarg(k,v)
end
end
end
if (args.mode or '') == 'packed' and (args.align or '') == '' then
args.align = 'center'
end


local tbl = mw.html.create('div')
return _gallery(args)
tbl:addClass('mod-gallery')
if args.state then
tbl
:addClass('mod-gallery-collapsible')
:addClass('collapsible')
:addClass(args.state)
end
if args.style then
tbl:cssText(args.style)
else
tbl:addClass('mod-gallery-default')
end
if args.align then
tbl:addClass('mod-gallery-' .. args.align:lower())
end

if args.title then
tbl:tag('div')
:addClass('title')
:tag('div')
:wikitext(args.title)
end
local gargs = {}
gargs['class'] = 'nochecker' .. (args.noborder and '' or ' bordered-images')
gargs['widths'] = tonumber(args.width) or 180
gargs['heights'] = tonumber(args.height) or 180
gargs['style'] = args.captionstyle
gargs['perrow'] = args.perrow
gargs['mode'] = args.mode
if yesno(args.whitebg or 'yes') then
gargs['class'] = gargs['class'] .. ' whitebg'
end
local gallery = {}
local imageCount = math.ceil(#args / 2)

for i = 1, imageCount do
local img = trim(args[i*2 - 1] or '')
local caption = trim(args[i*2] or '')
local alt = trim(args['alt' .. i] or '')
if img ~= '' then
table.insert(gallery, img .. (alt ~= '' and ('|alt=' .. alt) or '') .. '|' .. caption )
end
end
tbl:tag('div')
:addClass('main')
:tag('div')
:wikitext(
frame:extensionTag{ name = 'gallery', content = '\n' .. table.concat(gallery,'\n'), args = gargs}
)
if args.footer then
tbl:tag('div')
:addClass('footer')
:tag('div')
:wikitext(args.footer)
end

local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''
if #preview > 0 then
trackstr = require('Module:If preview')._warning({
'Unknown parameters ' .. table.concat(preview, '; ') .. '.'
}) .. trackstr
end
return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(tbl) .. trackstr
end
end



Latest revision as of 03:35, 5 June 2021

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

-- This module implements {{gallery}}

local p = {}

local templatestyles = 'Module:Gallery/styles.css'
local yesno = require('Module:Yesno')

local function trim(s)
	return mw.ustring.gsub(mw.ustring.gsub(s, '%s', ' '), '^%s*(.-)%s*$', '%1')
end

local tracking, preview

local function checkarg(k,v)
	if k and type(k) == 'string' then
		if k == 'align' or k == 'state' or k == 'style' or k == 'title' or
			k == 'width' or k == 'height' or k == 'lines' or k == 'whitebg' or
			k == 'mode' or k == 'footer' or k == 'perrow' or k == 'noborder' or
			k:match('^alt%d+$') or k:match('^%d+$') then
			-- valid
		elseif k == 'captionstyle' then
			if not v:match('^text%-align%s*:%s*center[;%s]*$') then
				table.insert(tracking, '[[Category:Pages using gallery with the captionstyle parameter]]')
			end
		else
			-- invalid
			local vlen = mw.ustring.len(k)
			k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25) 
			k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
			table.insert(tracking, '[[Category:Pages using gallery with unknown parameters|' .. k .. ']]')
			table.insert(preview, '"' .. k .. '"')
		end
	end
end

function p.gallery(frame)
	-- If called via #invoke, use the args passed into the invoking template.
	-- Otherwise, for testing purposes, assume args are being passed directly in.
	local origArgs = (type(frame.getParent) == 'function') and frame:getParent().args or frame
    
    -- ParserFunctions considers the empty string to be false, so to preserve the previous 
    -- behavior of {{gallery}}, change any empty arguments to nil, so Lua will consider
    -- them false too.
    local args = {}
    tracking, preview = {}, {}
    for k, v in pairs(origArgs) do
    	if v ~= '' then
    		args[k] = v
    		checkarg(k,v)
    	end
	end
	
	if (args.mode or '') == 'packed' and (args.align or '') == '' then
		args.align = 'center'
	end

	local tbl = mw.html.create('div')
	tbl:addClass('mod-gallery')
    
	if args.state then
		tbl
			:addClass('mod-gallery-collapsible')
			:addClass('collapsible')
			:addClass(args.state)
	end
	
	if args.style then
		tbl:cssText(args.style)
	else
		tbl:addClass('mod-gallery-default')
	end
	
	if args.align then
		tbl:addClass('mod-gallery-' .. args.align:lower())
	end

	if args.title then
		tbl:tag('div')
			:addClass('title')
				:tag('div')
					:wikitext(args.title)
	end
	
	local gargs = {}
	gargs['class'] = 'nochecker' .. (args.noborder and '' or ' bordered-images')
	gargs['widths'] = tonumber(args.width) or 180
	gargs['heights'] = tonumber(args.height) or 180
	gargs['style'] = args.captionstyle
	gargs['perrow'] = args.perrow
	gargs['mode'] = args.mode
	if yesno(args.whitebg or 'yes') then
		gargs['class'] = gargs['class'] .. ' whitebg'
	end
	
	local gallery = {}
	
	local imageCount = math.ceil(#args / 2)

    for i = 1, imageCount do
		local img = trim(args[i*2 - 1] or '')
		local caption = trim(args[i*2] or '')
		local alt = trim(args['alt' .. i] or '')
		if img ~= '' then
			table.insert(gallery, img .. (alt ~= '' and ('|alt=' .. alt) or '') .. '|' .. caption )
		end
	end
	
	tbl:tag('div')
		:addClass('main')
		:tag('div')
			:wikitext(
				frame:extensionTag{ name = 'gallery', content = '\n' .. table.concat(gallery,'\n'), args = gargs}
				)
    
	if args.footer then
		tbl:tag('div')
			:addClass('footer')
				:tag('div')
					:wikitext(args.footer)
	end

	local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''
	if #preview > 0 then
		trackstr = require('Module:If preview')._warning({
			'Unknown parameters ' .. table.concat(preview, '; ') .. '.'
		}) .. trackstr
	end
	
	return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(tbl) .. trackstr
end

return p