64 lines
1.1 KiB
Awk
64 lines
1.1 KiB
Awk
# -*- 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 <p>
|
|
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); }
|