Módulo:Tablero de ajedrez

De Wikisource, la biblioteca libre.
Ir a la navegación Ir a la búsqueda
Template-info.svg Documentación del módulo

Uso

Usada por {{Diagrama de ajedrez}}.

Tableros alternativos (opción imagen tablero):

File:Chessboard480.svg Color File:Chessboard480Grayscale.svg Grises

{{Diagrama de ajedrez
| left
| 

|rd|nd|bd|qd|kd|bd|nd|rd
|pd|pd|pd|pd|  |pd|pd|pd
|  |  |  |  |  |  |  |
|  |  |  |  |pd|  |  |
|  |  |  |  |pl|pl|  |
|  |  |  |  |  |  |  |
|pl|pl|pl|pl|  |  |pl|pl
|rl|nl|bl|ql|kl|bl|nl|rl

| Gambito del Rey
}}


negro.
8
Chessboard480DiagonalStripe.svg
a8 torre negro
b8 caballo negro
c8 alfil negro
d8 reina negro
e8 rey negro
f8 alfil negro
g8 caballo negro
h8 torre negro
a7 peón negro
b7 peón negro
c7 peón negro
d7 peón negro
f7 peón negro
g7 peón negro
h7 peón negro
e5 peón negro
e4 peón blanco
f4 peón blanco
a2 peón blanco
b2 peón blanco
c2 peón blanco
d2 peón blanco
g2 peón blanco
h2 peón blanco
a1 torre blanco
b1 caballo blanco
c1 alfil blanco
d1 reina blanco
e1 rey blanco
f1 alfil blanco
g1 caballo blanco
h1 torre blanco
7
6
5
4
3
2
1
blanco.
abcdefgh
Gambito del Rey
Esta documentación está transcluida desde Módulo:Tablero de ajedrez/doc.
Los editores pueden experimentar en la zona de pruebas de este módulo.
Por favor, añade las categorías e interwikis a la subpágina de documentación. Subpáginas de este módulo.

local p = {}

local function casilla_imagen( pc, row, col, size )
	local nombres_colores = { l = 'blanco', d = 'negro' }
	local nombres_piezas = { 
		p = 'peón',
		r = 'torre',
		n = 'caballo',
		b = 'alfil',
		q = 'reina',
		k = 'rey',
		a = 'arzobispo', --ajedrez Omega
		c = 'canciller', --ajedrez Omega
		z = 'campeón', --ajedrez Omega
		w = 'hechicero',--ajedrez Omega
		t = 'guasón', --ajedrez Omega
		h = 'peón', --invertidos
		m = 'torre',
		s = 'caballo',
		f = 'rey',
		e = 'alfil',
		g = 'reina',
	}
	local nombres_simbolos = {
		xx = 'cruz negra',
		ox = 'cruz blanca',
		xo = 'círculo negro',
		oo = 'círculo blanco',
		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',
		x0 = 'cero',
		x1 = 'uno',
		x2 = 'dos',
		x3 = 'tres',
		x4 = 'cuatro',
		x5 = 'cinco',
		x6 = 'seis',
		x7 = 'siete',
		x8 = 'ocho',
		x9 = 'nueve',
	}
	local colchar = {'a','b','c','d','e','f','g','h'}
    local color = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%2' ) or ''
    local pieza = mw.ustring.gsub( pc, '^.*(%w)(%w).*$', '%1' ) or ''
    local alt = colchar[col] .. row .. ' '
    
    if nombres_colores[color] and nombres_piezas[pieza] then
		alt = alt .. nombres_piezas[pieza] .. ' ' .. nombres_colores[color]  -- muesta alt nombre pieza y color
    else
		alt = alt .. ( nombres_simbolos[pieza .. color] or pieza .. ' ' .. color )
	end
	--Posiciona pieza
	return string.format( '[[File:Chess %s%st45.svg|%dx%dpx|alt=%s|%s]]', pieza, color, size, size, alt, alt )

end
    
local function tablerointerno(args, size, rev)
	local root = mw.html.create('div')
	if args['imagen tablero']==nil then
		args['imagen tablero']='Chessboard480DiagonalStripe.svg' --Tablero clásico de imprenta por defecto
	end
	
	root:addClass('chess-board')
		:css('position', 'relative')
		:wikitext(string.format( '[[File:' .. args['imagen tablero']  .. '|%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 pieza = args[8 * ( 8 - row ) + col + 2] or ''
            if pieza:match( '%w%w' ) then
               local img = casilla_imagen(pieza:match('%w%w'), row, col, size )
               root:tag('div')
               		:css('position', 'absolute')
               		:css('z-index', '3')
               		:css('top', tostring(( trow - 1 ) * size) .. 'px')
               		:css('left', tostring(( tcol - 1 ) * size) .. 'px')
               		:css('width', size .. 'px')
               		:css('height', size .. 'px')
               		:wikitext(img)
            end
        end
    end

    return tostring(root)
end

function tablero_ajedrez(args, size, rev, letters, numbers, header, footer, align, clear, estilo)
    function letters_row( rev, num_lt, num_rt )
        local letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}
        local root = mw.html.create('')
        if num_lt then
        	root:tag('td')
        		:css('vertical-align', 'inherit')
        		:css('padding', '0')
        end
        for k = 1,8 do
        	root:tag('td')
        		:css('padding', '0')
        		:css('vertical-align', 'inherit')
        		:css('height', '18px')
        		: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')
    	: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') --borde externo de la tabla
    	: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
    if (estilo=='1') then
    	local bb = b:tag('tr') ----etiqueta superior con recuadro señalando negro.
        if (numbers_lt) then bb:tag('td') end
		bb:tag('td')
			:attr('colspan','8')
			:css('border-left' , '1px #b0b0b0 solid')
			:css('border-right' , '1px #b0b0b0 solid')
			:css('border-top' , '1px #b0b0b0 solid')
			:css('font-variant','small-caps')
			:wikitext('negro.')
		if (numbers_rt) then bb:tag('td') end
    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')
    	:css('border' , '1px #b0b0b0 solid') --recuadro interno tablero
    	:wikitext(tablerointerno(args, size, rev))
	
    if ( numbers_rt )  then  --numeros derecha (8)
    	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 -- numeros derecha
          	tablerow:tag('td')
          		:css('padding', '0')
          		:css('vertical-align', 'inherit')
          		:css('height', size .. 'px')
          		:wikitext(idx)
          end
       end
    end
    if (estilo=='1') then
        local bb=b:tag('tr') --etiqueta base con recuadro señalando blanco.
    	if (numbers_lt) then bb:tag('td') end
    	bb:tag('td')  
			:attr('colspan','8')
			:css('border-bottom' , '1px #b0b0b0 solid')
			:css('border-left' , '1px #b0b0b0 solid')
			:css('border-right' , '1px #b0b0b0 solid')
			:css('font-variant','small-caps')
			:wikitext('blanco.')
		if (numbers_rt) then bb:tag('td') 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  --texto pie
		div:tag('div')
			--:addClass('thumbcaption')
			:wikitext(footer)
	end

    return tostring(root)
end

function convertFenToArgs( fen )
    -- 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 pieza in srow:gmatch( "%w" ) do
            if pieza:match( "%d" ) then -- if a digit
                for k=1,pieza do
                    table.insert(res,' ')
                end
            else -- not a digit
                local color = pieza:match( '%u' ) and 'l' or 'd'
                pieza = pieza:lower()
                table.insert( res, pieza .. color )
            end
        end
    end

    return res
end

function convertArgsToFen( args, offset )
    function nullOrWhitespace( s ) return not s or s:match( '^%s*(.-)%s*$' ) == '' end
    function pieza( 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 .. pieza( 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.tablero(frame)
    local args = frame.args
    local pargs = frame:getParent().args
    local size = args.size or pargs.size or '48'  --tamaño por defecto
    local reverse = ( args.reverse or pargs.reverse or '' ):lower() == "true"
    local letters = ( args.letters or pargs.letters or 'bottom' ):lower() 
    local numbers = ( args.numbers or pargs.numbers or 'left' ):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 estilo= args.estilo or pargs.estilo or '1'
    
    size = mw.ustring.match( size, '[%d]+' ) or '48' -- remove px from size
    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 tablero_ajedrez( convertFenToArgs( fen ), size, reverse, letters, numbers, header, footer, align, clear, estilo )
    end
    if args[3] then
        return tablero_ajedrez(args, size, reverse, letters, numbers, header, footer, align, clear, estilo)
    else
        return tablero_ajedrez(pargs, size, reverse, letters, numbers, header, footer, align, clear,estilo)
    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 .. n .. ' |' .. 
            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,'\| \|', '|  |' )
    res = res .. '   a  b  c  d  e  f  g  h'
    return res
end

function p.ascii2fen( frame )
    -- {{#invoke:Chessboard|ascii2fen|kl| | |....}}
    return convertArgsToFen( frame.args, frame.args.offset or 1 )
end

return p