<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FSamboy%2FChessboard_mxn</id>
	<title>Module:Sandbox/Samboy/Chessboard mxn - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FSamboy%2FChessboard_mxn"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Samboy/Chessboard_mxn&amp;action=history"/>
	<updated>2026-04-03T20:34:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Samboy/Chessboard_mxn&amp;diff=146161&amp;oldid=prev</id>
		<title>imported&gt;Samboy: Carbon copy of Module:Chessboard mxn</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Samboy/Chessboard_mxn&amp;diff=146161&amp;oldid=prev"/>
		<updated>2022-08-10T19:37:44Z</updated>

		<summary type="html">&lt;p&gt;Carbon copy of &lt;a href=&quot;/research/Module:Chessboard_mxn&quot; title=&quot;Module:Chessboard mxn&quot;&gt;Module:Chessboard mxn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function chessboard(args, size, rows, cols, rev, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear)&lt;br /&gt;
    function colchar( col )&lt;br /&gt;
        return (col &amp;lt;= 26) and ( &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot; ):sub( col, col ) &lt;br /&gt;
        	or ( &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot; ):sub( math.floor((col-1)/26), math.floor((col-1)/26) ) &lt;br /&gt;
        		.. ( &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot; ):sub( col-math.floor((col-1)/26)*26, col-math.floor((col-1)/26)*26)&lt;br /&gt;
    end&lt;br /&gt;
    function image_square( pc, row, col, size, t, flip, altprefix )&lt;br /&gt;
        local colornames = { l = &amp;#039;white&amp;#039;, d = &amp;#039;black&amp;#039;, u = &amp;#039;unknown color&amp;#039; }&lt;br /&gt;
        local piecenames = { &lt;br /&gt;
            p = &amp;#039;pawn&amp;#039;, &lt;br /&gt;
            r = &amp;#039;rook&amp;#039;, &lt;br /&gt;
            n = &amp;#039;knight&amp;#039;, &lt;br /&gt;
            b = &amp;#039;bishop&amp;#039;, &lt;br /&gt;
            q = &amp;#039;queen&amp;#039;, &lt;br /&gt;
            k = &amp;#039;king&amp;#039;, &lt;br /&gt;
            a = &amp;#039;princess&amp;#039;,&lt;br /&gt;
            c = &amp;#039;empress&amp;#039;, &lt;br /&gt;
            z = &amp;#039;champion&amp;#039;, &lt;br /&gt;
            w = &amp;#039;wizard&amp;#039;, &lt;br /&gt;
            t = &amp;#039;fool&amp;#039;, &lt;br /&gt;
            h = &amp;#039;upside-down pawn&amp;#039;, &lt;br /&gt;
            m = &amp;#039;upside-down rook&amp;#039;, &lt;br /&gt;
            s = &amp;#039;upside-down knight&amp;#039;, &lt;br /&gt;
            f = &amp;#039;upside-down king&amp;#039;,  &lt;br /&gt;
            e = &amp;#039;upside-down bishop&amp;#039;, &lt;br /&gt;
            g = &amp;#039;upside-down queen&amp;#039;,&lt;br /&gt;
            G = &amp;#039;giraffe&amp;#039;,&lt;br /&gt;
            U = &amp;#039;unicorn&amp;#039;,&lt;br /&gt;
            Z = &amp;#039;zebra&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        local symnames = { &lt;br /&gt;
            xx = &amp;#039;black cross&amp;#039;, &lt;br /&gt;
            ox = &amp;#039;white cross&amp;#039;, &lt;br /&gt;
            xo = &amp;#039;black circle&amp;#039;, &lt;br /&gt;
            oo = &amp;#039;white circle&amp;#039;,&lt;br /&gt;
            ul = &amp;#039;up-left arrow&amp;#039;, &lt;br /&gt;
            ua = &amp;#039;up arrow&amp;#039;, &lt;br /&gt;
            ur = &amp;#039;up-right arrow&amp;#039;, &lt;br /&gt;
            la = &amp;#039;left arrow&amp;#039;, &lt;br /&gt;
            ra = &amp;#039;right arrow&amp;#039;,&lt;br /&gt;
            dl = &amp;#039;down-left arrow&amp;#039;, &lt;br /&gt;
            da = &amp;#039;down arrow&amp;#039;, &lt;br /&gt;
            dr = &amp;#039;down-right arrow&amp;#039;, &lt;br /&gt;
            lr = &amp;#039;left-right arrow&amp;#039;, &lt;br /&gt;
            ud = &amp;#039;up-down arrow&amp;#039;,&lt;br /&gt;
            db = &amp;#039;up-right and down-left arrow&amp;#039;,&lt;br /&gt;
            dw = &amp;#039;up-left and down-right arrow&amp;#039;,&lt;br /&gt;
            x0 = &amp;#039;zero&amp;#039;, &lt;br /&gt;
            x1 = &amp;#039;one&amp;#039;, &lt;br /&gt;
            x2 = &amp;#039;two&amp;#039;, &lt;br /&gt;
            x3 = &amp;#039;three&amp;#039;, &lt;br /&gt;
            x4 = &amp;#039;four&amp;#039;, &lt;br /&gt;
            x5 = &amp;#039;five&amp;#039;, &lt;br /&gt;
            x6 = &amp;#039;six&amp;#039;, &lt;br /&gt;
            x7 = &amp;#039;seven&amp;#039;, &lt;br /&gt;
            x8 = &amp;#039;eight&amp;#039;, &lt;br /&gt;
            x9 = &amp;#039;nine&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
        local color = mw.ustring.gsub( pc, &amp;#039;^.*(%w)(%w).*$&amp;#039;, &amp;#039;%2&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
        local piece = mw.ustring.gsub( pc, &amp;#039;^.*(%w)(%w).*$&amp;#039;, &amp;#039;%1&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
        local alt = altprefix .. colchar( col ) .. row .. &amp;#039; &amp;#039;&lt;br /&gt;
        if ( colornames[color] and piecenames[piece] ) then&lt;br /&gt;
            alt = alt .. colornames[color] .. &amp;#039; &amp;#039; .. piecenames[piece]&lt;br /&gt;
        else&lt;br /&gt;
            alt = alt .. ( symnames[piece .. color] or piece .. &amp;#039; &amp;#039; .. color )&lt;br /&gt;
        end&lt;br /&gt;
        local ld = t and &amp;#039;t&amp;#039; or ((((row + col + flip) % 2) == 0) and &amp;#039;d&amp;#039; or &amp;#039;l&amp;#039;)&lt;br /&gt;
        &lt;br /&gt;
        return string.format( &amp;#039;[[File:Chess %s%s%s45.svg|%dx%dpx|alt=%s|%s]]&amp;#039;, piece, color, ld, size, size, alt, alt )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function letters_row( rev, num_lt, num_rt, cols )&lt;br /&gt;
        local res = &amp;#039;&amp;lt;tr style=&amp;quot;vertical-align:middle&amp;quot;&amp;gt;&amp;#039; .. ( num_lt and &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;#039; or &amp;#039;&amp;#039; ) .. &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit; height:18px&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        for k = 1, cols do&lt;br /&gt;
            res = res .. colchar(rev and (cols - k + 1) or k) .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        res = res .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039; .. ( num_lt and &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;#039; or &amp;#039;&amp;#039; ) .. &amp;#039;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
        return res&lt;br /&gt;
    end&lt;br /&gt;
    local letters_tp = letters:match(&amp;#039;both&amp;#039;) or letters:match(&amp;#039;top&amp;#039;)&lt;br /&gt;
    local letters_bt = letters:match(&amp;#039;both&amp;#039;) or letters:match(&amp;#039;bottom&amp;#039;)&lt;br /&gt;
    local numbers_lt = numbers:match(&amp;#039;both&amp;#039;) or numbers:match(&amp;#039;left&amp;#039;)&lt;br /&gt;
    local numbers_rt = numbers:match(&amp;#039;both&amp;#039;) or numbers:match(&amp;#039;right&amp;#039;)&lt;br /&gt;
    local width = cols * size + 2&lt;br /&gt;
    local flip = lightdark and 1 or 0&lt;br /&gt;
    if ( numbers_lt ) then width = width + 18 end&lt;br /&gt;
    if ( numbers_rt ) then width = width + 18 end&lt;br /&gt;
&lt;br /&gt;
    local b = &amp;#039;&amp;#039;&lt;br /&gt;
    local caption = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if ( letters_tp ) then b = b .. letters_row(rev, numbers_lt, numbers_rt, cols) .. &amp;#039;\n&amp;#039; end&lt;br /&gt;
    for trow = 1,rows do&lt;br /&gt;
        local row = rev and trow or (rows - trow + 1)&lt;br /&gt;
        b = b .. &amp;#039;&amp;lt;tr style=&amp;quot;vertical-align:middle&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        if ( numbers_lt ) then b = b .. &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit; width:18px&amp;quot;&amp;gt;&amp;#039; .. row .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039; end&lt;br /&gt;
        for tcol = 1,cols do&lt;br /&gt;
            local col = rev and (cols - tcol + 1) or tcol&lt;br /&gt;
            local idx = cols*(rows - row) + col + 2&lt;br /&gt;
            if (args[idx] == nil) then args[idx] = &amp;#039;  &amp;#039; end&lt;br /&gt;
            local img = image_square(args[idx]:match(&amp;#039;%w%w&amp;#039;) or &amp;#039;&amp;#039;, row, col, size, trans, flip, altprefix )&lt;br /&gt;
            local bg = (((trow + tcol + flip) % 2) == 0) and &amp;#039;#ffce9e&amp;#039; or &amp;#039;#d18b47&amp;#039;&lt;br /&gt;
            b = b .. &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit; background-color: &amp;#039; .. bg .. &amp;#039;;&amp;quot;&amp;gt;&amp;#039; .. img .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        if ( numbers_rt ) then b = b .. &amp;#039;&amp;lt;td style=&amp;quot;padding:0; vertical-align:inherit; width:18px&amp;quot;&amp;gt;&amp;#039; .. row .. &amp;#039;&amp;lt;/td&amp;gt;&amp;#039; end&lt;br /&gt;
        b = b .. &amp;#039;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if ( letters_bt ) then b = b .. letters_row(rev, numbers_lt, numbers_rt, cols) .. &amp;#039;\n&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    if footer:match(&amp;#039;^%s*$&amp;#039;)&lt;br /&gt;
    then&lt;br /&gt;
    else    &lt;br /&gt;
        caption = &amp;#039;&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;&amp;#039; .. footer .. &amp;#039;&amp;lt;/div&amp;gt;\n&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    b = &amp;#039;&amp;lt;table cellpadding=0 cellspacing=0 class=&amp;quot;center noviewer&amp;quot; style=&amp;quot;line-height: 0; background:white; font-size:88%; border:1px #c8ccd1 solid;&amp;#039;&lt;br /&gt;
        .. &amp;#039;padding:0; margin:auto&amp;quot;&amp;gt;\n&amp;#039; .. b .. &amp;#039;\n&amp;lt;/table&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if noframe then&lt;br /&gt;
        return b&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;&amp;lt;div class=&amp;quot;thumb &amp;#039; .. align .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        .. &amp;#039;&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;#039; .. header .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; .. &amp;#039;\n&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:&amp;#039; .. width .. &amp;#039;px;&amp;quot;&amp;gt;\n&amp;#039; &lt;br /&gt;
        .. b .. &amp;#039;\n&amp;#039; .. caption .. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function convertFenToArgs( fen )&lt;br /&gt;
    -- converts FEN notation to an array of positions, offset by 2&lt;br /&gt;
    local res = {&amp;#039; &amp;#039;, &amp;#039; &amp;#039;}&lt;br /&gt;
    -- Loop over rows, which are delimited by /&lt;br /&gt;
    for srow in string.gmatch(&amp;quot;/&amp;quot; .. fen, &amp;quot;/%w+&amp;quot;) do&lt;br /&gt;
        -- Loop over all letters and numbers in the row&lt;br /&gt;
        for piece in srow:gmatch( &amp;quot;%w&amp;quot; ) do&lt;br /&gt;
            if (piece:match(&amp;quot;%d&amp;quot;)) then&lt;br /&gt;
                -- if a digit&lt;br /&gt;
                for k=1,piece do&lt;br /&gt;
                    table.insert(res,&amp;#039; &amp;#039;)&lt;br /&gt;
                end&lt;br /&gt;
            else &lt;br /&gt;
                -- not a digit&lt;br /&gt;
                local color = piece:match( &amp;#039;%u&amp;#039; ) and &amp;#039;l&amp;#039; or &amp;#039;d&amp;#039;&lt;br /&gt;
                piece = piece:lower()&lt;br /&gt;
                table.insert(res, piece .. color )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.board(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local size = (args.size or pargs.size) or &amp;#039;26&amp;#039;&lt;br /&gt;
    local reverse = (args.reverse or pargs.reverse or &amp;#039;&amp;#039; ):lower() == &amp;quot;true&amp;quot;&lt;br /&gt;
    local trans = (args.transparent or pargs.transparent or &amp;#039;&amp;#039; ):lower() == &amp;quot;true&amp;quot;&lt;br /&gt;
    local lightdark = (args.lightdark or pargs.lightdark or &amp;#039;&amp;#039; ):lower() == &amp;quot;swap&amp;quot;&lt;br /&gt;
    local altprefix = args.altprefix or pargs.altprefix or &amp;#039;&amp;#039;&lt;br /&gt;
    local rows = args.rows or pargs.rows or 8&lt;br /&gt;
    local cols = args.cols or pargs.cols or 8&lt;br /&gt;
    local letters = ( args.letters or pargs.letters or &amp;#039;both&amp;#039; ):lower() &lt;br /&gt;
    local numbers = ( args.numbers or pargs.numbers or &amp;#039;both&amp;#039; ):lower() &lt;br /&gt;
    local header =  mw.ustring.gsub( args[2] or pargs[2] or &amp;#039;&amp;#039;, &amp;#039;^%s*(.-)%s*$&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
    local footer = args[3 + rows*cols] or pargs[3 + rows*cols] or &amp;#039;&amp;#039;&lt;br /&gt;
    local align = ( args[1] or pargs[1] or &amp;#039;tright&amp;#039; ):lower()&lt;br /&gt;
    local clear = ( args.clear or pargs.clear ) or ( align:match(&amp;#039;tright&amp;#039;) and &amp;#039;right&amp;#039; or &amp;#039;none&amp;#039; )&lt;br /&gt;
    local noframe = (args.noframe or pargs.noframe or &amp;#039;&amp;#039;):lower() == &amp;quot;true&amp;quot;&lt;br /&gt;
    local fen = args.fen or pargs.fen&lt;br /&gt;
&lt;br /&gt;
    size = mw.ustring.match(size, &amp;#039;[%d]+&amp;#039;) or &amp;#039;26&amp;#039; -- remove px from size&lt;br /&gt;
    if (fen) then&lt;br /&gt;
        align = ( args.align or pargs.align or &amp;#039;tright&amp;#039; ):lower()&lt;br /&gt;
        clear = ( args.clear or pargs.clear ) or ( align:match(&amp;#039;tright&amp;#039;) and &amp;#039;right&amp;#039; or &amp;#039;none&amp;#039; )&lt;br /&gt;
        header = args.header or pargs.header or &amp;#039;&amp;#039;&lt;br /&gt;
        footer = args.footer or pargs.footer or &amp;#039;&amp;#039;&lt;br /&gt;
        return chessboard(convertFenToArgs( fen ), size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)&lt;br /&gt;
    end&lt;br /&gt;
    if args[3] then&lt;br /&gt;
        return chessboard(args, size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)&lt;br /&gt;
    else&lt;br /&gt;
        return chessboard(pargs, size, rows, cols, reverse, trans, lightdark, altprefix, letters, numbers, header, footer, align, clear, noframe)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Samboy</name></author>
	</entry>
</feed>