Module:BSicon catalogue/sandbox

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:BSicon catalogue/sandbox/doc

Code

local p = {}

function p._main(args)
	local gsub = mw.ustring.gsub
	local format = string.format
	local match = mw.ustring.match
	local trim = mw.text.trim
	local split = mw.text.split
	local insert = table.insert
	local presets = {
		prefixes = {
			['1'] = '',
			['1v'] = 'v-', -- was BSa1-2
			['2'] = ',ex', -- was BSa
			['3'] = ',e,x,ex', -- was BSa6x
			['4'] = ',ex,u,uex',
			['4m'] = ',ex,m,exm,um,uexm,u,uex', -- new
			['4v'] = 'v-,v-ex,vex-,exv-,uv-,uv-ex,uvex-,uexv-', -- was BSa4x2
			['4mv'] = 'v-,v-ex,vex-,exv-,v-u,v-uex,vex-u,exv-u,vu-,vu-ex,vuex-,exvu-,uv-,uv-ex,uvex-,uexv-', -- new
			['5'] = ',ex,t,ext,u,uex,ut,uext',
			['5m'] = ',ex,t,ext,m,exm,mt,exmt,um,uexm,umt,uexmt,u,uex,ut,uext', -- new
			['5v'] = 'v-,v-ex,vex-,exv-,tv-,tv-ex,tvex-,extv-,uv-,uv-ex,uvex-,uexv-,utv-,utv-ex,utvex-,uextv-', -- was BSa5x2
			['6'] = ',e,x,ex,u,ue,ux,uex', -- order changed
			['6v'] = 'v-,v-e,v-x,v-ex,ve-,vx-,vex-,ev-,xv-,exv-,uv-,uv-e,uv-x,uv-ex,uve-,uvx-,uvex-,uev-,uxv-,uexv-', -- was BSa6x2
			['7'] = ',e,x,ex,t,et,xt,ext,h,eh,xh,exh,u,ue,ux,uex,ut,uet,uxt,uext,uh,ueh,uxh,uexh',
			['8'] = ',ex,t,ext,h,exh,u,uex,ut,uext,uh,uexh',
			['8m'] = ',ex,t,ext,h,exh,m,exm,mt,exmt,mh,exmh,um,uexm,umt,uexmt,umh,uexmh,u,uex,ut,uext,uh,uexh', -- new
			['8v'] = 'v-,v-ex,vex-,exv-,tv-,tv-ex,tvex-,extv-,hv-,hv-ex,hvex-,exhv-,uv-,uv-ex,uvex-,uexv-,utv-,utv-ex,utvex-,uextv-,uhv-,uhv-ex,uhvex-,uexhv-', -- new
			['9'] = ',e,x,ex,t,et,xt,ext,u,ue,ux,uex,ut,uet,uxt,uext', -- was BSaV
		}
	}
	local prefixes = presets.prefixes[args.preset] or args.prefixes or ',ex,u,uex'
	local header, parallel, row, rows
	if not args[1] then -- for those who don't escape equals signs
		for k, v in pairs(args) do
			if not args[1] and match(k, '[%s~!]') then args[1] = k..'='..v end
		end
	end
	local multi = match(gsub(args[1], '~~[^\n]*$', ''), '\\')
	if match(prefixes, '-') then
		parallel = (match(prefixes, 'v')) and 1 or 2 -- it's a surprise tool that will help us later
		row = gsub((',' .. prefixes), ',([^,]*)-([^,]*)', ('\n|[[File:BSicon %1%%1-%2%%2.svg|x20px|border| |alt=%1%%1-%2%%2]]'))
	else
		row = gsub((',' .. prefixes), ',([^,]*)', ('\n|[[File:BSicon %1%%1.svg|x20px|border| |alt=%1%%1]]'))
	end
	local function iconformat(var)
		if parallel then
			var = split(var, ':')
			return gsub(gsub(row, '%%1', trim(var[1])), '%%2', trim(var[2]))
		else
			return gsub(row, '%%1', trim(var))
		end
	end
	local rowformat
	if not multi then
		rowformat = function(var)
			insert(rows, '\n|-\n|style="text-align:left"|' .. (parallel and gsub(var, '^(.+):(.+)$', 'v%1-%2') or var))
			insert(rows, (iconformat(var)))
		end
	else
		multi = 2
		rowformat = function(var)
			insert(rows, '\n|-')
			var = split(var, '\\')
			if #var > multi then multi = #var end
			for i, v in ipairs(var) do
				insert(rows, '\n|style="text-align:left"|' .. (parallel and gsub(v, '^(.+):(.+)$', 'v%1-%2') or v))
				insert(rows, (iconformat(v)))
			end
		end
	end
	rows = {}
	local colspan
	local t = split(mw.text.trim(args[1]), '\n') -- columns based on first row
	for i, v in ipairs(t) do
		if match(v, '^!') then
			colspan = colspan or #split(row, '\n') + 1
			insert(rows, (gsub(gsub(v, '^!=', '!\n='), '^!', '\n|-\n!colspan="'.. colspan ..'"|')))
		else
			v = split(v, '~~')
			if v[2] or (v[1] ~= '') then
				rowformat(v[1])
				insert(rows, '\n|style="text-align:left"|' .. (v[2] or '') .. (v[3] and ' <span style="font-size:80%">' .. v[3] .. '</span>' or ''))
				if v[4] then insert(rows, ' – ' .. (v[4] or '') .. (v[5] and ' <span style="font-size:80%">' .. v[5] .. '</span>' or '')) end
			end
		end
	end
	if match(prefixes, '-') then
		header = gsub(prefixes, '([^,]*)-([^,]*)', "%1''α''-%2''β''")
		header = (multi and header .. mw.ustring.rep((args.width and ',style="width:' .. args.width .. '| ,' or ', ,') .. header, (multi - 1)) or header)
		header = args.header or '!' .. (args.width and 'style="width:' .. args.width .. '|' or '') .. gsub(header, '^([^,]+).*$', '%1') .. '\n!class="nowrap" style="line-height:99%;vertical-align:bottom;padding:.4em .4em .2em;background-position:50% .4em !important;min-width:0.875em;max-width:0.875em;width:0.875em;overflow:hidden"|<div style="-webkit-writing-mode:vertical-rl;-o-writing-mode:vertical-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;writing-mode:vertical-rl;layout-flow:vertical-ideographic;display:inline-block;-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg);-ms-transform:none;padding-left:1px;text-align:left">' .. gsub(header, ',', '</div>\n!class="nowrap" style="line-height:99%;vertical-align:bottom;padding:.4em .4em .2em;background-position:50% .4em !important;min-width:0.875em;max-width:0.875em;width:0.875em;overflow:hidden"|<div style="-webkit-writing-mode:vertical-rl;-o-writing-mode:vertical-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;writing-mode:vertical-rl;layout-flow:vertical-ideographic;display:inline-block;-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg);-ms-transform:none;padding-left:1px;text-align:left">') .. '</div>\n!'
	else
		header = mw.clone(prefixes)
		header = (multi and header .. mw.ustring.rep((args.width and ',style="width:' .. args.width .. '| ,' or ', ,') .. header, (multi - 1)) or header)
		header = args.header or '!' .. (args.width and 'style="width:' .. args.width .. '"| \n!' or \n!') .. gsub(header, ',', '\n!') .. '\n!'
	end
	if args.note then header = header .. args.note end
	insert(rows, '\n|-\n' .. header .. '\n|}')
	return '{|class="wikitable" style="text-align:center"\n|-\n' .. header .. table.concat(rows)
end

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args)
end

return p