Actually it's quite simple. We parse from left to right. When we hit EOL, we return to the beginning of line and increase Y by one.
Blocks are parsed in the following way: when we get the beginning count of block opening characters, we move Y by one, loop right while whitespace, until we encounter ending count of block characters.
In transposed block, we just switch X and Y, it is easily done with pointers, and use the same code.