Module:Chessboard mxn: Difference between revisions

Content deleted Content added
per talk
Slight logic simplification ("if a then else" to "if not a then")
 
(12 intermediate revisions by 6 users not shown)
Line 3:
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 ) or
'a' .. or ( "abcdefghijklmnopqrstuvwxyz" ):sub( math.floor((col-251)/26), math.floor((col-251)/26) )
.. ( "abcdefghijklmnopqrstuvwxyz" ):sub( col-math.floor((col-1)/26)*26, col-math.floor((col-1)/26)*26)
end
function image_square( pc, row, col, size, t, flip, altprefix )
local colornames = { l = 'white', d = 'black', u = 'unknown color' }
local piecenames = {
p = 'pawn',
Line 25 ⟶ 27:
e = 'upside-down bishop',
g = 'upside-down queen',
G = 'giraffe',
U = 'unicorn',
Z = 'zebra'
}
local symnames = {
Line 41 ⟶ 46:
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',
Line 50 ⟶ 57:
x7 = 'seven',
x8 = 'eight',
x9 = 'nine',
}
local color = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%2' ) or ''
Line 84 ⟶ 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
Line 95 ⟶ 102:
if (args[idx] == nil) then args[idx] = ' ' end
local img = image_square(args[idx]:match('%w%w') or '', row, col, size, trans, flip, altprefix )
local bg = (((trow + tcol + flip) % 2) == 0) and '#d18b47ffce9e' or '#ffce9ed18b47'
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
then
else
caption = '<div class="thumbcaption">' .. footer .. '</div>\n'
end
b = '<table cellpadding=0 cellspacing=0 class="center noviewer" style="line-height: 0; background:white; font-size:88%; border:1px #b0b0b0c8ccd1 solid;'
.. 'padding:0; margin:auto">\n' .. b .. '\n</table>'
 
if noframe then
return b
else
return '<div class="thumb ' .. align .. '" style="clear:' .. clear .. '; text-align:center;">'
.. '<div class="center">' .. header .. '</div>' .. '\n<div class="thumbinner" style="width:' .. width .. 'px;">\n'
.. b .. '\n' .. caption .. '</div></div>'
end
Line 125 ⟶ 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")) thenout
local index = -- if a digit1
local piece = "" -- Piece can also forbe k=1,pieceempty dosquares
local place = 0
local pstart = 0
local pend = 0
local length = srow:len()
while index <= length do
-- Look for a number. Can have multiple digits
pstart, pend = srow:find("%d+", index)
if pstart == index then
for piece in= srow:gmatchsub(pstart, "%w" pend) do
index = pend + 1
for k=1,tonumber(piece) do
table.insert(res,' ')
end
else
-- If number not found, look for a digitletter (piece on board)
local colorpstart = piecesrow:matchfind( '"%u' a",index) and 'l' or 'd'
pieceif pstart == index piece:lower()then
table.insert(res, piece ..= colorsrow: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 162 ⟶ 187:
local noframe = (args.noframe or pargs.noframe or ''):lower() == "true"
local fen = args.fen or pargs.fen
 
size = mw.ustring.match(size, '[%d]+') or '26' -- remove px from size
if (fen) then