Jump to content

Module:Border

From Wikisource

require('strict')

local p = {} --p stands for package

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local make_style_string = require('Module:Optional style').make_style_string
local CSS_unit = require('Module:CSS unit')._CSS_unit

local function _border(args)
	local trackingCats = {}
	
	local aliases = {
		['max-width'] = 'maxwidth',
		['border-radius'] = 'radius',
		['border-style'] = 'bstyle',
		['border-width'] = 'bthickness',
		['border-color'] = 'color',
		['background-color'] = 'bgcolor',
		['text-align'] = 'align',
		['content'] = 1,
		['text'] = 1
	}
	for k, v in pairs(aliases) do
		args[v] = args[v] or args[k]
	end
	
	if CSS_unit({args.maxwidth}) == 'px' then
		table.insert(trackingCats, '[[Category:' .. 'Pages using pixel widths (border)' .. ']]')
	end
	
	if args.position ~= 'left' and args.position ~= 'right' then
		args.position = 'center'
	end
	
	for k, v in pairs({'maxwidth', 'bstyle', 'bthickness', 'color', 'bgcolor', 'radius', 'align', 'padding', 'style'}) do
		if args[v] then
			table.insert(trackingCats, '[[Category:' .. 'Borders using ' .. v .. ' parameter' .. ']]')
		end
	end
	for k, v in pairs(args) do
		if type(k) == 'number' and k ~= 1 then
			table.insert(trackingCats, '[[Category:' .. 'Borders with numerical arguments' .. ']]')
			break
		end
	end
	
	local styleArgs = {
		['max-width'] = args.maxwidth,
		['display'] = args.display,
		['border-style'] = args.bstyle,
		['border-width'] = args.bthickness,
		['border-color'] = args.color,
		['border-radius'] = args.radius,
		['background-color'] = args.bgcolor,
		['text-align'] = args.align,
		['padding'] = args.padding
	}
	if styleArgs['background-color'] then
		styleArgs['color'] = 'inherit'
	end
	
	local stylesheet = mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Template:Border/styles.css'})
	
	local border_div = mw.html.create('div')
		:addClass('wst-border')
		:addClass('wst-border-' .. args.position)
		:addClass((yesno(args.compact) and 'wst-border-compact') or 'wst-border-fullwidth')
		:addClass(args.class)
		:css(styleArgs)
		:cssText(args.style)
		:wikitext(args[1])
		:wikitext(table.concat(trackingCats))
	border_div = tostring(border_div)
	if yesno(args.noclose) then
		border_div = string.gsub(border_div, '</div>$', '')
	end
	
	return stylesheet .. border_div
end

function p._border(args)
	return _border(args)
end

function p.border(frame)
	return _border(getArgs(frame, { trim = false }))
end

function p.border_start(frame)
	local args = getArgs(frame, {trim = false})
	args.noclose = true
	return _border(args)
end

return p