Module:BSicon catalogue/sandbox
Jump to navigation
Jump to search
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules
Lua
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