> (when (looking-at "[ \t]*#\\+BEGIN_\\S-+[ \t]+\\(\\S-+\\)")
Sorry, it obviously should have been \\(.+\\) at the end. One thing the core parser could do is to put the remaining of the opening line of a special block into an :args or similar property of the special block element, leaving it otherwise unparsed. This is in the same spirit than what it already do for the affiliated attrs_X element. It's not a lot of help but it would at least spare backends from having to parse the remaining of the opening line as I did. They would still have to parse :args exactly as they now parse :attrs_X, but there are helper functions for that task. The idea is that stuff that is very specific to a backend X would be in :attrs_X, but stuff that is related to what makes the block semantically special could be in :args. Nevertheless special blocks will probably be backend specific in most cases.