From 804ecf70ec21f803334b09cc223aedb41d51c610 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 8 Apr 2014 03:02:44 +0000 Subject: [PATCH] pdflatex based generator for course lists svn path=/trunk/; revision=45 --- actions/generate_courselist.sh | 126 +++++++++++++++++++++++++++++++++ templates/course_print.sh | 40 +++++++++++ 2 files changed, 166 insertions(+) create mode 100755 actions/generate_courselist.sh create mode 100644 templates/course_print.sh diff --git a/actions/generate_courselist.sh b/actions/generate_courselist.sh new file mode 100755 index 0000000..640e3f1 --- /dev/null +++ b/actions/generate_courselist.sh @@ -0,0 +1,126 @@ +#!/bin/zsh + +pdflatex="$(where pdflatex |head -n1 || echo false)" +course="$_GET[\"course\"]" +fromdate=$_GET['fromdate'] +fromdate=$(date -d "$fromdate" +%s) +[ -z "$fromdate" ] && fromdate=$(date +%s) + +. ${_EXEC}/pages/courses.sh loadfunctions +. ${_EXEC}/pages/attendees.sh loadfunctions + +list_attendee() { #Parameter: Cardfile + id="$1" + cardfile="$_DATA/vcard/${id}" + unset key + + declare -A tags + declare -A values + vcf_parse "$cardfile" |while read -r line; do + declare -A tag + case "$line" in + value*) eval "$line";; + tag*) eval "$line";; + key*) + if [ -z "$key" ]; then + eval "$line" + else + values[$key]="$value" + for t in ${(k)tag}; do + tags[${key}_$t]="$tag[$t]" + done + eval "$line" + if [ -n "$values[$key]" ]; then + n=0 + while [ -n "$values[$key$n]" ]; do n=$(($n + 1)); done + key=$key$n + fi + unset value + unset tag + fi + ;; + esac + done + + tel='' + for n in TEL TEL{0..10}; do if (echo "$values[$n]" |grep -Eq '[0-9]'); then + [ -n "$tel" ] && tel="$tel\\newline $values[$n]" || tel="$values[$n]" + fi; done + note='' + for n in NOTE NOTE{0..10}; do if [ -n "$values[$n]" ]; then + [ -n "$note" ] && note="$note\\newline $values[$n]" || note="$values[$n]" + fi; done + echo -E "$values[FN] & $values[BDAY] & $tel & $note" +} + +get_dates() { #Parameter: Calendarfile + calendarfile="$_DATA/ical/$course" + unset key + + declare -A tags + declare -A values + ics_parse "$calendarfile" |while read -r line; do + declare -A tag + case "$line" in + value*) eval "$line";; + tag*) eval "$line";; + key*) + if [ -z "$key" ]; then + eval "$line" + else + values[$key]="$value" + for t in ${(k)tag}; do + tags[${key}_$t]="$tag[$t]" + done + eval "$line" + if [ -n "$values[$key]" ]; then + n=0 + while [ -n "$values[$key$n]" ]; do n=$(($n + 1)); done + key=$key$n + fi + unset value + unset tag + fi + ;; + esac + done + + dtstart="$values[DTSTART]" + [ -z "$dtstart" ] && dtstart=$(date +%Y%m%dT%H%M%S) + echo "$dtstart" |case "$dtstart" in + *Z) sed -rn 's:^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})Z$:\1-\2-\3 \4\:\5\:\6 UTC:p';; + TZID*) sed -rn 's:^TZID=(.+)\:([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})$:TZ="\1" \2-\3-\4 \5\:\6\:\7:p';; + *) sed -rn 's:^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})$:\1-\2-\3 \4\:\5\:\6:p';; + esac |read dts_date + rrule="$values[RRULE]" + rr_int="$(echo $rrule |sed -rn 's:^.*INTERVAL=([0-9]+)(;.*)?$:\1:p')" + rr_freq="$(echo $rrule |sed -rn 's:^.*FREQ=(YEARLY|MONTHLY|WEEKLY|DAILY)(;.*)?$:\1:p')" + case "$rr_freq" in; + YEARLY) rec="$rr_int year";; + MONTHLY) rec="$rr_int month";; + DAILY) rec="$rr_int day";; + *) rec="$rr_int week";; + esac + + next_date="$dts_date" + n=10 + while [ $n -gt 0 ]; do + if [ "$(date -d "$next_date" +%s)" -gt "$(date +%s)" ]; then + dtlist="$dtlist & $(date -d "$next_date" +"%d. %b.")" + n=$(($n - 1)) + fi + next_date="$(date -d "$next_date + $rec" +%Y-%m-%d)" + done + + echo "$dtlist" +} + +if [ -r "${_DATA}/ical/${course}" ]; then + . ${_EXEC}/templates/course_print.sh >"${_DATA}/temp/courselist_${course}.tex" + [ -e "${_DATA}/temp/courselist_${course}.pdf" ] && rm "${_DATA}/temp/courselist_${course}.pdf" + "$pdflatex" -halt-on-error -output-directory "${_DATA}/temp/" "${_DATA}/temp/courselist_${course}.tex" |debug >/dev/null +fi +if [ -r "${_DATA}/temp/courselist_${course}.pdf" ]; then + echo 'Content-Type: application/x-pdf\n' + cat "${_DATA}/temp/courselist_${course}.pdf" +fi diff --git a/templates/course_print.sh b/templates/course_print.sh new file mode 100644 index 0000000..78d214d --- /dev/null +++ b/templates/course_print.sh @@ -0,0 +1,40 @@ +echo -E ' +\documentclass[landscape,10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage{ngerman} +\usepackage[landscape]{geometry} + +\begin{document} + +\section*{Teilnehmende} +\begin{tabular}{|l|l|p{50mm}|p{80mm}|} +\hline + \textbf{Name} & + \textbf{Geburtstag} & + \textbf{Telefon} & + \textbf{Notiz} \\ +\hline +\hline +'"$( +list_attendance "$course" |sort -k 2 |while read line; do + cardfile="$(echo "$line" |cut -d\ -f1)" + list_attendee "$cardfile" |sed -r 's:$:\\\\[3ex] \\hline:' +done +)"' +\end{tabular} + +\newpage + +\section*{Termine} +\begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|} +\hline + '"$(get_dates)"' \\ +\hline +\hline +'"$( +list_attendance "$course" |sort -k 2 | debug |sed -r 's:^[0-9a-z\.]+ (.+) \(\*[0-9]{4}\)$:\1:;s:$: \& \& \& \& \& \& \& \& \& \& \\\\[3ex] \\hline:' +)"' +\end{tabular} + +\end{document} +' -- 2.39.2