From: Christian Heller Date: Sat, 19 Nov 2016 13:51:23 +0000 (+0100) Subject: Move work so far into repo. X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdb.prefix%7D%7D/task?a=commitdiff_plain;h=58272f437f554daa14ac1dfdf9902d48c17841bf;p=redo-blog Move work so far into repo. --- 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