Paragraph and heading parsing for md2html

This commit is contained in:
davidovski 2023-02-17 23:53:07 +00:00
commit e13af149ea
3 changed files with 142 additions and 0 deletions

130
src/md2html.sh Executable file
View file

@ -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

4
src/shblg Normal file
View file

@ -0,0 +1,4 @@
#!/bin/sh
BLOG_DIR
OUTPUT_DIR

8
src/test.md Normal file
View file

@ -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