Module:College color/contrast

-- This submodule is used to generate the complete color contrast table in
-- the documentation for [[Module:College color]]
local contrast = {}
local all_colors = {}

local contrast_mod = require("Module:Color contrast")

local function stripwhitespace(text)
	return text:match("^%s*(.-)%s*$")
end

local function preprocesscitation(text)
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*web%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*date%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '\"[%1 %2]\". %3. Retrieved %4.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*manual%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*date%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '<i>[%1 %2]</i>. %3. Retrieved %4.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*web%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*date%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '\"[%2 %1]\". %3. Retrieved %4.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*manual%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*date%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '<i>[%2 %1]</i>. %3. Retrieved %4.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*web%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '\"[%1 %2]\". Retrieved %3.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*manual%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '<i>[%1 %2]</i>. Retrieved %3.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*web%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '\"[%2 %1]\". Retrieved %3.')
	text = mw.ustring.gsub(text, '%{%{%s*[Cc]ite%s*manual%s*%|%s*title%s*=%s*([^|]-)%s*%|%s*url%s*=%s*([^|%[%]]-)%s*%|%s*access%-?date%s*=%s*([^|]-)%s*%}%}', '<i>[%2 %1]</i>. Retrieved %3.')
	return text
end

local function get_colors(team, unknown)
	team = stripwhitespace(team or '')
	unknown = unknown or {"DCDCDC", "000000"}
 
	local use_default = {
		[""] = 1,
		["retired"] = 1,
		["free agent"] = 1,
	}
 
	local colors = nil
 
	if ( team and use_default[team:lower()] ) then
		colors = {"DCDCDC", "000000"}
	else
		colors = all_colors[team]
		if ( colors and type(colors) == 'string' ) then
			colors = all_colors[colors]
		end
	end
 
	return colors or unknown
end

local function color_contrast_ratio(hex1, hex2)
	if( hex1 and hex2) then
		local r = contrast_mod._ratio({'#' .. hex1, '#' .. hex2, error = 0})
		if( r > 0 ) then
			r = (r > 1) and r or (1/r)
			r = math.floor(r * 100 + 0.5) / 100
			return  (r > 1) and r or (1/r)
		end
	end
	return ''
end

function contrast._testtable(args)
	local teamlist = {}
	local aliaslist = {}
	local style = args['style']
	local data_module = args['data'] or "Module:College color/data"
	all_colors = mw.loadData(data_module)

	-- helper function
	local function table_row(t, c)
		local res = mw.html.create('')
		if( c[1] ) then
			res:tag('td'):wikitext(t)
		else
			res:tag('td'):wikitext(t .. ' <span class=error>ERROR</span>')
		end
		for i=1,3 do
			res:tag('td')
				:css('background', c[i] and ('#' .. c[i]) or 'transparent')
				:wikitext(c[i] and '' or 'X')
		end
		for i=1,3 do
			local j = math.fmod(i,3) + 1
			res:tag('td'):wikitext(color_contrast_ratio(c[i],c[j]))
		end
		res:tag('td'):wikitext(color_contrast_ratio(c[1],'FFFFFF'))
		res:tag('td'):wikitext(color_contrast_ratio(c[1],'000000'))
		local r = ''
		for k, v in pairs(c) do
			if ( type(k) == 'string' and mw.ustring.match(k, '^cite') ) then
				r = r .. '<ref>' .. preprocesscitation(v) .. '</ref>'
			end
			if( type(k) == 'string' and mw.ustring.match(k, '^ref') ) then
				local rt = mw.ustring.gsub(v, '^%s*https?://(.*)', '%1') or ''
				rt = mw.ustring.gsub(rt, '^(.-)/.*', '%1')
				rt = mw.ustring.gsub(rt, '^www%.(.-)$', '%1') or rt 
				r = r .. '<ref>[' .. v .. ' ' .. rt .. ']</ref>'
			end
		end
		res:tag('td'):wikitext(r)
		return tostring(res)
	end

    -- list of teams
	if( args and args[1] ) then
		for k, team in pairs(args) do
			if type(k) == 'number' then
				table.insert(teamlist, team)
			end
		end
	else
		for team, colors in pairs( all_colors ) do
			if type(colors) == 'string' then
				aliaslist[colors] = (aliaslist[colors] or '') .. '<br />aka ' .. team
			else
				table.insert(teamlist, team)
			end
		end
		table.sort(teamlist)
		table.insert(teamlist, 'Free agent')
		table.insert(teamlist, 'Retired')
	end
	
	-- build table
	local root = mw.html.create('table')
	root:addClass('wikitable sortable')
		:css('font-size', '90%')
		:css('line-height', '100%')
		:cssText(style)
	local row = root:tag('tr')
	row:tag('th')
		:attr('rowspan',2)
		:wikitext('Team')
	for i=1,3 do
		row:tag('th')
			:addClass('unsortable')
			:attr('rowspan',2)
			:wikitext(i)
	end
	row:tag('th')
		:attr('colspan', 5)
		:wikitext('Contrast')
	row:tag('th')
		:attr('rowspan',2)
		:wikitext('refs')
	row = root:tag('tr')
	for i=1,3 do
		local j = math.fmod(i,3) + 1
		row:tag('th'):wikitext(i .. '/' .. j)
	end
	row:tag('th'):wikitext('1/w')
	row:tag('th'):wikitext('1/b')
	for k, team in pairs( teamlist ) do
		row = root:tag('tr')
		row:wikitext(table_row(team .. (aliaslist[team] or ''), get_colors(team)))
	end
	
	return tostring(root) .. '{{hidden begin|title=References|toggle=left}}{{reflist}}{{hidden end}}'
end

function contrast._exampletable(frame, args, styletemplate)
	local teamlist = {}
	local style = args['style']
	local data_module = args['data'] or "Module:College color/data"
	all_colors = mw.loadData(data_module)
	
	local function stripestyle(frame, in_args)
		return frame:expandTemplate{ title = styletemplate, args = in_args }
	end

    -- list of teams
	if( args and args[1] ) then
		for k, team in pairs(args) do
			if type(k) == 'number' then
				table.insert(teamlist, team)
			end
		end
	else
		for team, colors in pairs( all_colors ) do
			if type(colors) ~= 'string' then
				table.insert(teamlist, team)
			end
		end
		table.sort(teamlist)
		table.insert(teamlist, 'Free agent')
		table.insert(teamlist, 'Retired')
	end
	
	-- build table
	local root = mw.html.create('table')
	if( args['title'] ) then
		root:tag('caption'):wikitext(args['title'])
			:cssText('padding: 0.2em;font-size: 125%;font-weight: bold;')
	end
	root:cssText('border: 1px solid #a2a9b1;border-spacing: 3px;')
		:cssText('margin: 0.5em 0 0.5em 1em;')
		:cssText('padding: 0.2em;float: right;clear: right;font-size: 88%;line-height: 1.5em;width: 22em;')
		:cssText(style)
	for k, team in pairs( teamlist ) do
		local cell = root:tag('tr'):tag('th')
		cell
			:cssText('text-align: left;' .. stripestyle(frame,{team}))
			:wikitext(team)
	end
	
	return tostring(root)
end

function contrast.testtable(frame)
	return frame:preprocess(contrast._testtable(frame.args))
end

function contrast.stripetable(frame)
	return contrast._exampletable(frame,frame.args, 'College stripe style')
end

function contrast.header1table(frame)
	return contrast._exampletable(frame,frame.args, 'NCAA color cell')
end

function contrast.header2table(frame)
	return contrast._exampletable(frame,frame.args, 'NCAA secondary color cell')
end

return contrast

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.