webnomad/render

231 lines
5.0 KiB
Bash
Executable File

#!/usr/bin/env zsh
#
# Jaro Web, your slick and static website publisher
#
# Copyleft (C) 2012 Denis Roio <jaromil@dyne.org>
#
# This source code is free software; you can redistribute it and/or
# modify it under the terms of the GNU Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This source code is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# Please refer to the GNU Public License for more details.
#
# You should have received a copy of the GNU Public License along with
# this source code; if not, write to:
# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
source jaroweb/utils
{ test -r config.zsh } || {
error "Directory not configured for Jaro Web. First use jaroweb init"
exit 1 }
####################################
source config.zsh
notice "Rendering $BRAND website"
act "Title: $TITLE"
mkdir -p pub
cat << EOF > pub/.htaccess
DirectoryIndex index index.html index.php
DefaultType text/html
EOF
render_html() {
src=`find views -type f -name "${1}.html"`
{ test -r "${src}" } || {
print "${1} html not found";
return 1 }
dst="pub/${1}"
print -n "rendering $dst... "
# TODO: check duplicates
# establish if we are rendering a section
if [[ ${sections[(i)$1]} -le ${#sections} ]]; then
sec=${1}
else
sec=`dirname $src`
sec=${sec[(ws:/:)2]}
fi
cat <<EOF > $dst
<!DOCTYPE html>
<html>
<head>
<title>$TITLE</title>
<meta name="description" content="$DESCRIPTION">
<meta name="keywords" content="$KEYWORDS">
EOF
cat tmpl/header.html >> $dst
echo "<nav>" >> $dst
render_navbar ${sec} >> $dst
echo "</nav>" >> $dst
echo "<article>" >> $dst
grep -v '^#' ${src} >> $dst
echo "</article>" >> $dst
cat tmpl/footer.html >> $dst
print "done."
}
read_meta() {
tmp=`awk '
!/^#/ { next }
/title/ { printf "title=\""; for(i=3;i<=NF;i++) printf "%s ", $i; printf "\";" }
/description/ { printf "description=\""; for(i=3;i<=NF;i++) printf "%s ", $i; printf "\";" }
/keywords/ { printf "keywords=\""; for(i=3;i<=NF;i++) printf "%s ", $i; printf "\";" }
/link/ { printf "link=\""; for(i=3;i<=NF;i++) printf "%s ", $i; printf "\";" }
/image/ { printf "image=\""; for(i=3;i<=NF;i++) printf "%s ", $i; printf "\";" }
' ${1}`
eval "$tmp"
}
render_section() {
sname=${1}
spath=views/${sname}
{ test -d ${spath} } && {
# the section is a directory containing files
# so we generate its html
pages=`find ${spath} -type f`
{ test ${#pages} = 0 } && {
print "${sname} section is an empty directory"
return 1 }
print "${sname} section"
print "<h1>${sname//_/ }</h1>" > ${spath}.html
for p in ${(f)pages}; do
pp=`basename $p`
case ${pp[(ws:.:)2]} in
html)
read_meta $p
# fill in entry into section page
cat <<EOF >> ${spath}.html
<h2>$title</h2>
<p>$description</p>
EOF
# print "Title: $title"
# print "Description: $description"
# print "Keywords: $keywords"
render_html ${pp[(ws:.:)1]}
;;
link)
print -n "rendering $pp... "
read_meta $p
cat <<EOF >> ${spath}.html
<h2><a href="$link" target="_blank">$title</a></h2>
<p>$description</p>
EOF
print "done."
;;
*)
print "${p}: page type unknown"
;;
esac
done # pages
}
{ test -r ${spath}.html } || {
print "${sname} section not found in views"
return 1 }
# render section's overview
render_html ${sname}
# at this point the section is an actual html file
}
render_navbar() {
active=${1}
cat <<EOF
<!-- BEGIN NAVIGATION BAR -->
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="brand">&nbsp;&nbsp;&nbsp;${BRAND}</div>
<ul class="nav">
<li class="divider-vertical"></li>
EOF
# first section: overview
if [ "$active" = "views" ]; then
cat <<EOF
<li class="active"><a href="index">intro</a></li>
EOF
else
cat <<EOF
<li><a href="index">intro</a></li>
EOF
fi
# other sections
for sec in ${sections}; do
ssec=`basename $sec`
if [ "$ssec" = "$active" ]; then
cat <<EOF
<li class="active"><a href="${ssec}">${ssec//_/ }</a></li>
EOF
else
cat <<EOF
<li><a href="${ssec}">${ssec//_/ }</a></li>
EOF
fi
done
# complete navbar with static entries if present
{ test -r tmpl/navbar.html } && { cat tmpl/navbar.html }
cat <<EOF
</ul>
</div>
</div>
<!-- END NAVIGATION BAR -->
EOF
}
# Main
render_html index
act "${#sections} sections configured"
if [ ${#sections} = 0 ]; then
act "No sections configured"
else
for s in ${sections}; do
render_section ${s}
done
fi
for m in `find views -mindepth 1 -type d `; do
rsync -r $m pub/
notice "$m published"
done
act "Website refreshed."