diff options
-rwxr-xr-x | blog | 94 | ||||
-rw-r--r-- | blog.1 | 124 |
2 files changed, 218 insertions, 0 deletions
@@ -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/</\</g' \ + -e 's/>/\>/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 >> $@; \ @@ -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: "". +.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. |