pdflatex based generator for course lists
authorpaul <paul@plutz.net>
Tue, 8 Apr 2014 03:02:44 +0000 (03:02 +0000)
committerpaul <paul@plutz.net>
Tue, 8 Apr 2014 03:02:44 +0000 (03:02 +0000)
svn path=/trunk/; revision=45

actions/generate_courselist.sh [new file with mode: 0755]
templates/course_print.sh [new file with mode: 0644]

diff --git a/actions/generate_courselist.sh b/actions/generate_courselist.sh
new file mode 100755 (executable)
index 0000000..640e3f1
--- /dev/null
@@ -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 (file)
index 0000000..78d214d
--- /dev/null
@@ -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}
+'