I’d like to suggest that the directive syntax from reStructuredText be considered as a generic block-level extension syntax. It’s straightforward, if a little verbose, and is unlikely to conflict with anything. It looks like this:
.. directive-name:: [ positional arguments ]
[ :key1: value1
:key2: value2
... ]
[ text content, one or more paragraphs ]
All arguments are optional; if there is “text content”, it must be set off by a blank line; everything after the .. directive-name::
line that’s supposed to count as part of the directive must be indented at least three spaces. (For Markdown purposes, I would suggest that laziness is allowed to apply to text content as for paragraphs within list items, but not key-value arguments.)
reST also has an inline-extension syntax, :role:`text`
but I’m less fond of it.