#!/usr/bin/env zsh # # Jaro Web, your slick and static website publisher # # Copyleft (C) 2012 Denis Roio # # 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_header() { cat < $TITLE EOF cat tmpl/header.html echo "" } render_html() { src=`find views -type f -name "${1}.html"` { test -r "${src}" } || { print "${1} section 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 render_header > $dst echo "
" >> $dst grep -v '^#' ${src} >> $dst echo "
" >> $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 "\";" } /icon/ { printf "icon=\""; 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 "

${sname//_/ }

" > ${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 <> ${spath}.html

$title

$description

EOF # print "Title: $title" # print "Description: $description" # print "Keywords: $keywords" render_html ${pp[(ws:.:)1]} ;; link) print -n "rendering $pp... " read_meta $p cat <> ${spath}.html

$title

$description

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 } # 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."