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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/shblg | 4 ++ src/test.md | 8 ++++ 3 files changed, 142 insertions(+) create mode 100755 src/md2html.sh create mode 100644 src/shblg create mode 100644 src/test.md (limited to 'src') 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 + diff --git a/src/shblg b/src/shblg new file mode 100644 index 0000000..5361975 --- /dev/null +++ b/src/shblg @@ -0,0 +1,4 @@ +#!/bin/sh + +BLOG_DIR +OUTPUT_DIR diff --git a/src/test.md b/src/test.md new file mode 100644 index 0000000..15bd4a1 --- /dev/null +++ b/src/test.md @@ -0,0 +1,8 @@ +# This is a test md file hello + +This is *italics* this is **bold** this is ***both*** wow + +so hold tight +this is a paragraph + +haha -- cgit v1.2.1