Módulu:Imaxe múltiple

Esti módulu permite estructurar la plantía de imaxe múltiple.

Funciones

Pa que nun exista conflictu colos múltiples artículos qu'usen la plantía, el módulu tien los mesmos parámetros de la plantía (ver la documentación) y tamién reconoz los que tean n'inglés y castellanu.

Sí  foto(n)imaxe(n)image(n).
Sí  testu(n)texto(n)caption(n).
Sí  alliniamientu_testu(n)alineación_texto(n)caption_align(n).
Sí  anchor_totalanchu_totalancho_totaltotal_width.
Sí  anchor(n)anchu(n)ancho(n)width(n).
Sí  altor(n)alto(n)height(n).
Sí  posición_tablaalign.
Sí  direicióndireccióndirection.
Sí  color de fonducolor de fondobackground color.
Sí  títulutítulotitleheader.
Sí  posición_títuluposición_títuloheader_align.
Sí  fondu_de_títulufondo_de_títuloheader_background.
Sí  testutextopie_imagenfooter.
Sí  posiciónfooter_align.
Sí  fondu_de_testufondo_de_textofooter_background.


Sí  alt: Por default.
Sí  link: Analizar la posibilida de cambialo a enllaz (anque les imáxenes corrientes tamién usen |link=).

-- implements [[plantía:imaxe múltiple]]
local p = {}

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

local function renderImageCell(image, width, height, link, alt, caption, textalign, istyle) 
	local root = mw.html.create('')
	
	local altstr = '|alt=' .. (alt or '')
	local linkstr = link and ('|link=' .. link) or ''
	local widthstr = '|' .. tostring(width) .. 'px'
	
	local imagediv = root:tag('div')
	imagediv:addClass('thumbimage')
	imagediv:cssText(istyle)
	if( height ) then
		imagediv:css('height', tostring(height) .. 'px')
		imagediv:css('overflow', 'hidden')
	end
	imagediv:wikitext('[[Ficheru:' .. image .. widthstr .. linkstr .. altstr .. ']]')
	if isnotempty(caption) then
		local captiondiv = root:tag('div')
		captiondiv:addClass('thumbcaption')
		captiondiv:css('clear', 'left')
		if isnotempty(textalign) then
			captiondiv:css('text-align', textalign)
		end
		captiondiv:wikitext(caption)
	end
	return tostring(root)
end

local function getWidth(w1, w2)
	local w
	if isnotempty(w1) then
		w = tonumber(w1)
	elseif isnotempty(w2) then
		w = tonumber(w2)
	end
	return w or 200
end
local function getPerRow(pstr, ic)
	-- split string into array using any non-digit as a dilimiter
	local pr = mw.text.split(pstr or '', '[^%d][^%d]*')
	-- if split failed, assume a single row
	if (#pr < 1) then
		pr = {tostring(ic)}
	end
	-- convert the array of strings to an array of numbers,
	-- adding any implied/missing numbers at the end of the array
	local r = 1
	local thisrow = tonumber(pr[1] or ic) or ic
	local prownum = {}
	while( ic > 0 ) do
		prownum[r] = thisrow
		ic = ic - thisrow
		r = r + 1
		-- use the previous if the next is missing and 
		-- make sure we don't overstep the number of images
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)
	end
	return prownum
	
end

local function renderMultipleImages(frame)
	local pargs = frame:getParent().args
	local args = frame.args
	local width = pargs['anchu'] or pargs['anchor'] or pargs['ancho'] or pargs['width'] or ''
	local dir = pargs['direición'] or pargs['dirección'] or pargs['direction'] or ''
	local align = pargs['posición_tabla'] or pargs['align'] or args['align'] or ''
	local captionalign = pargs['alliniamientu_testu'] or pargs['alineación_texto'] or pargs['caption_align'] or args['caption_align'] or ''
	local totalwidth = pargs['anchor_total'] or pargs['anchu_total'] or pargs['ancho_total'] or pargs['total_width'] or args['total_width'] or ''
	local imgstyle = pargs['image_style'] or args['image_style']
	local header = pargs['títulu'] or pargs['título'] or pargs['title'] or pargs['header'] or ''
	local footer = pargs['pie_imaxe'] or pargs['pie_imagen'] or pargs['testu'] or pargs['texto'] or pargs['footer'] or ''
	local perrow = nil
	local thumbclass = {
		["left"] = 'tleft',
		["none"] = 'tnone',
		["center"] = 'tnone',
		["centre"] = 'tnone',
		["right"] = 'tright'
		}

	-- find all the nonempty images
	local imagenumbers = {}
	local imagecount = 0
	for k, v in pairs( pargs ) do
		local i = tonumber(tostring(k):match( '^%s*imaxe([%d]+)%s*$' ) or tostring(k):match( '^%s*image([%d]+)%s*$' ) or tostring(k):match( '^%s*foto([%d]+)%s*$' )  or tostring(k):match( '^%s*semeya([%d]+)%s*$' ) or '0')
		if( i > 0 and isnotempty(v) ) then
			table.insert( imagenumbers, i)
			imagecount = imagecount + 1
		end
	end

	-- sort the imagenumbers
	table.sort(imagenumbers)

	-- create an array with the number of images per row
	perrow = getPerRow(dir == 'vertical' and '1' or pargs['perrow'], imagecount)
	
	-- compute the number of rows
	local rowcount = #perrow

	-- store the image widths and compute row widths and maximum row width
	local widths = {}
	local widthmax = 0
	local widthsum = {}
	local k = 0
	for r=1,rowcount do
		widthsum[r] = 0
		for c=1,perrow[r] do
			k = k + 1
			if( k <= imagecount ) then
				local i = imagenumbers[k]
				widths[k] = getWidth(width, pargs['width' .. i] or pargs['anchu' .. i] or pargs['anchor' .. i] or pargs['ancho' .. i])
				widthsum[r] = widthsum[r] + widths[k]
			end
		end
		widthmax = math.max(widthmax, widthsum[r])
	end
	
	-- if total_width has been specified, rescale the image widths
	local heights = {}
	if( isnotempty(totalwidth) ) then
		totalwidth = tonumber(totalwidth)
		widthmax = 0
		local k = 0
		for r=1,rowcount do
			local koffset = k
			local tw = totalwidth - 4 * (perrow[r] - 1) - 12
			local ar = {}
			local arsum = 0
			for j=1,perrow[r] do
				k = k + 1
				if( k<= imagecount ) then
					local i = imagenumbers[k]
					local h = tonumber( pargs['height' .. i] or pargs['alto' .. i] or '' ) or 0
					if (h > 0) then
						ar[j] = widths[k]/h
						heights[k] = h
					else
						ar[j] = widths[k]/100
					end
					arsum = arsum + ar[j]
				end
			end
			local ht = tw/arsum
			local ws = 0
			k = koffset
			for j=1,perrow[r] do
				k = k + 1
				if( k<= imagecount ) then
					local i = imagenumbers[k]
					widths[k] = math.floor(ar[j]*ht + 0.5)
					ws = ws + widths[k]
					if heights[k] then
						heights[k] = math.floor(ht)
					end
				end
			end
			widthsum[r] = ws
			widthmax = math.max(widthmax, widthsum[r])
		end
	end	

	-- start building the array of images, if there are images
	if( imagecount > 0 ) then
		-- compute width of outer div
		local bodywidth = 0
		for r=1,rowcount do
			if( widthmax == widthsum[r] ) then
				bodywidth = widthmax + 4 * (perrow[r] - 1) + 12
			end
		end
		-- The body has a min-width of 100, which needs to be taken into account on specific widths
		bodywidth = math.max( 100, bodywidth - 8);

		local bg = pargs['background color'] or pargs['color de fondo'] or pargs['color de fondu'] or pargs['fondu'] or ''
		-- create the array of images
		local root = mw.html.create('div')
		root:addClass('thumb')
		root:addClass('tmulti')
		root:addClass(thumbclass[align] or 'tright')

		if( align == 'center' or align == 'centre' ) then
			root:addClass('center')
		end
		if( pargs['margin_top'] or args['margin_top']) then
			root:css('margin-top', pargs['margin_top'] or args['margin_top'])
		end
		if( pargs['margin_bottom'] or args['margin_bottom']) then
			root:css('margin-bottom', pargs['margin_bottom'] or args['margin_bottom'])
		end
		if( bg ~= '' ) then
			root:css('background-color', bg)
		end

		local div = root:tag('div')
		div:addClass('thumbinner')
		div:css('width', tostring(bodywidth) .. 'px')
			:css('max-width', tostring(bodywidth) .. 'px')
		if( bg ~= '' ) then
			div:css('background-color', bg)
		end
		-- add the header
		if( isnotempty(header) ) then
			div:tag('div')
				:css('clear', 'both')
				:css('font-weight', 'bold')
				:css('text-align', pargs['posición_títulu'] or pargs['posición_título'] or pargs['header_align'] or 'center')
				:css('background-color', pargs['fondu_de_títulu'] or pargs['fondo_de_título'] or pargs['header_background'] or pargs['fondu'] or 'transparent')
				:wikitext(header)
		end
		-- loop through the images
		local k = 0
		for r=1,rowcount do
			for j=1,perrow[r] do
				k = k + 1
				if( k <= imagecount ) then
					local imagediv = div:tag('div')
					imagediv:addClass('tsingle')
					if dir ~= 'vertical' then
						imagediv:css('float', 'left')
					end
					if bg ~= '' then
						imagediv:css('background-color', bg);
					end
					imagediv:css('margin', '1px')
					local i = imagenumbers[k]
					local img = pargs['imaxe' .. i] or pargs['image' .. i] or pargs['foto' .. i] or pargs['semeya' .. i]
					local w = widths[k]
					imagediv:css('width', tostring(2 + w) .. 'px')
						:css('max-width', tostring(2 + w) .. 'px')
					imagediv:wikitext(renderImageCell(img, w, heights[k], 
						pargs['link' .. i], pargs['alt' .. i],
						pargs['caption' .. i] or pargs['texto' .. i] or pargs['testu' .. i], 
						pargs['captionalign' .. i] or pargs['alineación_texto' .. i] or pargs['alliniamientu_testu' .. i], imgstyle))
				end
			end
			-- only float content gives a parent height:0, so add a clearing div
			if dir ~= 'vertical' then
				div:tag('div')
					:css('clear', 'left')
			end
		end
		-- add the footer
		if( isnotempty(footer) ) then
			div:tag('div')
				:addClass('thumbcaption')
				:css('clear', 'left')
				:css('text-align', pargs['posición'] or pargs['footer_align'] or args['footer_align'] or 'left')
				:css('background-color', pargs['fondu_de_testu'] or pargs['fondo_de_texto'] or pargs['footer_background'] or pargs['fondu'] or 'transparent')
				:wikitext(footer)
		end
		return tostring(root)
	end
	return ''
end

function p.render( frame )
    return renderMultipleImages( frame )
end
 
return p