Module : Photo montage

Permanently protected module
From Wikipedia, the free encyclopedia

-- implements [[template:photomontage]]

local
 p
 =
 {}

 
local
 function
 isnotempty
(
s
)

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

end


local
 function
 photomontage
(
 frame
 )

	local
 tracking
 =
 ''

	local
 args
 =
 frame
:
getParent
().
args

	local
 size
 =
 tonumber
(
args
[
'size'
]
 or
 '200'
)
 or
 200

	local
 border
 =
 tonumber
(
args
[
'border'
]
 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
 ==
 'left'
 or
 position
 ==
 'right'
 or
 position
 ==
 'none'
)
 then

		floatstyle
 =
 'float:'
 ..
 position

		tracking
 =
 tracking
 ..
 '[[Category:Pages using photo montage without center alignment|'
 ..
 position
 ..
 ']]'

	else

		floatstyle
 =
 'margin-left: auto; margin-right: auto;'

	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
(
'border-collapse'
,
 'collapse'
)

		:
css
(
'border'
,
 border
 ..
 '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
(
'border-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
(
'border-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
(
 '[[File:%s%s|%dpx]]'
,

			args
[
'photo'
 ..
 num
 ..
 c
],
 altstr
,

			(
size
 -
 spacing
*
(
count
[
rownum
]
 -
 1
))
/
count
[
rownum
]
 )

		row

			:
tag
(
'div'
):
css
(
'display'
,
 'table-cell'
)

				:
css
(
'border-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
 ..
 '[[Category:Pages using photo montage with one or fewer images|'
 ..
 photocount
 ..
']]'

	end

    return
 tostring
(
root
 or
 ''
)
 ..
 foot_montage
 ..
 tracking

end


function
 p
.
montage
(
 frame
 )

    return
 photomontage
(
 frame
 )

end

 
return
 p