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