#!/bin/sh ## wag is a tool to generate static web sites unset CDPATH export LC_ALL=C IFS=' ' cmd=$(command -v "$0") ## help prints this program documentation help() { awk '/^## / {print substr($0, 4)}' "$cmd"; } lipsum='Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' # An overly simplified http request parser for static web sites. http_request() { read -r cmd uri proto case $uri in */) uri="${uri}index.html" ;; esac while true; do read -r line || break [ ${#line} = 0 ] && break done printf 'HTTP/1.1 200 OK\n\n' && cat "${uri#/}" } md2h() { want="$2" got=$(echo "$1" | md2html -); } md2html() { tmp=$(mktemp -u) trap "rm -f '$tmp'" EXIT { cat "${1:--}" | tee "$tmp" | awk '/^[ ]*\[[^]]+\]:/' cat "$tmp" } | awk ' function newblock(nblock) { if (text) print "<" block ">" text "" block ">" text = "" out = 1 block = nblock ? nblock : "p" } function subinline(tgl, inl) { while (match($0, tgl)) { if (inline[ni] == inl) ni -= sub(tgl, "" inl ">") else if (sub(tgl, "<" inl ">")) inline[++ni] = inl } } function dolink(href, lnk) { # Undo escaped html in uris gsub(/&/, "\\&", href) gsub(/</, "<", href) gsub(/>/, ">", href) # & can be tricky, and not standard: gsub(/&/, "\\\\\\&", href) gsub(/&/, "\\\\\\&", lnk) return "" lnk "" } BEGIN { ni = 0 # inlines nl = 0 # nested lists out = 0 # 0 if no output so far text = "" block = "p" } # Skip front matter. out == 0 && $0 == "---" { do getline while ($0 != "---") next } # Escape HTML. esc != "false" { gsub("&", "\\&") gsub("<", "\\<") gsub(">", "\\>") } # Internal references. match($0, /^[ ]*\[[^]]+\]:/) > 0 { k = substr($0, RSTART+1, RLENGTH-3) v = substr($0, RLENGTH+1) sub(/^[ ]/, "", v) sub(/[ ]$/, "", v) ref[substr($0, RSTART+1, RLENGTH-3)] = v next } # Horizontal rules. /^[ ]*([-*_] ?)+[ ]*$/ && text == "" { print "
abc def ghi
' test_run md2h 'abc **def** ghi' 'abc def ghi
' test_run md2h 'abc *def* ghi' 'abc def ghi
' test_run md2h 'abc ***def*** ghi' 'abc def ghi
' test_run md2h 'abc `def` ghi' 'abc def ghi
abc github def
' test_run md2h 'abc [github](https://github.com) def' 'abc github def
' test_run md2h 'abc [github] def [github]: https://github.com' 'abc github def
' test_run md2h '--- Title: front matter test --- Hello [world]. --- Bye. [world]: http://example.com' 'Hello world.
Bye.
' echo "Total: $((pass + fail + skip)), Passed: $pass, Failed: $fail, Skip: $skip" return "$fail" } test_run() { eval "test_$1=\$((test_$1 + 1)); ti=\"\$test_$1\"" [ "$tfilter" ] && case "$1#$ti" in $tfilter) ;; *) skip=$((skip + 1)); return 0 ;; esac "$@" [ "$got" = "$want" ] && { pass=$((pass + 1)) return 0 } fail=$((fail + 1)) printf "%s FAIL\n Got: %s\n Want: %s\n" "$1#$ti" "$got" "$want" >&2 return 1 } # Execute command line [ "$1" ] || help && "$@"