Aha! I figured out why the chess board didn't start at the top of the page. I had used carriage returns inside of my table, and the BBCode processor doesn't seem to know where to put them in the resulting HTML, so it puts them in
front of the table. In this version, I removed all carriage returns, and the table starts where it should:
♜ | ♞ | ♝ | ♛ | ♚ | ♝ | ♞ | ♜ |
♟ | ♟ | ♟ | ♟ | ♟ | ♟ | ♟ | ♟ |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
♙ | ♙ | ♙ | ♙ | ♙ | ♙ | ♙ | ♙ |
♖ | ♘ | ♗ | ♕ | ♔ | ♗ | ♘ | ♖ |
In retrospect it makes some sense. In HTML, all white space (spaces, tabs, carriage returns, line feeds) is ignored. To force a new line in HTML, you have to use an explicit tag (like "br" or "p"). But BBCode is meant to be easier, and it lets you use regular new lines in your code to make new lines in the HTML. So while new lines in a table shouldn't have any effect on HTML, these new lines were appearing in the BBCode, and it tried to add the HTML breaks for each new line ... somewhere. I think it's a bug in the BBCode translator to put those newlines outside the table, but it may also be considered a "feature". Either way, the lesson is clear: don't use carriage returns or line feeds inside of a chess table!!