initial repo - static-site-scripts - static site generator shellscripts | |
git clone git://git.codemadness.org/static-site-scripts | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit acdd7813ab6db1ee9b83e7f224966b37b968ccc1 | |
parent 9051ca6cbee74f640b22bebaeda165b043eee7e3 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Sun, 15 Dec 2013 16:41:42 +0100 | |
initial repo | |
Signed-off-by: Hiltjo Posthuma <[email protected]> | |
Diffstat: | |
A .gitignore | 1 + | |
M README.md | 20 ++++++++++++++++---- | |
A config.sh | 33 +++++++++++++++++++++++++++++… | |
A generate.sh | 115 +++++++++++++++++++++++++++++… | |
A layout/atom/atom.sh | 14 ++++++++++++++ | |
A layout/atom/atomitem.sh | 16 ++++++++++++++++ | |
A layout/index/index.sh | 51 +++++++++++++++++++++++++++++… | |
A layout/index/indexitem.sh | 3 +++ | |
A layout/page/page.sh | 49 +++++++++++++++++++++++++++++… | |
A layout/rss/rss.sh | 14 ++++++++++++++ | |
A layout/rss/rssitem.sh | 12 ++++++++++++ | |
A pages/example-page-template.html | 1 + | |
A pages/example-page-template.sh | 10 ++++++++++ | |
A print.css | 12 ++++++++++++ | |
A style.css | 72 +++++++++++++++++++++++++++++… | |
15 files changed, 419 insertions(+), 4 deletions(-) | |
--- | |
diff --git a/.gitignore b/.gitignore | |
@@ -0,0 +1 @@ | |
+output/ | |
diff --git a/README.md b/README.md | |
@@ -1,4 +1,16 @@ | |
-static-site-scripts | |
-=================== | |
- | |
-Generate a simple static site with an index page | |
+Usage | |
+===== | |
+ | |
+sh generate.sh [configfile] | |
+ | |
+the default config file is ./config.sh | |
+ | |
+ | |
+Pages | |
+===== | |
+ | |
+Pages are defined as shellscripts containing metadata (see pages/example-page-… | |
+ | |
+The page content is the basename of the shellscript + .html (see pages/example… | |
+ | |
+<insert you favorite template language> can easily be added to generate.sh. | |
diff --git a/config.sh b/config.sh | |
@@ -0,0 +1,33 @@ | |
+# Fix for running on Cygwin =/ | |
+export PATH="/bin:/usr/bin" | |
+ | |
+# Site title (part of $pagetitle probably). | |
+sitetitle="Codemadness" | |
+# Main site domain. | |
+sitedomain="http://www.codemadness.nl" | |
+# Short site domain. | |
+sitedomainshort="codemadness.nl" | |
+# Relative site url. | |
+siterelurl="" | |
+# Full site url. | |
+sitefullurl="${sitedomain}${siterelurl}" | |
+# Site keywords (default). | |
+sitekeywords="blog, suckless, dwm-hiltjo" | |
+# Site description (default). | |
+sitedescription="blog with various projects and articles about computer-relate… | |
+# Admin mail, handy to use on site. | |
+# TODO: remove adminmail? | |
+adminmail="hiltjo@[email protected]" | |
+# used for "mail link" | |
+sitemail="hiltjo@[email protected]" | |
+ | |
+# Directories containing content and metadata. | |
+pagesdir="pages" | |
+# Output dir. | |
+outputdir="output" | |
+ | |
+# Layout file. | |
+layoutdir="layout" | |
+ | |
+# TODO: markdown program: http://freecode.com/projects/smu | |
+markdown="smu" | |
diff --git a/generate.sh b/generate.sh | |
@@ -0,0 +1,115 @@ | |
+#!/bin/sh | |
+# Generate a simple static site with an index page. | |
+# Author: Hiltjo Posthuma <[email protected]> | |
+# License: WTFPL | |
+ | |
+# Syntax highlight code. | |
+code_highlight() { | |
+ echo '<pre>' | |
+ # escape some HTML entities, prefix code with linenumbers. | |
+ sed -e 's@&@\&@g' -e 's@>@\>@g' -e 's@<@\<@g' | nl -w 4 -s '… | |
+ echo '</pre>' | |
+} | |
+ | |
+# page_metadata(filename) | |
+page_metadata() { | |
+ id="" | |
+ tags="" | |
+ title="" | |
+ url="" | |
+ pagetitle="" | |
+ description="${sitedescription}" | |
+ keywords="${sitekeywords}" | |
+ filename="" | |
+ content="" | |
+ categories="" | |
+ timestamp="" | |
+ [ -f "$1" ] && . "$1" # load page metadata. | |
+} | |
+ | |
+# Read config file. | |
+configfile="$1" | |
+if [ "$configfile" = "" ]; then | |
+ configfile="./config.sh" | |
+fi | |
+if [ -f "$configfile" ]; then | |
+ . "$configfile" | |
+else | |
+ echo "$configfile not found or not a file." >&2 | |
+ exit 1 | |
+fi | |
+ | |
+# Remember current dir. | |
+pwddir="$(pwd)" | |
+ | |
+# Make output dir. | |
+mkdir -p "$outputdir" | |
+ | |
+# process pages. | |
+# truncate pages where content is appended. | |
+for name in "rss.xml" "atom.xml" "index.html"; do | |
+ echo > "$outputdir/$name" | |
+done | |
+find "$pagesdir" -name "*.sh" | while read page; do | |
+ page_metadata "$page" # load page metadata. | |
+ printf "%s\t%s\n" "$timestamp" "$page" | |
+done | sort -rn | while read ts meta; do # process in order of time descending. | |
+ pagename=$(basename "$meta" ".sh") | |
+ page_metadata "$meta" | |
+ urlfull="${sitefullurl}/${url}" | |
+ #url="${siterelurl}/${url}" | |
+ if [ -f "$pagesdir/$pagename.html" ]; then | |
+ filename="$pagesdir/$pagename.html" | |
+ content=$(cat "$filename") | |
+ elif [ -f "$pagesdir/$pagename.md" ]; then | |
+ # TODO: test markdown | |
+ filename="$pagesdir/$pagename.md" | |
+ content=$("$markdown" "$filename") | |
+ fi | |
+ . "$layoutdir/page/page.sh" > "$outputdir/$pagename.html" | |
+ . "$layoutdir/rss/rssitem.sh" >> "$outputdir/rss.xml" | |
+ . "$layoutdir/atom/atomitem.sh" >> "$outputdir/atom.xml" | |
+ . "$layoutdir/index/indexitem.sh" >> "$outputdir/index.html" | |
+done | |
+ | |
+# Index page. | |
+page_metadata "" | |
+title="Posts" | |
+content=$(cat "$outputdir/index.html") | |
+. "$layoutdir/index/index.sh" > "$outputdir/index.html" | |
+ | |
+# RSS | |
+page_metadata "" | |
+content=$(cat "$outputdir/rss.xml") | |
+. "$layoutdir/rss/rss.sh" > "$outputdir/rss.xml" | |
+ | |
+# Atom | |
+page_metadata "" | |
+content=$(cat "$outputdir/atom.xml") | |
+. "$layoutdir/atom/atom.sh" > "$outputdir/atom.xml" | |
+ | |
+# Goto output dir to make relative urls. | |
+cd "$outputdir" | |
+ | |
+# Sitemap: urllist.txt | |
+find ./ -type f -name "*.html" | sort | sed 's@^./\(.*\)$@'$sitefullurl'/\1@' … | |
+ | |
+# Sitemap: sitemap.xml | |
+(cat <<! | |
+<?xml version="1.0" encoding="UTF-8"?> | |
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> | |
+! | |
+ | |
+find ./ -type f -name "*.html" | sort | sed 's@^./\(.*\)$@<url><loc>'$sitefull… | |
+ | |
+cat <<! | |
+</urlset> | |
+! | |
+) > "sitemap.xml" | |
+ | |
+# Restore current dir. | |
+cd "$pwddir" | |
+ | |
+# Copy stylesheets. | |
+cp "style.css" "$outputdir" | |
+cp "print.css" "$outputdir" | |
diff --git a/layout/atom/atom.sh b/layout/atom/atom.sh | |
@@ -0,0 +1,14 @@ | |
+#!/bin/sh | |
+ | |
+cat <<!__EOF__ | |
+<?xml version="1.0" encoding="UTF-8"?> | |
+<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> | |
+ <title type="text">${sitetitle}</title> | |
+ <subtitle type="text">${sitedescription}</subtitle> | |
+ <updated>$(date "+%Y-%m-%dT%H:%M:%SZ" -d "$builddate")</updated> | |
+ <link rel="alternate" type="text/html" href="${sitefullurl}" /> | |
+ <id>${sitefullurl}/atom.xml</id> | |
+ <link rel="self" type="application/atom+xml" href="${sitefullurl}/atom… | |
+ ${content} | |
+</feed> | |
+!__EOF__ | |
diff --git a/layout/atom/atomitem.sh b/layout/atom/atomitem.sh | |
@@ -0,0 +1,16 @@ | |
+#!/bin/sh | |
+ | |
+cat <<!__EOF__ | |
+<entry> | |
+ <author> | |
+ <name>${author}</name> | |
+ <uri>${sitefullurl}</uri> | |
+ </author> | |
+ <title type="html"><![CDATA[$title]]></title> | |
+ <link rel="alternate" type="text/html" href="${urlfull}" /> | |
+ <id>${urlfull}</id> | |
+ <updated>$(date "+%Y-%m-%dT%H:%M:%SZ" -d "$timestamp")</updated> | |
+ <published>$(date "+%Y-%m-%dT%H:%M:%SZ" -d "$timestamp")</published> | |
+ <summary type="html"><![CDATA[$description]]></summary> | |
+</entry> | |
+!__EOF__ | |
diff --git a/layout/index/index.sh b/layout/index/index.sh | |
@@ -0,0 +1,51 @@ | |
+#!/bin/sh | |
+ | |
+# prefix page title with site title, make sure its neatly formatted. | |
+if [ "$title" = "" ]; then | |
+ pagetitle="$sitetitle" | |
+else | |
+ pagetitle="$title - $sitetitle" | |
+fi | |
+ | |
+cat <<!__EOF__ | |
+<!DOCTYPE HTML> | |
+<html dir="ltr" lang="en"> | |
+ <head> | |
+ <title>${pagetitle}</title> | |
+ <link rel="stylesheet" href="style.css" type="text/css" media=… | |
+ <link rel="stylesheet" href="print.css" type="text/css" media=… | |
+ <link rel="alternate" type="application/rss+xml" title="Codema… | |
+ <link rel="alternate" type="application/atom+xml" title="Codem… | |
+ <link rel="icon" type="image/png" href="/favicon.png" /> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=UT… | |
+ <meta http-equiv="Content-Language" content="en" /> | |
+ <meta content="${keywords}" name="keywords" /> | |
+ <meta content="${description}" name="description" /> | |
+ </head> | |
+ <body> | |
+ <div id="menuwrap"> | |
+ <div id="menu"> | |
+ <span id="links"> | |
+ <a href="${siterelurl}/" title="Blog">… | |
+ <a href="/downloads/projects/" title="… | |
+ </span> | |
+ <span id="links-contact"> | |
+ <span class="hidden"> | </span> | |
+ <a href="rss.xml" title="Syndicate thi… | |
+ <a href="atom.xml" title="Atom feed" c… | |
+ <a href="mailto:${sitemail}" title="Ma… | |
+ </span> | |
+ </div> | |
+ </div> | |
+ <hr class="hidden" /> | |
+ <div id="mainwrap"> | |
+ <div id="main"> | |
+<h1>Posts</h1> | |
+<table> | |
+ ${content} | |
+</table> | |
+ </div> | |
+ </div> | |
+ </body> | |
+</html> | |
+!__EOF__ | |
diff --git a/layout/index/indexitem.sh b/layout/index/indexitem.sh | |
@@ -0,0 +1,3 @@ | |
+#!/bin/sh | |
+# row for index page. | |
+printf '<tr><td class="lm">%s</td><td><a href="%s" title="%s">%s</a></td></tr>… | |
diff --git a/layout/page/page.sh b/layout/page/page.sh | |
@@ -0,0 +1,49 @@ | |
+#!/bin/sh | |
+ | |
+# prefix page title with site title, make sure its neatly formatted. | |
+if [ "$title" = "" ]; then | |
+ pagetitle="$sitetitle" | |
+else | |
+ pagetitle="$title - $sitetitle" | |
+fi | |
+ | |
+cat <<!__EOF__ | |
+<!DOCTYPE HTML> | |
+<html dir="ltr" lang="en"> | |
+ <head> | |
+ <title>${pagetitle}</title> | |
+ <link rel="stylesheet" href="style.css" type="text/css" media=… | |
+ <link rel="stylesheet" href="print.css" type="text/css" media=… | |
+ <link rel="alternate" type="application/rss+xml" title="Codema… | |
+ <link rel="alternate" type="application/atom+xml" title="Codem… | |
+ <link rel="icon" type="image/png" href="/favicon.png" /> | |
+ <meta http-equiv="Content-Type" content="text/html; charset=UT… | |
+ <meta http-equiv="Content-Language" content="en" /> | |
+ <meta content="${keywords}" name="keywords" /> | |
+ <meta content="${description}" name="description" /> | |
+ </head> | |
+ <body> | |
+ <div id="menuwrap"> | |
+ <div id="menu"> | |
+ <span id="links"> | |
+ <a href="${siterelurl}/" title="Blog">… | |
+ <a href="/downloads/projects/" title="… | |
+ </span> | |
+ <span id="links-contact"> | |
+ <span class="hidden"> | </span> | |
+ <a href="rss.xml" title="Syndicate thi… | |
+ <a href="atom.xml" title="Atom feed" c… | |
+ <a href="mailto:${sitemail}" title="Ma… | |
+ </span> | |
+ </div> | |
+ </div> | |
+ <hr class="hidden" /> | |
+ <div id="mainwrap"> | |
+ <div id="main"> | |
+ <h1><a href="${urlrel}" title="${title}">${tit… | |
+ ${content} | |
+ </div> | |
+ </div> | |
+ </body> | |
+</html> | |
+!__EOF__ | |
diff --git a/layout/rss/rss.sh b/layout/rss/rss.sh | |
@@ -0,0 +1,14 @@ | |
+#!/bin/sh | |
+ | |
+cat <<!__EOF__ | |
+<?xml version="1.0" encoding="UTF-8"?> | |
+<rss version="2.0"> | |
+ <channel> | |
+ <title>${sitetitle}</title> | |
+ <link>${sitefullurl}</link> | |
+ <description></description> | |
+ <language>en</language> | |
+ ${content} | |
+ </channel> | |
+</rss> | |
+!__EOF__ | |
diff --git a/layout/rss/rssitem.sh b/layout/rss/rssitem.sh | |
@@ -0,0 +1,12 @@ | |
+#!/bin/sh | |
+ | |
+cat <<!__EOF__ | |
+<item> | |
+ <title>${title}</title> | |
+ <link>${urlfull}</link> | |
+ <pubDate>$(date -R -d "$timestamp")</pubDate> | |
+ <author>${author}</author> | |
+ <guid isPermaLink="false">${urlfull}</guid> | |
+ <description><![CDATA[${description}]]></description> | |
+</item> | |
+!__EOF__ | |
diff --git a/pages/example-page-template.html b/pages/example-page-template.html | |
@@ -0,0 +1 @@ | |
+Hai there | |
diff --git a/pages/example-page-template.sh b/pages/example-page-template.sh | |
@@ -0,0 +1,10 @@ | |
+#!/bin/sh | |
+title="title" | |
+description="description" | |
+id="example-page-template" | |
+url="${id}.html" | |
+tags="tags, comma, separated" | |
+keywords="keywords, comma, separated" | |
+categories="Category name" | |
+timestamp="now" | |
+author="author" | |
diff --git a/print.css b/print.css | |
@@ -0,0 +1,12 @@ | |
+body { | |
+ text-align: left; | |
+} | |
+#menuwrap { | |
+ display: none; | |
+} | |
+#menu, #main { | |
+ margin: 0; | |
+} | |
+pre, code { | |
+ white-space: pre-wrap; | |
+} | |
diff --git a/style.css b/style.css | |
@@ -0,0 +1,72 @@ | |
+body { | |
+ font-family: sans-serif, monospace; | |
+ text-align: center; | |
+ overflow-y: scroll; | |
+ color: #333; | |
+ background-color: #fff; | |
+ margin: 0; | |
+ padding: 0; | |
+} | |
+table { | |
+ border: 0; | |
+} | |
+hr { | |
+ height: 1px; | |
+ color: #ccc; | |
+ background-color: #ccc; | |
+ border: 0; | |
+} | |
+h1 { | |
+ font-size: 140%; | |
+} | |
+h2 { | |
+ font-size: 120%; | |
+} | |
+h3 { | |
+ font-size: 100%; | |
+} | |
+h1, h1 a, h1 a:visited, | |
+h2, h2 a, h2 a:visited, | |
+h3, h3 a, h3 a:visited, | |
+h1 a:hover, h2 a:hover, h3 a:hover { | |
+ color: inherit; | |
+ text-decoration: none; | |
+} | |
+table tr td { | |
+ padding: 2px 10px 2px 0px; | |
+} | |
+pre, code { | |
+ border: 1px dashed #777; | |
+ background-color: #eee; | |
+ padding: 5px; | |
+ display: block; | |
+ overflow-x: auto; | |
+} | |
+code { | |
+ white-space: nowrap; | |
+ word-wrap: normal; | |
+} | |
+#menuwrap { | |
+ background-color: #eee; | |
+ padding: 1ex; | |
+ border-bottom: 1px solid #ccc; | |
+} | |
+#main { | |
+ padding: 1ex; | |
+} | |
+#menu, | |
+#main { | |
+ margin: 0px auto; | |
+ text-align: left; | |
+ max-width: 80ex; | |
+} | |
+#menu a { | |
+ font-weight: bold; | |
+ vertical-align: middle; | |
+} | |
+#links-contact { | |
+ float: right; | |
+} | |
+.hidden { | |
+ display: none; | |
+} |