From 58272f437f554daa14ac1dfdf9902d48c17841bf Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sat, 19 Nov 2016 14:51:23 +0100 Subject: [PATCH] Move work so far into repo. --- add_dir.sh | 12 +++++++ all.do | 41 ++++++++++++++++++++++ author.do | 5 +++ default.html.do | 27 +++++++++++++++ default.intermediate.do | 15 ++++++++ default.uuid.do | 5 +++ feed.xml.do | 70 ++++++++++++++++++++++++++++++++++++++ helpers.sh | 19 +++++++++++ index.html.do | 37 ++++++++++++++++++++ intermediate.tmpl | 2 ++ test.sh | 17 +++++++++ test/test_files/bar baz.md | 2 ++ test/test_files/foo.rst | 6 ++++ test/test_files/index.html | 14 ++++++++ test/test_files/test.md | 2 ++ title.do | 5 +++ url.do | 5 +++ uuid.do | 5 +++ 18 files changed, 289 insertions(+) create mode 100755 add_dir.sh create mode 100644 all.do create mode 100644 author.do create mode 100644 default.html.do create mode 100644 default.intermediate.do create mode 100644 default.uuid.do create mode 100644 feed.xml.do create mode 100644 helpers.sh create mode 100644 index.html.do create mode 100644 intermediate.tmpl create mode 100755 test.sh create mode 100644 test/test_files/bar baz.md create mode 100644 test/test_files/foo.rst create mode 100644 test/test_files/index.html create mode 100644 test/test_files/test.md create mode 100644 title.do create mode 100644 url.do create mode 100644 uuid.do diff --git a/add_dir.sh b/add_dir.sh new file mode 100755 index 0000000..116e891 --- /dev/null +++ b/add_dir.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +curdir=`pwd` +mkdir -p "$1" +cd "$1" +for file in "$curdir"/*.do "$curdir"/helpers.sh "$curdir"/intermediate.tmpl; do + set +e + ln -s "$file" + set -e +done diff --git a/all.do b/all.do new file mode 100644 index 0000000..edd2b47 --- /dev/null +++ b/all.do @@ -0,0 +1,41 @@ +#!/bin/sh + +# Remove target files for which no sources files can be found. +for file in *.intermediate; do + if test -f "$file" && + ! test -f "${file%.intermediate}.md" && + ! test -f "${file%.intermediate}.rst"; then + rm "$file" + fi +done +for file in *.uuid; do + if test -f "$file" && + ! test -f "${file%.uuid}.md" && + ! test -f "${file%.uuid}.rst"; then + rm "$file" + fi +done +for file in *.html; do + if test -f "$file" && + ! test "$file" = "index.html" && + ! test -f "${file%.html}.intermediate"; then + rm "$file" + fi +done + +# Determine target files from the sources files present, declare dependencies +# of the all.do script on them / build them if necessary. +for file in *.rst *.md; do + if test -f "$file"; then + redo-ifchange "${file%.*}.intermediate" + fi +done +for file in *.intermediate; do + if test -f "$file"; then + redo-ifchange "${file%.*}.html" + fi +done + +# Regenerate feed and index pages. Always. +redo "feed.xml" +redo "index.html" diff --git a/author.do b/author.do new file mode 100644 index 0000000..ed14e3f --- /dev/null +++ b/author.do @@ -0,0 +1,5 @@ +#!/bin/sh + +if [ ! -f "$1" ]; then + printf "Joe Sixpack" +fi diff --git a/default.html.do b/default.html.do new file mode 100644 index 0000000..3ff4132 --- /dev/null +++ b/default.html.do @@ -0,0 +1,27 @@ +#!/bin/sh + +# Pull in global dependencies. +. ./helpers.sh +intermediate_file="${1%.html}.intermediate" +redo-ifchange title +redo-ifchange "$intermediate_file" + +# Build entry data. +blog_title=`read_and_escape_file title | head -1` +title_html=`cat "$intermediate_file" | head -1` +title_plaintext=`echo "$title_html" | html2text` +title_plaintext_escaped=`escape_html "$title_plaintext"` +body=`cat "$intermediate_file" | sed 1d` + +# Write first part of entry head. +cat << EOF + + + +EOF + +# Write remaining entry head and body. +printf "%s – %s\n\n\n" "$blog_title" "$title_plaintext_escaped" +#printf "%s – %s\n\n\n" "$blog_title" "$entry_title" +printf "

%s

\n" "$title_html" +printf "
\n%s\n
\n\n" "$body" diff --git a/default.intermediate.do b/default.intermediate.do new file mode 100644 index 0000000..7470c3c --- /dev/null +++ b/default.intermediate.do @@ -0,0 +1,15 @@ +#!/bin/sh + +template=intermediate.tmpl +uuidfile="${1%.intermediate}.uuid" +redo-ifchange "$uuidfile" +redo-ifchange "$template" +mdfile="${1%.intermediate}.md" +rstfile="${1%.intermediate}.rst" +if [ -f "$rstfile" ]; then + redo-ifchange "$rstfile" + pandoc -f rst --template="$template" --mathml -t html5 "$rstfile" > "$3" +elif [ -f "$mdfile" ]; then + redo-ifchange "$mdfile" + pandoc -f markdown --template="$template" --mathml -t html5 "$mdfile" > "$3" +fi diff --git a/default.uuid.do b/default.uuid.do new file mode 100644 index 0000000..5efffc8 --- /dev/null +++ b/default.uuid.do @@ -0,0 +1,5 @@ +#!/bin/sh + +if [ ! -f "$1" ]; then + uuidgen > "$1" +fi diff --git a/feed.xml.do b/feed.xml.do new file mode 100644 index 0000000..2cdb7b2 --- /dev/null +++ b/feed.xml.do @@ -0,0 +1,70 @@ +#!/bin/sh + +# Pull in global dependencies. +. ./helpers.sh +redo-ifchange url +redo-ifchange author +redo-ifchange uuid +redo-ifchange title + +# Build some variables. XML-escape even file contents that should not contain +# dangerous characters, just to avoid any XML trouble. +base_url=`cat url | head -1` +url_protocol=`echo $base_url | cut -d ':' -f 1` +url_basepath=`echo $base_url | cut -d '/' -f 3-` +url_basepath_escaped=`escape_url "$url_basepath"` +basepath="$url_protocol""://""$url_basepath_escaped" +title=`read_and_escape_file title | head -1` +author=`read_and_escape_file author | head -1` +uuid=`read_and_escape_file uuid | head -1` + +# Write majority of feed head. +cat << EOF + + +EOF +printf "\n" "$basepath" +printf "\n" "$basepath" +printf "%s\n" "$title" +printf "%s\n" "$author" +printf "urn:uuid:%s\n" "$uuid" + +# Iterate through most recent entries (go by lastmod date of source files) to +# build feed head "updated" element, and individual entries. +first_run=0 +files=`ls -1t *.rst *.md | head -10 | tr '\n' $'\0'` +oldIFS="$IFS" +IFS=$'\0' +for file in $files; do + lastmod=`stat -c%y "$file"` + lastmod_rfc3339=`date -u "+%Y-%m-%dT%TZ" -d "$lastmod"` + if [ "$first_run" -lt "1" ]; then + IFS="$oldIFS" + printf "%s\n\n" "$lastmod_rfc3339" + first_run=1 + fi + + # Build some variables and dependencies. + intermediate_file="${file%.*}.intermediate" + htmlfile=`escape_url "${file%.*}.html"` + redo-ifchange "$intermediate_file" + redo-ifchange "$uuidfile" + title=`read_and_escape_file "$intermediate_file" | head -1` + uuidfile="${file%.*}.uuid" + uuid=`read_and_escape_file "$uuidfile" | head -1` + body=`read_and_escape_file "$intermediate_file" | sed 1d` + published=`stat -c%y "$uuidfile"` + published_rfc3339=`date -u "+%Y-%m-%dT%TZ" -d "$published"` + + # Write entry. + printf "\n" + printf "%s\n" "$title" + printf "urn:uuid:%s\n" "$uuid" + printf "%s\n" "$lastmod_rfc3339" + printf "%s\n" "$published_rfc3339" + printf "\n" "$basepath" "$htmlfile" + printf "\n%s\n\n" "$body" + printf "\n\n" +done + +printf "" diff --git a/helpers.sh b/helpers.sh new file mode 100644 index 0000000..c90e077 --- /dev/null +++ b/helpers.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +escape_html() +{ +out=`python3 -c 'import sys, html; print(html.escape(sys.argv[1]))' "$1"` +printf "%s" "$out" +} + +read_and_escape_file() +{ +in=`cat "$1"` +escape_html "$in" +} + +escape_url() +{ +out=`python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1]))' "$1"` +printf "%s" "$out" +} diff --git a/index.html.do b/index.html.do new file mode 100644 index 0000000..8bf6751 --- /dev/null +++ b/index.html.do @@ -0,0 +1,37 @@ +#!/bin/sh + +# Pull in global dependencies. +. ./helpers.sh +redo-ifchange title + +# Write index head. +cat << EOF + + + +EOF +blog_title=`read_and_escape_file title | head -1` +printf "%s\n\n\n" "$blog_title" +printf "

%s

\n\n\n" diff --git a/intermediate.tmpl b/intermediate.tmpl new file mode 100644 index 0000000..2357009 --- /dev/null +++ b/intermediate.tmpl @@ -0,0 +1,2 @@ +$title$ +$body$ diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..00194ba --- /dev/null +++ b/test.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +rm -rf test/test_dir +./add_dir.sh test/test_dir +cp test/test_files/test.md test/test_dir/ +cp test/test_files/foo.rst test/test_dir/ +cp test/test_files/bar\ baz.md test/test_dir/ +cd test/test_dir +redo +cd ../.. +echo "== index.html diff test ==" +diff test/test_files/index.html test/test_dir/index.html +if [ "$?" = "0" ]; then + echo "== test SUCCESS ==" +else + echo "== test FAILURE ==" +fi diff --git a/test/test_files/bar baz.md b/test/test_files/bar baz.md new file mode 100644 index 0000000..423430d --- /dev/null +++ b/test/test_files/bar baz.md @@ -0,0 +1,2 @@ +% foo +bar diff --git a/test/test_files/foo.rst b/test/test_files/foo.rst new file mode 100644 index 0000000..951861b --- /dev/null +++ b/test/test_files/foo.rst @@ -0,0 +1,6 @@ +a title with some nasty characters: &<>"' +========================================= + +this text contains some special characters: '"><& + +and more than one paragraph diff --git a/test/test_files/index.html b/test/test_files/index.html new file mode 100644 index 0000000..f5b755c --- /dev/null +++ b/test/test_files/index.html @@ -0,0 +1,14 @@ + + + +Yet another blog + + +

Yet another blog

+ + + \ No newline at end of file diff --git a/test/test_files/test.md b/test/test_files/test.md new file mode 100644 index 0000000..3dd09f7 --- /dev/null +++ b/test/test_files/test.md @@ -0,0 +1,2 @@ +% foo *bar* **baz** +bar diff --git a/title.do b/title.do new file mode 100644 index 0000000..082accf --- /dev/null +++ b/title.do @@ -0,0 +1,5 @@ +#!/bin/sh + +if [ ! -f "$1" ]; then + printf "Yet another blog" +fi diff --git a/url.do b/url.do new file mode 100644 index 0000000..4e4079f --- /dev/null +++ b/url.do @@ -0,0 +1,5 @@ +#!/bin/sh + +if [ ! -f "$1" ]; then + printf "http://example.org/" +fi diff --git a/uuid.do b/uuid.do new file mode 100644 index 0000000..ba9e919 --- /dev/null +++ b/uuid.do @@ -0,0 +1,5 @@ +#!/bin/sh + +if [ ! -f "$1" ]; then + uuidgen +fi -- 2.30.2