Module:Chessboard mxn: Difference between revisions

Content deleted Content added
Created page with 'local p = {} function chessboard(args, size, rows, cols, rev, letters, numbers, header, footer, align, clear) function colchar( col ) return ( "abcdefghijkl...'
 
Slight logic simplification ("if a then else" to "if not a then")
 
(40 intermediate revisions by 8 users not shown)
Line 1:
local p = {}
 
function chessboard(args, size, rows, cols, rev, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear)
function colchar( col )
return (col <= 26) and ( "abcdefghijklmnopqrstuvwxyz" ):sub( col, col ) end
or ( "abcdefghijklmnopqrstuvwxyz" ):sub( math.floor((col-1)/26), math.floor((col-1)/26) )
function image_square( pc, row, col, size )
.. ( "abcdefghijklmnopqrstuvwxyz" ):sub( col-math.floor((col-1)/26)*26, col-math.floor((col-1)/26)*26)
local colornames = { l = 'white', d = 'black' }
end
local piecenames = { p = 'pawn', r = 'rook', n = 'knight', b = 'bishop', q = 'queen', k = 'king', a = 'archbishop',
function image_square( pc, row, col, size, t, flip, altprefix )
c = 'chancelor', z = 'champion', w = 'wizard', t = 'fool', h = 'upside-down pawn', m = 'upside-down rook',
local colornames = { sl = 'upside-down knightwhite', fd = 'upside-down kingblack', eu = 'upside-downunknown bishopcolor', g = 'upside-down queen'}
local piecenames = {
local symnames = { xx = 'black cross', ox = 'white cross', xo = 'black circle', oo = 'white circle',
p = 'pawn',
ul = 'up-left arrow', ua = 'up arrow', ur = 'up-right arrow', la = 'left arrow', ra = 'right arrow',
r = 'rook',
dl = 'down-left arrow', da = 'down arrow', dr = 'down-right arrow', lr = 'left-right arrow', ud = 'up-down arrow',
n = 'knight',
x0='zero', x1='one', x2='two', x3='three', x4='four', x5='five', x6='six', x7='seven', x8='eight', x9='nine'}
local color b = mw.ustring.gsub(pc,'^.*(%w)(%w).*$bishop', '%2') or ''
local piece q = mw.ustring.gsub(pc,'^.*(%w)(%w).*$queen', '%1') or ''
local alt = colchar(col) ..k row ..= 'king', '
a = 'princess',
if (colornames[color] and piecenames[piece]) then
c = 'empress',
z = 'champion',
w = 'wizard',
t = 'fool',
h = 'upside-down pawn',
m = 'upside-down rook',
s = 'upside-down knight',
f = 'upside-down king',
e = 'upside-down bishop',
g = 'upside-down queen',
G = 'giraffe',
U = 'unicorn',
Z = 'zebra'
}
local symnames = {
xx = 'black cross',
ox = 'white cross',
xo = 'black circle',
oo = 'white circle',
ul = 'up-left arrow',
ua = 'up arrow',
ur = 'up-right arrow',
la = 'left arrow',
ra = 'right arrow',
dl = 'down-left arrow',
da = 'down arrow',
dr = 'down-right arrow',
lr = 'left-right arrow',
ud = 'up-down arrow',
db = 'up-right and down-left arrow',
dw = 'up-left and down-right arrow',
x0 = 'zero',
x1 = 'one',
x2 = 'two',
x3 = 'three',
x4 = 'four',
x5 = 'five',
x6 = 'six',
x7 = 'seven',
x8 = 'eight',
x9 = 'nine'
}
local color = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%2' ) or ''
local piece = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%1' ) or ''
local alt = altprefix .. colchar( col ) .. row .. ' '
if ( colornames[color] and piecenames[piece] ) then
alt = alt .. colornames[color] .. ' ' .. piecenames[piece]
else
alt = alt .. ( symnames[ piece .. color ] or (piece .. ' ' .. color) )
end
local ld = t and 't' or ((((row + col + flip) % 2) == 0) and 'd' or 'l')
return string.format( '[[File:Chess %s%s%s45.svg|%dx%dpx|alt=%s|%s]]', piece, color, ld, size, size, alt, alt )
end
 
function letters_row( rev, num_lt, num_rt, cols )
local res = '<tr style="vertical-align:middle">' .. ( num_lt and '<td style="padding:0; vertical-align:inherit"></td>' or '' ) .. '<td style="padding:0; vertical-align:inherit; height:18px">'
if ( num_lt ) then
res = res .. '<td></td>'
end
res = res .. '<td style="height:18px">'
for k = 1, cols do
res = res .. colchar(rev and (cols - k + 1) or k) .. '</td><td style="padding:0; vertical-align:inherit">'
end
res = res .. '</td>' .. ( num_lt and '<td style="padding:0; vertical-align:inherit"></td>' or '' ) .. '</tr>'
if ( num_rt ) then
res= res .. '<td></td>'
end
res = res .. '</tr>'
return res
end
local letters_tp = (letters:match('both') or letters:match('top'))
local letters_bt = (letters:match('both') or letters:match('bottom'))
local numbers_lt = (numbers:match('both') or numbers:match('left'))
local numbers_rt = (numbers:match('both') or numbers:match('right'))
local width = 8cols * size + 62
local flip = lightdark and 1 or 0
if ( numbers_lt ) then width = width + 18 end
if ( numbers_rt ) then width = width + 18 end
Line 51 ⟶ 91:
local b = ''
local caption = ''
 
if ( letters_tp ) then b = b .. letters_row(rev, numbers_lt, numbers_rt, cols) .. '\n' end
for trow = 1,rows do
local row = rev and trow or (rows - trow + 1)
b = b .. '<tr style="vertical-align:middle">'
if ( numbers_lt ) then b = b .. '<td style="padding:0; vertical-align:inherit; width:18px">' .. row .. '</td>' end
for tcol = 1,cols do
local col = rev and (cols - tcol + 1) or tcol
local idx = cols*(rows - row) + col + 2
if (args[idx] == nil) then args[idx] = ' ' end
local img = image_square(args[idx]:match('%w%w') or '', row, col, size, trans, flip, altprefix )
blocal bg = b(((trow ..+ '<td>'tcol ..+ imgflip) % 2) == 0) and '#ffce9e' ..or '</td>#d18b47'
b = b .. '<td style="padding:0; vertical-align:inherit; background-color: ' .. bg .. ';">' .. img .. '</td>'
end
if ( numbers_rt ) then b = b .. '<td style="padding:0; vertical-align:inherit; width:18px">' .. row .. '</td>' end
b = b .. '</tr>'
end
if ( letters_bt ) then b = b .. letters_row(rev, numbers_lt, numbers_rt, cols) .. '\n' end
 
if not footer:match('^%s*$') then
caption = '<div class="thumbcaption">' .. footer .. '</div>\n'
then
else end
captionb = '<divtable cellpadding=0 cellspacing=0 class="thumbcaptioncenter noviewer" style="marginline-leftheight:4px 0;margin background:white; font-rightsize:4px88%;">' ..border:1px footer#c8ccd1 .. '</div>\nsolid;'
.. 'padding:0; margin:auto">\n' .. b .. '\n</table>'
 
if noframe then
return b
else
return '<div class="thumb ' .. align .. '">'
.. '<div class="center">' .. header .. '</div>' .. '\n<div class="thumbinner" style="width:' .. width .. 'px;">\n'
.. b .. '\n' .. caption .. '</div></div>'
end
return '<div class="thumb ' .. align .. '" style="clear:' .. clear .. '; width:' .. width .. 'px; text-align:center">'
.. header .. '\n<div class="thumbinner" style="width:', 'px; text-align:center">\n'
.. '<table cellpadding=0 cellspacing=0 style="background:white; font-size:88%; border:1px #b0b0b0 solid; padding:0; '
.. 'margin:2px auto;">\n' .. b .. '\n</table>\n' .. caption .. '</div></div>'
end
 
Line 85 ⟶ 131:
-- Loop over rows, which are delimited by /
for srow in string.gmatch("/" .. fen, "/%w+") do
srow = srow:gsub("/","") -- clean up row
-- Loop over all letters and numbers in the row
-- Since Lua regexes do not have the | operator, we have
for piece in srow:gmatch( "%w" ) do
-- to spell things if (piece:match("%d"))out
local index = then -- if a digit1
local piece = "" -- Piece forcan k=1,piecealso be empty dosquares
local place = table.insert(res,' ')0
local pstart = end0
local pend = else -- not a digit0
local colorlength = piecesrow:matchlen( '%u' ) and 'l' or 'd'
while index <= length piece = piece:lower()do
-- Look table.insert(res,for piecea number.. color )Can have multiple digits
pstart, pend = srow:find("%d+", index)
if pstart == index then
piece = srow:sub(pstart, pend)
index = pend + 1
for k=1,tonumber(piece) do
table.insert(res,' ')
end
else
-- If number not found, look for a letter (piece on board)
pstart = srow:find("%a",index)
if pstart == index then
piece = srow:sub(pstart, pstart)
index = pstart + 1
-- l: White (light); d: Black (dark)
local color = piece:match( '%u' ) and 'l' or 'd'
piece = piece:lower()
table.insert(res, piece .. color)
else
index = length + 1 -- Break loop
end
end
end
end
 
return res
end
Line 106 ⟶ 172:
local args = frame.args
local pargs = frame:getParent().args
local size = (args.size or pargs.size) or '26px26'
local reverse = ( (args.reverse or pargs.reverse) or '' ):lower() == "true"
local letterstrans = (args.letterstransparent or pargs.letterstransparent or 'both' ):lower() == "true"
local numberslightdark = (args.numberslightdark or pargs.numberslightdark or 'both' ):lower() == "swap"
local headeraltprefix = (args[2].altprefix or pargs[2]).altprefix or ''
local footerrows = (args[67].rows or pargs[67]).rows or ''8
local aligncols = ((args[1].cols or pargs[1]).cols or 'tright'):lower()8
local clearletters = ( args.clearletters or pargs.clear)letters or ('both' align):matchlower('tright') and 'right' or 'none')
local rowsnumbers = ( args.rowsnumbers or pargs.rows)numbers or 8'both' ):lower()
local colsheader = mw.ustring.gsub( args.cols[2] or pargs[2] or '', '^%s*(.cols-)%s*$', or'%1' 8)
local footer = args[3 + rows*cols] or pargs[3 + rows*cols] or ''
local align = ( args[1] or pargs[1] or 'tright' ):lower()
local clear = ( args.clear or pargs.clear ) or ( align:match('tright') and 'right' or 'none' )
local noframe = (args.noframe or pargs.noframe or ''):lower() == "true"
local fen = args.fen or pargs.fen
 
size = mw.ustring.match(size, '%d[%d]*+') or '26' -- remove px from size
if (fen) then
align = ( args.align or pargs.align) or 'tright' ):lower()
headerclear = ( args.headerclear or pargs.headerclear ) or ( align:match('tright') and 'right' or 'none' )
footerheader = (args.footerheader or pargs.footer)header or ''
footer = args.footer or pargs.footer or ''
return chessboard(convertFenToArgs( fen ), size, rows, cols, reverse, letters, numbers, header, footer, align, clear)
return chessboard(convertFenToArgs( fen ), size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)
end
if args[3] then
return chessboard(args, size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)
else
return chessboard(pargs, size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)
if args[3] then
return chessboard(args, size, rows, cols, reverse, letters, numbers, header, footer, align, clear)
else
return chessboard(pargs, size, rows, cols, reverse, letters, numbers, header, footer, align, clear)
end
end