# -*- awk -*- BEGIN { FS="\n"; RS="" i=0 _end = "__END__" _el=" el "; _defel="p" } function start(el, not_html) { # start an element el = (el ? el : _defel) pre_el = (not_html ? "" : _el) split(el, el_a, " ") lvl[++i] = el_a[1] return "$(<<" _end i lvl[i] pre_el el "\n" } function end() { # end an element return "\n" _end i lvl[i--] "\n)" } function wrap(par) { # wrap a non-delimited paragraph with

if (par !~ /^<.*>$/) return start() par end() else return par } /^@[^@()]/ { # html element $1 = start(substr($1, 2)) sub(/\n?$/, end()) print next } /^@@[^()]/ { # arbitrary command $1 = start(substr($1, 3)) sub(/\n?$/, end()) print next } /^@\(/ { # nested element begin print start(substr($1, 3)) $1=""; $0=$0 } /^@@\(/ { # nested arbitrary command begin print start(substr($1, 4)) $1=""; $0=$0 } /@@?\)$/ { # nested element end nf=$NF; NF--; $0=$0; print if ($0) { print wrap($0) print substr(nf, 0, length(nf)-2) end() } else print end() next } { print wrap($0); }