summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xblog94
-rw-r--r--blog.1124
2 files changed, 218 insertions, 0 deletions
diff --git a/blog b/blog
new file mode 100755
index 0000000..22cefef
--- /dev/null
+++ b/blog
@@ -0,0 +1,94 @@
+#!/usr/bin/make -f
+
+ifneq ($(filter-out help,$(MAKECMDGOALS)),)
+include config
+endif
+
+# The following can be configured in config
+BLOG_DATE_FORMAT_INDEX ?= %x
+BLOG_DATE_FORMAT ?= %x %X
+
+
+.PHONY: help init build deploy clean
+
+ARTICLES = $(shell git ls-tree HEAD --name-only -- articles/ 2>/dev/null)
+
+help:
+ $(info blog init|build|deploy|clean)
+
+init:
+ git init
+ git config user.name '$(shell printf "Git user name: ">/dev/tty; head -n1)'
+ git config user.email '$(shell printf "Git user email: ">/dev/tty; head -n1)'
+ mkdir -p articles data templates
+ printf '<!DOCTYPE html><html><head><title>$$TITLE</title></head><body>' > templates/header.html
+ printf '</body></html>' > templates/footer.html
+ printf '<ul>' > templates/index_header.html
+ printf '<li><a href="$$URL">$$DATE $$TITLE</a></li>' > templates/index_entry.html
+ printf '</ul>' > templates/index_footer.html
+ printf '<h1>$$TITLE</h1>' > templates/article_header.html
+ printf '' > templates/article_footer.html
+ printf 'blog\n' > .git/info/exclude
+ git add .
+ git commit -em "Initial commit"
+
+build: blog/index.html $(patsubst articles/%,blog/%.html,$(ARTICLES))
+
+deploy: build
+ rsync -rLtvz blog/ data/ $(BLOG_REMOTE)
+
+clean:
+ rm -rf blog
+
+config:
+ printf 'BLOG_REMOTE:=%s\n' \
+ '$(shell printf "Blog remote (eg: host:/var/www/html): ">/dev/tty; head -n1)' \
+ > $@
+
+blog/index.html: $(ARTICLES) $(addprefix templates/,$(addsuffix .html,header index_header index_entry index_footer footer))
+ mkdir -p blog
+ TITLE="index"; \
+ export TITLE; \
+ envsubst < templates/header.html > $@
+ envsubst < templates/index_header.html >> $@
+ for f in $(ARTICLES); do \
+ printf '%s ' "$$f"; \
+ git log --diff-filter=A --date="format:%s $(BLOG_DATE_FORMAT_INDEX)" --pretty=format:'%ad ' -- "$$f"; \
+ done | sort -k2nr | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \
+ URL="`printf '%s' "\$$FILE" | sed 's,^articles/,,'`.html" \
+ DATE="$$DATE" \
+ TITLE="`head -n1 "\$$FILE"`" \
+ envsubst < templates/index_entry.html; \
+ done >> $@
+ envsubst < templates/index_footer.html >> $@
+ envsubst < templates/footer.html >> $@
+
+blog/%.html: articles/% $(addprefix templates/,$(addsuffix .html,header article_header article_footer footer))
+ mkdir -p blog
+ TITLE="$(shell head -n1 $<)"; \
+ export TITLE; \
+ DATE_POSTED="$(shell git log --diff-filter=A --date="format:$(BLOG_DATE_FORMAT)" --pretty=format:'%ad' -- "$<")"; \
+ export DATE_POSTED; \
+ DATE_EDITED="$(shell git log -n 1 --date="format:$(BLOG_DATE_FORMAT)" --pretty=format:'%ad' -- "$<")"; \
+ export DATE_EDITED; \
+ TAGS="$(shell grep -i '^; *tags:' "$<" | cut -d: -f2- | paste -sd ',')"; \
+ export TAGS; \
+ envsubst < templates/header.html > $@; \
+ envsubst < templates/article_header.html >> $@; \
+ sed -e 1d -e '2{/^$$/d}' \
+ -e '/^;/d' \
+ -e 's/</\&lt;/g' \
+ -e 's/>/\&gt;/g' \
+ -e '/^####/{s,^####,<h4>,;s,$$,</h4>,p;d}' \
+ -e '/^###/{s,^###,<h3>,;s,$$,</h3>,p;d}' \
+ -e '/^##/{s,^##,<h2>,;s,$$,</h2>,p;d}' \
+ -e '/^#/{s,^#,<h1>,;s,$$,</h1>,p;d}' \
+ -e 's,\*\*\(\([^*][^*]*\*\?\)*\)\*\*,<b>\1</b>,g' \
+ -e 's,\*\([^*][^*]*\)\*,<i>\1</i>,g' \
+ -e 's,!\[\([^]]*\)\](\([^)]*\)),<img src="\2" alt="\1"/>,g' \
+ -e 's,\[\([^]]*\)\](\([^)]*\)),<a href="\2">\1</a>,g' \
+ -e 's,`\([^`]*\)`,<q>\1</q>,g' \
+ -n -e '/^$$/{x;s,^,<p>,;s,$$,</p>,;p;d};H;$${x;p}' \
+ "$<" | envsubst >> $@; \
+ envsubst < templates/article_footer.html >> $@; \
+ envsubst < templates/footer.html >> $@; \
diff --git a/blog.1 b/blog.1
new file mode 100644
index 0000000..03c8c3a
--- /dev/null
+++ b/blog.1
@@ -0,0 +1,124 @@
+.TH BLOG 1 blog\-1.0
+.SH NAME
+blog \- a small static blog generator
+
+.SH SYNOPSIS
+.B blog
+.RB [ init | build | deploy | clean ]
+
+.SH DESCRIPTION
+.B blog
+is a small static blog generator, using a markdown-like syntax and git capabilities.
+For example, first posted and last edited dates are extracted from git history.
+
+.SH GETTING STARTED
+Run "blog init" and follow the interactive configuration.
+This will create the basic structure and initialize a git repository.
+
+.SH STRUCTURE
+Articles are created in the
+.B articles
+directory, using a markdown-like syntax (see
+.BR SYNTAX ).
+HTML templates (configurable chunks of HTML code that will be used for static page generation) are stored in the
+.B templates
+directory, and can be edited (see
+.BR TEMPLATES ).
+Additional data can be stored in the
+.B data
+directory and will be copied at the root of the website.
+
+.SH WORKFLOW
+The articles, templates and data can be created and edited offline.
+To create a local version of the blog, run "blog build".
+It will be available in the
+.B blog
+directory, and the main page is index.html.
+Note that only articles known to git will be created (this is to prevent unfinished articles to be published).
+When its ready for publication, commit the changes to the git repository, and build the blog using "blog build".
+Then run "blog deploy" to publish the site with
+.BR rsync (1)
+to the remote configured at the beginning.
+
+.SH SYNTAX
+The first line of the article text file is its title.
+The next line can be blank, and will be skipped if that case.
+Then the remaining of the file is in a markdown format, with the following formatting options:
+.TP
+.B Sections
+Sections and subsections are defined by lines starting with one or several
+.RB ' # ',
+each indicating a new section level.
+.TP
+.B Paragraphs
+Paragraphs are started with a blank line.
+.TP
+.B Bold, italics
+Chunks enclosed in stars
+.RB ' * '
+are formatted in bold.
+Chunks enclosed with two stars
+.RB ' ** '
+are formatted in bold.
+.TP
+.B Images
+Images are inserted using the following syntax: "![alternate text](url)".
+.TP
+.B Links
+Links are inserted using the following syntax: "[link text](url)".
+.TP
+.B Comments
+Lines starting with a semi-colon are comments and are ignored.
+It can be used to store metadata.
+In particular, comments beginning with "tags:" indicate tags and are available in the templates in the TAGS variable.
+
+.SH TEMPLATES
+Templates are small HTML code chunks that are used to build the blog pages.
+Any variable reference
+.RB ( $VARNAME )
+is replaced with the corresponding environment variable value.
+
+.SS Index page
+The index page is built using the following templates:
+
+- header.html;
+
+- index_header.html;
+
+- index_entry.html, for each article entry;
+
+- index_footer.html;
+
+- footer.html.
+
+The TITLE variable will contain "index".
+In index_entry, the following additional variables are available:
+
+- URL, containing the (relative) URL of the article;
+
+- DATE, the first publication date;
+
+- TITLE, the title of the article.
+
+.SS Article pages
+Article pages are built from the following templates:
+
+- header.html
+
+- index_header.html
+
+- (then the article file is formatted and inserted)
+
+- index_footer.html
+
+- footer.html
+
+At all stages, the following variables are defined:
+
+- TITLE, the title of the article;
+
+- DATE_POSTED, the first publication date;
+
+- DATE_EDITED, the last edit (commit) date;
+
+- TAGS, the tags parsed from "tags:" comments.