From e13af149eaa5d8f83437e273b17a535d250a4cde Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 17 Feb 2023 23:53:07 +0000 Subject: Paragraph and heading parsing for md2html --- src/md2html.sh | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100755 src/md2html.sh (limited to 'src/md2html.sh') 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 and closign tags +# +_post_emph () { + while IFS= read -r line; do + # TODO: avoid this problem entirely? + + local wrong="" right="" + + 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] +# +_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 "%s\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 "

\n" + + empty=true ;; + *) + $empty && + printf "

%s " "$line" || + printf "%s " "$line" + + empty=false ;; + esac + + done + + $empty || { + printf "

\n" + } +} + + +# convert the markdown from stdin into html +# +md2html () { + _p \ + | _pre_emph \ + | _emph '__' "" "" \ + | _emph '_' "" "" \ + | _post_emph \ + | _h 6 \ + | _h 5 \ + | _h 4 \ + | _h 3 \ + | _h 2 \ + | _h 1 +} + +md2html + -- cgit v1.2.1