# Module:Photo montage

-- implements template:photomontage  
local p = {}  

local function isnotempty(s)  
return s and s:match( '^%s*(.-)%s*$' ) ~= ''  
end  

local function photomontage  
local tracking = ''  
local args = :getParent.args  
local size = tonumber(args['size'] or '200') or 200  
local = tonumber(args[''] or '1') or 1  
local spacing = tonumber(args['spacing'] or '1') or 1  
local color = args['color'] or 'black'  
local color_border = args['color_border'] or 'black'  
local position = (args['position'] or ''):lower  
local caption = args['text'] or ''  
local text_background = isnotempty(args['text_background']) and args['text_background'] or '#F8F8FF'  
local foot_montage = args['foot_montage'] or ''  
local lastnum = nil  
local rownum = nil  
local floatstyle = nil  
if( position == * or position == * or position == '') then  
float .. position  
tracking = tracking .. ''  
else  
float  
end  
if isnotempty(foot_montage) then  
local div = mw.html.create('div')  
div:css('font-size', '95%')  
:wikitext(foot_montage)  
foot_montage = '\n' .. tostring(div)  
end  

local lettertonumber = {  
a = '01', b = '02', c = '03', d = '04', e = '05', f = '06', g = '07',  
h = '08', i = '09', j = '10', k = '11', l = '12', m = '13', n = '14',  
o = '15', p = '16', q = '17', r = '18', s = '19', t = '20', u = '21',  
v = '22', w = '23', x = '26', y = '27', z = '28' }  
local letters = {  
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',  
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'  
}  

-- find all the nonempty photo numbers  
local photos = {}  
local photocount = 0  
for k, v in pairs( args ) do  
local i = tonumber(tostring(k):match( '^%s*photo([%d]+)[a-z]%s*$' ) or '0')  
if( i > 0 and isnotempty(v) ) then  
local c = lettertonumber[tostring(k):match( '^%s*photo[%d]+([a-z])%s*$' )]  
table.insert( photos, tonumber(i .. '.' .. c ) )  
photocount = photocount + 1  
end  
end  
-- sort the photo numbers  
table.sort(photos)  

-- compute the number of the photos in each row  
local count = {}  
lastnum = -1  
rownum = 0  
for k=1,photocount do  
local num = math.floor(photos[k])  
if(num == lastnum) then  
count[rownum] = count[rownum] + 1  
else  
rownum = rownum + 1  
count[rownum] = 1  
end  
lastnum = num  
end  

if(photocount > 0) then  
-- start table  
root = mw.html.create('div')  
root  
:css('background-color', color)  
:css('-collapse', 'collapse')  
:css('', .. 'px solid ' .. color_border)  
:css('width', size .. 'px')  
:css('display', 'table')  
:cssText(floatstyle)  
local innercell = root  
:tag('div'):css('display', 'table-row')  
:tag('div'):css('display', 'table-cell')  
:css('-top', 0)  
:css('padding', spacing .. 'px 0 0 ' .. spacing .. 'px')  

-- loop over the photos  
lastnum = -1  
rownum = 0  
local row  
for k=1,photocount do  
local num = math.floor(photos[k])  
local c = letters[math.floor(0.5 + 100*(photos[k] - num))]  
if(num ~= lastnum) then  
rownum = rownum + 1  
row = innercell  
:tag('div'):css('display', 'table')  
:css('background-color', color)  
:css('-collapse', 'collapse')  
:tag('div'):css('display', 'table-row')  
end  
local altstr = (args['alt' .. num .. c] or *) ~= * and  
'|alt=' .. args['alt' .. num .. c] or ''  
local image = string.format( '',  
args['photo' .. num .. c], altstr,  
(size - spacing*(count[rownum] - 1))/count[rownum] )  
row  
:tag('div'):css('display', 'table-cell')  
:css('-top', 0)  
:css('padding', '0 ' .. spacing .. 'px ' .. spacing .. 'px ' .. '0')  
:wikitext(image)  
lastnum = num  
end  
if isnotempty(caption) then  
root  
:tag('div'):css('display', 'table-row')  
:tag('div'):css('display', 'table-cell')  
:addClass('thumbcaption')  
:css('background-color', text_background)  
:css('font-size', '95%')  
:wikitext(caption)  
end  
-- end table  
end  
if photocount < 2 then  
tracking = tracking .. ''  
end  
return tostring(root or '') .. foot_montage .. tracking  
end  

function p.montage  
return photomontage  
end  

return p