diff options
author | davidovski <david@davidovski.xyz> | 2023-02-17 23:53:07 +0000 |
---|---|---|
committer | davidovski <david@davidovski.xyz> | 2023-02-17 23:53:07 +0000 |
commit | e13af149eaa5d8f83437e273b17a535d250a4cde (patch) | |
tree | 308ae973796caeb8098f79e4ce774830f9e8026a /src/md2html.sh |
Paragraph and heading parsing for md2html
Diffstat (limited to 'src/md2html.sh')
-rwxr-xr-x | src/md2html.sh | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/md2html.sh b/src/md2html.sh new file mode 100755 index 0000000..f675399 --- /dev/null +++ b/src/md2html.sh @@ -0,0 +1,130 @@ +#!/bin/sh + +# replace all * with _ for easier processing +# +_pre_emph () { + while IFS= read -r line; do + while [ "$line" != "${line%%\**}" ]; do + printf "%s_" "${line%%\**}" + line="${line#*\*}" + done + printf "${line}\n" + done +} + + +# fix any misaligned <em> and <strong> closign tags +# +_post_emph () { + while IFS= read -r line; do + # TODO: avoid this problem entirely? + + local wrong="</strong></em>" right="</em></strong>" + + while [ "$line" != "${line%%${wrong}*}" ]; do + printf "%s${right}" "${line%%${wrong}*}" + line="${line#*${wrong}}" + done + printf "${line}\n" + done +} + +# parse emphasis in a line +# +# emph [bound] <lefttag> <righttag> +# +_emph () { + local bound="$1" + local lefttag="$2" righttag="$3" + + while IFS= read -r line; do + next="${line}" + line= + rightofbold= + + while [ "$next" != "${next#*${bound}}" ]; do + leftofbold="${next%%${bound}*}" + rightofbold="${next#$leftofbold${bound}*}" + bold="${rightofbold%%${bound}*}" + next="${rightofbold#*${bound}}" + printf "%s%s%s%s" "${leftofbold}" "${lefttag}" "${bold}" "${righttag}" + done + printf "%s\n" "${next}" + done +} + +# parse heading +# +# h [heading no.] +_h () { + local num=$1 + while IFS= read -r line; do + s= + + n=$num + while [ "$n" -gt "0" ]; do + s="#$s" + n=$((n-1)) + done + + case "$line" in + "$s "*) + printf "<h$num>%s</h$num>\n" "${line#$s }" + ;; + *) + printf "%s\n" "$line" + ;; + esac + done +} + +# parse paragraphs +# +# p +_p () { + local num=$1 + empty=true + while IFS= read -r line; do + case "$line" in + "#"*) + printf "%s\n" "$line" + ;; + "") + $empty || + printf "</p>\n" + + empty=true ;; + *) + $empty && + printf "<p>%s " "$line" || + printf "%s " "$line" + + empty=false ;; + esac + + done + + $empty || { + printf "</p>\n" + } +} + + +# convert the markdown from stdin into html +# +md2html () { + _p \ + | _pre_emph \ + | _emph '__' "<strong>" "</strong>" \ + | _emph '_' "<em>" "</em>" \ + | _post_emph \ + | _h 6 \ + | _h 5 \ + | _h 4 \ + | _h 3 \ + | _h 2 \ + | _h 1 +} + +md2html + |