モジュール:Wide image

-- This module implements template:wide image and template:panorama
local p = {}
local function getfilename(s)
	s = mw.ustring.gsub(s or , '^%s*FfIiLlEe%s*:%s*', )
	s = mw.ustring.gsub(s or , '^%s*IiMmAaGgEe%s*:%s*', )
	return s
end
local function getwidth(s, w, h)
	w = mw.ustring.gsub(w or '0', '^%s*(%d+)%s*PpXx*%s*$', '%1')
	h = mw.ustring.gsub(h or '0', '^%s*(%d+)%s*PpXx*%s*$', '%1')
	w = tonumber(w) or 0
	h = tonumber(h) or 0
	if w > 0 then
		return w
	end
	
	local file = s and mw.title.new('File:' .. mw.uri.decode(mw.ustring.gsub(s,'%|.*$',), 'WIKI'))
	file = file and file.file or {width = 0, height = 0}
	if h > 0 then
		w = math.floor(h * (tonumber(file.width) or 0)/(tonumber(file.height) or 1) + 0.5)
		if w > 0 then
			return w
		end
	end
	
	w = tonumber(file.width) or 0
	return w
end
local function getimage(s, w, a, c, rtl)
	if c == 'thumb' or c == 'thumbnail' or c == 'frame' or c == 'border' then
		c = s
	elseif rtl and c ~=  then
		c = '‪' .. c .. '‬'
	end
	return  .. mw.text.unstrip(c or ) .. 
end
local function getcontainers(noborder, float, width, maxwidth)
	local r = mw.html.create('div')
	if noborder then
		if float == 'left' then
			r:addClass('floatleft')
		elseif float == 'right' then
			r:addClass('floatright')
		elseif float == 'none' then
			r:addClass('floatnone')
		else -- center is default
			r:addClass('floatnone')
			r:css('margin-left', 'auto')
			r:css('margin-right', 'auto')
			r:css('overflow', 'hidden')
		end
	else
		r:addClass('thumb')
		if float == 'left' then
			r:addClass('tleft')
		elseif float == 'right' then
			r:addClass('tright')
		elseif float == 'none' then
			r:addClass('tnone')
		else -- center is default
			r:addClass('tnone')
			r:css('margin-left', 'auto')
			r:css('margin-right', 'auto')
			r:css('overflow', 'hidden')
		end
	end
	r:css('width', width)
	r:css('max-width', maxwidth)
	local d = noborder and r or r:tag('div'):addClass('thumbinner')
	
	return r,d
end
	
function wideimage(image, width, height, caption, boxwidth, float, alt, border, capalign, dir)
	if image then
		image = getfilename(image)
		local iwidth = getwidth(image, width or '0', height or '0')
		if width == nil then
			width = iwidth .. 'px'
		end
		local rtl = dir and dir == 'rtl' or nil
		local noborder = border and border == 'no' or nil
		
		local maxwidth = noborder and (iwidth .. 'px') or ((iwidth + 10) .. 'px')
		
		local r,d = getcontainers(noborder, float or , boxwidth or 'auto', maxwidth)
		
		if tonumber(width) then
			width = width .. 'px'
		end
		
		cclass = 'noresize '
		
		if not (border == 'no') then
			cclass = cclass .. 'thumbimage' 
		end
		
		d:tag('div')
			:addClass(cclass)
			:css('overflow', 'auto')
			:css('direction', rtl and 'rtl' or nil)
			:wikitext(getimage(image,width,alt,caption or ,rtl))
		if caption then
			d = d:tag('div')
					:addClass('thumbcaption')
					:css('text-align', capalign)
			if noborder == nil then
				d:tag('div')
					:addClass('magnify')
					:wikitext(' ')
			end
			d:wikitext(caption)
		end
		return tostring(r)
	end
	return 
end
function p.main(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)
	return wideimage(
			args'image' or args1, args2 or nil, -- width
			args'height' or nil, args'caption' or args3, 
			args'width' or args4, args'align' or args5, 
			args'alt', args'border', args'align-cap', args'dir'
			)
end
return p