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)
(convert some spaces to tabs, backend now uses tabs for indentation)
Line 6: Line 6:


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


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


if img ~= '' then
if img ~= '' then
local imgTbl = mainCell.tag('table')
local imgTbl = mainCell.tag('table')
imgTbl
imgTbl
.css('width', (cellWidth + 20) .. 'px')
.css('width', (cellWidth + 20) .. 'px')
.css('float', 'left')
.css('float', 'left')
.css('border-collapse', 'collapse')
.css('border-collapse', 'collapse')
.css('margin', '3px')
.css('margin', '3px')
.tag('tr')
.tag('tr')
.tag('td')
.tag('td')
.css('height', (imgHeight + 20) .. 'px')
.css('height', (imgHeight + 20) .. 'px')
.css('border', '1px solid #CCCCCC')
.css('border', '1px solid #CCCCCC')
.css('background-color', '#F8F8F8')
.css('background-color', '#F8F8F8')
.css('padding', '0px')
.css('padding', '0px')
.css('text-align', 'center')
.css('text-align', 'center')
.wikitext(mw.ustring.format('[[%s|center|border|%dx%dpx|alt=%s|%s]]', img, imgWidth, imgHeight, alt, caption))
.wikitext(mw.ustring.format('[[%s|center|border|%dx%dpx|alt=%s|%s]]', img, imgWidth, imgHeight, alt, caption))
.done()
.done()
.done()
.done()
.tag('tr')
.tag('tr')
.css('vertical-align', 'top')
.css('vertical-align', 'top')
.tag('td')
.tag('td')
.css('display', 'block')
.css('display', 'block')
.css('font-size', '1em')
.css('font-size', '1em')
.css('height', (0.2 + 1.5*lines) .. 'em')
.css('height', (0.2 + 1.5*lines) .. 'em')
.css('padding', '0px')
.css('padding', '0px')
.tag('div')
.tag('div')
.addClass('gallerytext')
.addClass('gallerytext')
.css('height', (0.1 + 1.5*lines) .. 'em')
.css('height', (0.1 + 1.5*lines) .. 'em')
.css('width', textWidth .. 'px')
.css('width', textWidth .. 'px')
.css('line-height', '1.3em')
.css('line-height', '1.3em')
.css('padding', '2px 6px 1px 6px')
.css('padding', '2px 6px 1px 6px')
.css('overflow-y', 'auto')
.css('overflow-y', 'auto')
.css('margin', '0px')
.css('margin', '0px')
.css('border', 'none')
.css('border', 'none')
.css('border-width', '0px')
.css('border-width', '0px')
.wikitext(caption .. '&nbsp;')
.wikitext(caption .. '&nbsp;')
end
end
end
end
if args.footer then
if args.footer then
tbl
tbl
.tag('tr')
.tag('tr')
.tag('td')
.tag('td')
.attr('colspan', 10)
.attr('colspan', 10)
.css('text-align', 'right')
.css('text-align', 'right')
.css('font-size', '80%')
.css('font-size', '80%')
.css('line-height', '1em')
.css('line-height', '1em')
.wikitext(args.footer)
.wikitext(args.footer)
end
end
return tostring(tbl)
return tostring(tbl)
end
end


function p.gallery(frame)
function p.gallery(frame)
local origArgs
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
origArgs = frame:getParent().args
else
else
origArgs = frame
origArgs = frame
end
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 129: Line 129:
local args = {}
local args = {}
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
end
end
end


return _gallery(args)
return _gallery(args)
end
end



Revision as of 16:47, 13 November 2013

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

-- This module implements {{gallery}}

local p = {}

local HtmlBuilder = require('Module:HtmlBuilder')

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

local function _gallery(args)
	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

		if img ~= '' then
			local imgTbl = mainCell.tag('table')
            
			imgTbl
				.css('width', (cellWidth + 20) .. 'px')
				.css('float', 'left')
				.css('border-collapse', 'collapse')
				.css('margin', '3px')
				.tag('tr')
					.tag('td')
						.css('height', (imgHeight + 20) .. 'px')
						.css('border', '1px solid #CCCCCC')
						.css('background-color', '#F8F8F8')
						.css('padding', '0px')
						.css('text-align', 'center')
						.wikitext(mw.ustring.format('[[%s|center|border|%dx%dpx|alt=%s|%s]]', img, imgWidth, imgHeight, alt, caption))
						.done()
					.done()
				.tag('tr')
					.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

function p.gallery(frame)
	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.
	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 
    -- behavior of {{gallery}}, change any empty arguments to nil, so Lua will consider
    -- them false too.
    local args = {}
    for k, v in pairs(origArgs) do
    	if v ~= '' then
    		args[k] = v
    	end
    end

	return _gallery(args)
end

return p