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…
Reference in a new issue