Module:Gallery: Difference between revisions

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