One tiny nit in an otherwise great piece of code:
return show_err("Unended <$tag> detected");
I suspect that show_err() needs to escape HTML entities. Wrapping its arguments in <font> tags isn't sufficient.
That is one of several small mistakes in the code. Another
is that there is only one allowed font attribute and it
makes no sense. Another is that the RE engine has a bit of
behaviour that I didn't understand when I wrote the code,
and so I need to somewhere insert
pos($raw) = pos($raw);. I leave verification
that this is not a no-op, plus discovery of how this can
lead to a bug, to a close reading of perlre. An important
one pointed out by nate is that in reality the post will
appear inside of a layout which is itself done with tables.
Various tags that start new parts of a table should only
be allowed inside of a table that you start. Plus he
pointed out that some HTML tags take attributes which do
not follow the usual pattern, for instance checkboxes can
For these reasons and more, I did a rewrite at Functional take 2
which should have somewhat fewer bugs. I long ago made
the decision that (partly because this site does not keep
revision histories) I wanted to leave the original as it
was, flaws and all.