#!/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