Mô đun:Overlay

-- Mô đun này thực hiện Bản mẫu:Overlay
local p = {}
local mArguments = require('Mô đun:Arguments')
-- used to cache the calculated font color to avoid repeat calculations
local previous_backgroundcolor = 
local fontcolor = 
local function buildicon(n, form, lk, c, t)
	local res
	if form == 'text' then
		return tostring(
				mw.html.create('span')
					:css('font-weight', 'bold')
					:css('color', c)
					:wikitext(n)
				)
	elseif form == 'color' or form == 'colour' then
		return tostring(
				mw.html.create('span')
					:css('background-color', c)
					:wikitext('  ')
				)
	else
		-- check if the color is difference from the previous color
		if c ~= previous_backgroundcolor then
			-- color changed, so look up the best font color
			local greatercontrast = require('Mô đun:Color contrast')._greatercontrast
			fontcolor = greatercontrast{c, 'white', 'black', bias = 1.3}
			-- update the previous value for the next check
			previous_backgroundcolor = c
		end
		-- build the inner span for the icon
		local span = mw.html.create('span')
			:css('color', fontcolor)
			:css('font-size', '88%')
			:css('font-weight', 'bold')
			:attr('title', t)
			:wikitext(n)
		-- build the outer div
		local div = mw.html.create('div')
			:css('display', 'inline-block')
			:css('width', 'auto')
			:css('height', 'auto')
			:css('text-align', 'center')
			:css('padding', ((tonumber(n) or 0)  -1 then
			table.insert(itemnums, i)
		else
			i = tonumber(tostring(k):match( '^%s*overlay(%d+)tip%s*$' ) or '-1')
			if i > -1 then
				table.insert(itemnums, i)
			end
		end
	end
	-- sort to process in order
	table.sort( itemnums )
	
	-- remove duplicates
	for k = 2,#itemnums do
		if itemnumsk == itemnumsk-1 then
			table.remove(itemnums, k)
		end
	end
	-- build the overlay markers and text
	itemdata = {}
	local colori = args'color' or args'colour' or 'red'
	local formi = 	
	for k = 1,#itemnums do
		local i = itemnumsk
		formi = args'overlay' .. i .. 'form' or formi
		colori = args'overlay' .. i .. 'color' or args'overlay' .. i .. 'colour' or colori
		local linki = args'overlay' .. i .. 'link' or 
		local tipi = args'overlay' .. i .. 'tip' or args'overlay' .. i or 
		local overlayi = args'overlay' .. i or args'overlay' .. i .. 'tip' or 
		if (overlayi ~=  or tipi ~= ) then
			local imagei = buildicon(i, formi, linki, colori, tipi)
			itemdatak = buildlegenditem(imagei, args'overlay' .. i .. 'link' or , overlayi)
		end
	end
	-- create the overlay image
	if image ~=  then
		local cell = root:tag('tr'):tag('td')
		cell:attr('align', 'center')
		if( padding ~=  ) then
			cell:css('padding', padding)
		end
		if( columns > 1 and legendbox == 'yes' ) then
			cell:attr('colspan', columns)
		end
		local imagediv = cell:tag('div')
		imagediv:css('position','relative')
			:css('left', '0px')
			:css('top', '0px')
			:css('width', ((grid == 'yes') and 940 or width) .. 'px')
			:css('height', ((grid == 'yes') and 940 or height) .. 'px')
		if grid == 'yes' then
			imagediv:tag('span')
				:css('position', 'absolute')
				:css('left', '0px')
				:css('top', '0px')
				:css('z-index', '2')
				:wikitext('940px')
		end
		imagediv:tag('span')
			:css('position', 'absolute')
			:css('left', '0px')
			:css('top', '0px')
			:css('z-index', '0')
			:css('width', width .. 'px')
			:css('height', height .. 'px')
			:wikitext( .. width .. 'x' .. height .. 'px')
		if overlay == 'yes' then
			for k = 1,#itemnums do
				local i = itemnumsk
				local imagei = (itemdatak)1
				for j =0,3 do
					local overlayileftj = args'overlay' .. i .. 'left' .. ((j == 0) and  or j) or 
					local overlayitopj = args'overlay' .. i .. 'top' .. ((j == 0) and  or j) or 
					if overlayileftj ~=  then
						imagediv:tag('div')
							:css('position', 'absolute')
							:css('left', overlayileftj .. 'px')
							:css('top', overlayitopj .. 'px')
							:css('line-height', '95%')
							:css('z-index', '1')
							:wikitext(imagei)
					end
				end
			end
		end
	end
	-- Split the legend items into sub-legends
	legend = 
	local jmax = itemnums#itemnums
	for i=1,5 do
		if args'legend' .. i .. 'start' then
			-- default is all items
			j1 = 0
			j2 = jmax
			-- set start item number to (legendistart) or (legend(i-1)end + 1)
			if args'legend' .. i .. 'start' then
				j1 = tonumber(args'legend' .. i .. 'start') or j1
			elseif args'legend' .. (i-1) .. 'end' then
				j1 = (tonumber(args'legend' .. (i-1) .. 'end') or j1) + 1
			end
			-- set end item number to (legendiend) or (legend(i+1)start - 1)
			if args'legend' .. i .. 'end' then
				j2 = tonumber(args'legend' .. i .. 'end') or j2
			elseif args'legend' .. (i+1) .. 'start' then
				j2 = (tonumber(args'legend' .. (i+1) .. 'start') or j2) - 1
			end
			-- get the items within the range, marking them as they are used
			for k=1,#itemnums do
				j = itemnumsk
				if (j >= 0 and j >= j1 and j = 0 then
			table.insert(legend1, itemdatak)
		end
	end
	-- Build the legend
	if columns > 0 then
		for i = 1,5 do
			local locallegend = legendi
			if (locallegend and #locallegend > 0) then
				local cell = root:tag('tr'):tag('td')
				cell:wikitext(buildlegend(locallegend, columns, border, args'legend' .. i .. 'title' or ))
			end
		end
	end
	return tostring(root)
end
return p