Modulo:Scacchiera: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
commenti
altezze immagini calcolate automaticamente
 
(17 versioni intermedie di 5 utenti non mostrate)
Riga 1:
local p = {}
 
local function chessboardimage_square(args, sizepc, revrow, letterscol, numbers, header, footer, align,size clear)
local colornames = {
function image_square( pc, row, col, size )
local colornames = { l = 'del bianco', d = 'del nero' }
d = 'del nero',
local piecenames = {
p r = 'pedonedel rosso',
r g = 'torredel verde',
y = 'del giallo'
n = 'cavallo',
}
b = 'alfiere',
local piecenames = {
q = 'donna',
k p = 'repedone',
r = 'torre',
a = 'arcivescovo',
c n = 'cancellierecavallo',
z b = 'campionealfiere',
w q = 'magodonna',
t k = 'giullarere',
a = 'arcivescovo',
h = 'pedone capovolto',
c = 'cancelliere',
m = 'torre capovolta',
z = 'campione',
s = 'cavallo capovolto',
f w = 're capovoltomago',
t = 'giullare',
e = 'alfiere capovolto',
h = 'pedone capovolto',
g = 'donna capovolta',
m = 'torre capovolta',
}
s = 'barca',
local symnames = {
xx f = 'crocere neracapovolto',
ox e = 'croce biancaelefante',
xo g = 'cerchio nerogrillo',
N = 'nottambulo',
oo = 'cerchio bianco',
B = 'alfiere capovolto',
ul = 'freccia verso sinistra in alto',
}
ua = 'freccia verso l\'alto',
local symnames = {
ur = 'freccia verso destra in alto',
xx = 'croce nera',
la = 'freccia verso sinistra',
ox = 'croce bianca',
ra = 'freccia verso destra',
xo = 'cerchio nero',
dl = 'freccia verso sinistra in basso',
oo = 'cerchio bianco',
da = 'freccia verso il basso',
dr ul = 'freccia verso destrasinistra in bassoalto',
lr ua = 'freccia verso sinistra e destral\'alto',
ud ur = 'freccia verso l\'altodestra ein il bassoalto',
la = 'freccia verso sinistra',
x0 = 'zero',
ra = 'freccia verso destra',
x1 = 'uno',
dl = 'freccia verso sinistra in basso',
x2 = 'due',
da = 'freccia verso il basso',
x3 = 'tre',
dr = 'freccia verso destra in basso',
x4 = 'quattro',
lr = 'freccia verso sinistra e destra',
x5 = 'cinque',
ud = 'freccia verso l\'alto e il basso',
x6 = 'sei',
x7 x0 = 'settezero',
x8 x1 = 'ottouno',
x9 x2 = 'novedue',
x3 = 'tre',
}
x4 = 'quattro',
x5 = 'cinque',
function colchar( col )
x6 = 'sei',
return ( 'abcdefgh' ):sub( col, col )
x7 = 'sette',
end
x8 = 'otto',
x9 = 'nove',
local color = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%2' ) or ''
}
local piece = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%1' ) or ''
local colchar = {'a','b','c','d','e','f','g','h'}
local alt = colchar( col ) .. row .. ' '
local color = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%2' ) or ''
if colornames[color] and piecenames[piece] then
local piece = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%1' ) or ''
alt = alt .. piecenames[piece] .. ' ' .. colornames[color]
local alt = colchar[col] .. row .. ' '
else
alt = alt .. ( symnames[piece .. color] or piece .. ' ' .. color )
end
return string.format( '[[File:Chess %s%st45.svg|%dx%dpx|alt=%s|%s]]', piece, color, size, size, alt, alt )
end
 
if colornames[color] and piecenames[piece] then
function letters_row( rev, num_lt, num_rt )
alt = alt .. piecenames[piece] .. ' ' .. colornames[color]
local td = '<td style="padding: 0; vertical-align: inherit;height:18px;width:' .. size .. 'px;">'
else
local legends = 'abcdefgh'
alt = alt .. ( symnames[piece .. color] or piece .. ' ' .. color )
local l = mw.text.split( rev and legends:reverse() or legends, '' )
end
return '<tr style="vertical-align:middle">\n'
.. ( num_lt and '<td style="vertical-align: inherit; padding: 0"></td>' or '' )
.. td
.. table.concat( l, '</td>' .. td )
.. '</td>'
.. ( num_rt and '<td style="vertical-align: inherit; padding: 0"></td>' or '' )
.. '\n</tr>'
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 = 8 * size + 2
if ( numbers_lt ) then width = width + 18 end
if ( numbers_rt ) then width = width + 18 end
 
return string.format( '[[File:Chess %s%st45.svg|%dpx|alt=%s|%s|link=]]', piece, color, size, alt, alt )
local b = ''
local caption = ''
if ( letters_tp ) then b = b .. letters_row( rev, numbers_lt, numbers_rt ) .. '\n' end
b = b .. '<tr style="vertical-align:middle">'
if ( numbers_lt ) then b = b .. '<td style="padding: 0; vertical-align: inherit; width:18px;height:' .. size .. 'px">' .. (rev and 1 or 8) .. '</td>' end
b = b .. '<td colspan=8 rowspan=8 style="padding: 0; vertical-align: inherit;"><div class="chess-board" style="position:relative;">'
b = b .. string.format( '[[File:Chessboard480.svg|%dx%dpx|link=]]', 8 * size, 8 * size )
for trow = 1,8 do
local row = rev and trow or ( 9 - trow )
for tcol = 1,8 do
local col = rev and ( 9 - tcol ) or tcol
local piece = args[8 * ( 8 - row ) + col + 2] or ''
if piece:match( '%w%w' ) then
local img = image_square(piece:match('%w%w'), row, col, size )
b = b .. string.format(
'<div style="position:absolute;z-index:3;top:%dpx;left:%dpx;width:' .. size .. 'px;height:' .. size .. 'px;">%s</div>\n',
( trow - 1 ) * size, ( tcol - 1 ) * size, img )
end
end
end
b = b .. '</div></td>'
if ( numbers_rt ) then b = b .. '<td style="width:18px;height:' .. size ..'px;padding:0">' .. (rev and 1 or 8) .. '</td>' end
if ( numbers_lt or numbers_rt ) then
for trow = 2, 8 do
local row = rev and trow or ( 9 - trow )
b = b .. '<tr style="vertical-align:middle">'
if ( numbers_lt ) then b = b .. '<td style="padding: 0; vertical-align: inherit;height:' .. size .. 'px">' .. row .. '</td>' end
if ( numbers_rt ) then b = b .. '<td style="padding: 0; vertical-align: inherit;height:' .. size .. 'px">' .. row .. '</td>' end
b = b .. '</tr>\n'
end
end
if ( letters_bt ) then b = b .. letters_row( rev, numbers_lt, numbers_rt ) .. '\n' end
 
if footer:match( '^%s*$' )
then
else
caption = '<div class="thumbcaption">' .. footer .. '</div>\n'
end
return '<div class="' .. align .. '" style="clear:' .. clear .. '; text-align:center;">'
.. header .. '\n<div class="thumbinner" style="width:' .. width .. 'px;">\n'
.. '<table cellpadding=0 cellspacing=0 style="background:white; font-size:88%; border:1px #b0b0b0 solid; padding:0; '
.. 'margin:auto;">\n' .. b .. '\n</table>\n' .. caption .. '</div></div>'
end
 
local function convertFenToArgsinnerboard(args, size, fenrev, background)
-- converts FEN notation to 64 entry array of positions, offset by 2
local res = { ' ', ' ' }
-- Loop over rows, which are delimited by /
for srow in string.gmatch( "/" .. fen, "/%w+" ) do
-- Loop over all letters and numbers in the row
for piece in srow:gmatch( "%w" ) do
if piece:match( "%d" ) then -- if a digit
for k=1,piece do
table.insert(res,' ')
end
else -- not a digit
local color = piece:match( '%u' ) and 'l' or 'd'
piece = piece:lower()
table.insert( res, piece .. color )
end
end
end
 
local bg_filename = ''
return res
if background == 'chaturanga' then
end
bg_filename = 'Chaturanga489.png'
else
bg_filename = 'Chessboard480.svg'
end
 
local root = mw.html.create('div')
function convertArgsToFen( args, offset )
root:addClass('chess-board')
function nullOrWhitespace( s ) return not s or s:match( '^%s*(.-)%s*$' ) == '' end
:css('position', 'relative')
function piece( s )
:wikitext(string.format( '[[File:%s|%dpx|link=]]', bg_filename, 8 * size ))
return nullOrWhitespace( s ) and 1
or s:gsub( '%s*(%a)(%a)%s*', function( a, b ) return b == 'l' and a:upper() or a end )
end
local res = ''
offset = offset or 0
for row = 1, 8 do
for file = 1, 8 do
res = res .. piece( args[8*(row - 1) + file + offset] )
end
if row < 8 then res = res .. '/' end
end
return mw.ustring.gsub(res, '1+', function( s ) return #s end )
end
 
for trow = 1,8 do
function p.board(frame)
local row = rev and trow or ( 9 - trow )
local args = frame.args
for tcol = 1,8 do
local pargs = frame:getParent().args
local col = rev and ( 9 - tcol ) or tcol
local size = args.size or pargs.size or '26'
local piece = args[8 * ( 8 - row ) + col + 2] or ''
local reverse = ( args.reverse or pargs.reverse or '' ):lower() == "true"
if piece:match( '%w%w' ) then
local letters = ( args.letters or pargs.letters or 'both' ):lower()
local img = image_square(piece:match('%w%w'), row, col, size )
local numbers = ( args.numbers or pargs.numbers or 'both' ):lower()
root:tag('div')
local header = args[2] or pargs[2] or ''
:css('position', 'absolute')
local footer = args[67] or pargs[67] or ''
:css('z-index', '3')
local align = ( args[1] or pargs[1] or 'tright' ):lower()
:css('top', tostring(( trow - 1 ) * size) .. 'px')
local clear = args.clear or pargs.clear or ( align:match('tright') and 'right' ) or 'none'
:css('left', tostring(( tcol - 1 ) * size) .. 'px')
local fen = args.fen or pargs.fen
:css('width', size .. 'px')
:css('height', size .. 'px')
size = mw.ustring.match( size, '[%d]+' ) or '26' -- remove px from size
:wikitext(img)
if (fen) then
end
align = args.align or pargs.align or 'tright'
end
clear = args.clear or pargs.clear or ( align:match('tright') and 'right' ) or 'none'
end
header = args.header or pargs.header or ''
 
footer = args.footer or pargs.footer or ''
return tostring(root)
return chessboard( convertFenToArgs( fen ), size, reverse, letters, numbers, header, footer, align, clear )
end
if args[3] then
return chessboard(args, size, reverse, letters, numbers, header, footer, align, clear)
else
return chessboard(pargs, size, reverse, letters, numbers, header, footer, align, clear)
end
end
 
function chessboard(args, size, rev, letters, numbers, header, footer, align, clear, background)
function p.fen2ascii(frame)
function letters_row( rev, num_lt, num_rt )
-- {{#invoke:Scacchiera|fen2ascii|fen=...}}
local letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}
local b = convertFenToArgs( frame.args.fen )
local resroot = mw.html.create('|=\n')
if num_lt then
local offset = 2
root:tag('td')
for row = 1,8 do
:css('vertical-align', 'inherit')
local n = (9 - row)
:css('padding', '0')
res = res .. n .. ' |' ..
end
table.concat(b, '|', 8*(row-1) + 1 + offset, 8*(row-1) + 8 + offset) .. '|=\n'
for k = 1,8 enddo
root:tag('td')
res = mw.ustring.gsub( res,'\| \|', '| |' )
:css('padding', '0')
res = mw.ustring.gsub( res,'\| \|', '| |' )
:css('vertical-align', 'inherit')
res = res .. ' a b c d e f g h'
:css('height', '18px')
return res
:css('width', size .. 'px')
:wikitext(rev and letters[9-k] or letters[k])
end
if num_rt then
root:tag('td')
:css('vertical-align', 'inherit')
:css('padding', '0')
end
return tostring(root)
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 = 8 * size + 2
if ( numbers_lt ) then width = width + 18 end
if ( numbers_rt ) then width = width + 18 end
 
local root = mw.html.create('div')
:addClass('thumb')
:addClass(align)
:css('clear', clear)
:css('text-align', 'center')
:css('width', width .. 'px')
:wikitext(header)
local div = root:tag('div')
:addClass('thumbinner')
:css('width', width .. 'px')
local b = div:tag('table')
:attr('cellpadding', '0')
:attr('cellspacing', '0')
:css('background', 'white')
:css('font-size', '88%')
:css('border' , '1px #b0b0b0 solid')
:css('padding', '0')
:css('margin', 'auto')
 
if ( letters_tp ) then
b:tag('tr')
:css('vertical-align', 'middle')
:wikitext(letters_row( rev, numbers_lt, numbers_rt ))
end
local tablerow = b:tag('tr'):css('vertical-align','middle')
if ( numbers_lt ) then
tablerow:tag('td')
:css('padding', '0')
:css('vertical-align', 'inherit')
:css('width', '18px')
:css('height', size .. 'px')
:wikitext(rev and 1 or 8)
end
local td = tablerow:tag('td')
:attr('colspan', 8)
:attr('rowspan', 8)
:css('padding', '0')
:css('vertical-align', 'inherit')
:wikitext(innerboard(args, size, rev, background))
 
if ( numbers_rt ) then
tablerow:tag('td')
:css('padding', '0')
:css('vertical-align', 'inherit')
:css('width', '18px')
:css('height', size .. 'px')
:wikitext(rev and 1 or 8)
end
if ( numbers_lt or numbers_rt ) then
for trow = 2, 8 do
local idx = rev and trow or ( 9 - trow )
tablerow = b:tag('tr')
:css('vertical-align', 'middle')
if ( numbers_lt ) then
tablerow:tag('td')
:css('padding', '0')
:css('vertical-align', 'inherit')
:css('height', size .. 'px')
:wikitext(idx)
end
if ( numbers_rt ) then
tablerow:tag('td')
:css('padding', '0')
:css('vertical-align', 'inherit')
:css('height', size .. 'px')
:wikitext(idx)
end
end
end
if ( letters_bt ) then
b:tag('tr')
:css('vertical-align', 'middle')
:wikitext(letters_row( rev, numbers_lt, numbers_rt ))
end
 
if (footer and footer ~= '') then
div:tag('div')
:addClass('thumbcaption')
:wikitext(footer)
end
 
return tostring(root)
end
 
function p.ascii2fenconvertFenToArgs( framefen )
-- converts FEN notation to 64 entry array of positions, offset by 2
-- {{#invoke:Scacchiera|ascii2fen|kl| | |....}}
local res = { ' ', ' ' }
return convertArgsToFen( frame.args, frame.args.offset or 1 )
-- Loop over rows, which are delimited by /
for srow in string.gmatch( "/" .. fen, "/%w+" ) do
-- Loop over all letters and numbers in the row
for piece in srow:gmatch( "%w" ) do
if piece:match( "%d" ) then -- if a digit
for k=1,piece do
table.insert(res,' ')
end
else -- not a digit
local color = piece:match( '%u' ) and 'l' or 'd'
piece = piece:lower()
table.insert( res, piece .. color )
end
end
end
 
return res
end
 
function convertArgsToFen( args, offset )
return p
function nullOrWhitespace( s ) return not s or s:match( '^%s*(.-)%s*$' ) == '' end
function piece( s )
return nullOrWhitespace( s ) and 1
or s:gsub( '%s*(%a)(%a)%s*', function( a, b ) return b == 'l' and a:upper() or a end )
end
 
local res = ''
offset = offset or 0
for row = 1, 8 do
for file = 1, 8 do
res = res .. piece( args[8*(row - 1) + file + offset] )
end
if row < 8 then res = res .. '/' end
end
return mw.ustring.gsub(res, '1+', function( s ) return #s end )
end
 
function p.board(frame)
local args = frame.args
local pargs = frame:getParent().args
local size = args.size or pargs.size or '26'
local reverse = ( args.reverse or pargs.reverse or '' ):lower() == "true"
local letters = ( args.letters or pargs.letters or 'both' ):lower()
local numbers = ( args.numbers or pargs.numbers or 'both' ):lower()
local header = args[2] or pargs[2] or ''
local footer = args[67] or pargs[67] 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 fen = args.fen or pargs.fen
local background = args.background or pargs.background or 'checks'
 
size = mw.ustring.match( size, '[%d]+' ) or '26' -- remove px from size
if (args['soluzione'] or pargs['soluzione']) then
footer = footer .. "\n----\n''Soluzione'':<br />" .. (args['soluzione'] or pargs['soluzione'])
end
 
if (fen) then
align = args.align or pargs.align or 'tright'
clear = args.clear or pargs.clear or ( align:match('tright') and 'right' ) or 'none'
header = args.header or pargs.header or ''
footer = args.footer or pargs.footer or ''
return chessboard( convertFenToArgs( fen ), size, reverse, letters, numbers, header, footer, align, clear, background)
end
if args[3] then
return chessboard(args, size, reverse, letters, numbers, header, footer, align, clear, background)
else
return chessboard(pargs, size, reverse, letters, numbers, header, footer, align, clear, background)
end
end
 
function p.fen2ascii(frame)
-- {{#invoke:Chessboard|fen2ascii|fen=...}}
local b = convertFenToArgs( frame.args.fen )
local res = '\n'
local offset = 2
for row = 1,8 do
local n = (9 - row)
res = res .. '|' ..
table.concat(b, '|', 8*(row-1) + 1 + offset, 8*(row-1) + 8 + offset) .. '\n'
end
res = mw.ustring.gsub( res,'\| \|', '| |' )
res = mw.ustring.gsub( res,'\| \|', '| |' )
return res
end
 
function p.ascii2fen( frame )
-- {{#invoke:Chessboard|ascii2fen|kl| | |....}}
return convertArgsToFen( frame.args, frame.args.offset or 1 )
end
 
return p