mirror of
http://git.davidovski.xyz/shblg.git
synced 2024-08-15 00:43:48 +00:00
Paragraph and heading parsing for md2html
This commit is contained in:
commit
e13af149ea
3 changed files with 142 additions and 0 deletions
130
src/md2html.sh
Executable file
130
src/md2html.sh
Executable 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
4
src/shblg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
BLOG_DIR
|
||||||
|
OUTPUT_DIR
|
||||||
8
src/test.md
Normal file
8
src/test.md
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue