]> git.plutz.net Git - confetti/blobdiff - pages/courses.sh
hide menu configuration
[confetti] / pages / courses.sh
index ad92ae7b0a161a31f3b9b5c0a6b2db08b97f87b5..93e826179bdef819fbddbc1c1dc9c6f6f3fee22e 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/zsh
 
-# Copyright 2014 Paul Hänsch
+# Copyright 2014, 2016, 2017 Paul Hänsch
 #
 # This file is part of Confetti.
 # 
@@ -53,14 +53,25 @@ listcourses() {
 list_attendance() {
   id="$1"
   sed -rn 's:'$id'\t(.+)$:\1:p' "$_DATA/mappings/attendance" |while read each; do
-    n_last="$(  sed -rn 's:^N(;.+)*\:([^;]*;){0} *([^;]*).*$:\3:p' "$_DATA/vcard/$each")"
-    n_first="$( sed -rn 's:^N(;.+)*\:([^;]*;){1} *([^;]*).*$:\3:p' "$_DATA/vcard/$each")"
-    n_middle="$(sed -rn 's:^N(;.+)*\:([^;]*;){2} *([^;]*).*$:\3:p' "$_DATA/vcard/$each")"
-    n_pre="$(   sed -rn 's:^N(;.+)*\:([^;]*;){3} *([^;]*).*$:\3:p' "$_DATA/vcard/$each")"
-    n_post="$(  sed -rn 's:^N(;.+)*\:([^;]*;){4} *([^;]*).*$:\3:p' "$_DATA/vcard/$each")"
-    byear="$(  sed -rn 's:^BDAY(;.+)*\:([0-9]{4})(-[0-9][0-9]){2}.*$:\2:p' "$_DATA/vcard/$each")"
-    aname="${n_pre} ${n_first} ${n_middle} ${n_last} ${n_post} (*${byear})"
-    echo "$each $aname" |tr -d '\r'
+    card="$_DATA/vcard/$each"
+    if [ -r "$card" ]; then
+      aname="$(sed -rn '
+          /^N(;.+)*:/{
+          h;
+          s;^N(\;.+)*:([^\;]*\;){3} *([^\;]*).*$;\3;p; g;
+          s;^N(\;.+)*:([^\;]*\;){1} *([^\;]*).*$;\3;p; g;
+          s;^N(\;.+)*:([^\;]*\;){2} *([^\;]*).*$;\3;p; g;
+          s;^N(\;.+)*:([^\;]*\;){0} *([^\;]*).*$;\3;p; g;
+          s;^N(\;.+)*:([^\;]*\;){4} *([^\;]*).*$;\3;p; g;
+          }' "$card" \
+        | sed -r ':X;N;$!bX; s;([\;\n\r,]| )+; ;g;; s;^ +| +$;;g;'
+      )"
+      fname="$(sed -rn 's;^FN(\;.+)*:(.+)\r?$;\2;g; s;([\;\n,]| )+; ;g;; s;^ +| +$;;g;' "$card")"
+      nname="$(sed -rn 's;^NICKNAME(\;.+)*:(.+)\r?$;\2;g; s;([\;\n,]| )+; ;g;; s;^ +| +$;;g;' "$card")"
+      byear="$(sed -rn 's:^BDAY(\;.+)*\:([0-9]{4})(-[0-9][0-9]){2}.*$:\2:p' "$_DATA/vcard/$each")"
+
+      printf '%s %s (*%04i)\n' "$each" "${aname:-${fname:-${nname}}}" "$byear"
+    fi
   done
 }
 
@@ -74,27 +85,61 @@ course_mail() {
 }
 
 ics_parse() {
-  tr -d '\n' <"$1" |sed -r 's:\r ::g;s:\r:\n:g' |tr -d '\r' \
-  | sed -r 's:^([^;\:]+)(;[^"\:]+|;"[^"]+")*\:(.*)$:key="\1"\nvalue="\3"\ntag=\2:g' \
+  unset key
+  sed -r ':X;N;$!bX; s;\r\n[ \t];;g; s;\r\n;\n;g;' "$1" \
+  | sed -rn '
+    # === turn property names to upper case, strip group names ===
+    h; s;^([^;:]+);;;
+    x; s;^([^;:\.]+\.)?([^;:]+).*$;\2;;
+    y;abcdefghijklmnopqrstuvwxyz;ABCDEFGHIJKLMNOPQRSTUVWXYZ;
+    G; s;\n;;;
+
+    /^([A-Z0-9-]+)((\;[A-z0-9-]+=?|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):(.*)$/{
+      h;
+      s;^([A-Z0-9-]+)((\;[A-z0-9-]+=?|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):(.*)$;key='\''\1'\'';;
+      H; g;
+
+      s;^([A-Z0-9-]+)((\;[A-z0-9-]+=?|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):([^\n]*)\n.*$;\2;;
+      s;'\'';'\'\\\\\'\'';g
+      s;\;([A-Z0-9-]+)(=|=(([^\;,:"]+|"[^"]+")(,[^\;,:"]+|,"[^"]+")*))?;\ntag[\1]='\''\3'\'';g
+      s;^\n+;;; s;\n+$;;;
+      /^.+$/H; g;
+
+      s;^([A-Z0-9-]+)((\;[A-z0-9-]+=?|\;[A-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):([^\n]*)\n.*$;\6;;
+      # :X s;((^|[^\\])(\\\\)*)[;,];\1\n;g; s;((^|[^\\])(\\\\)*)\\([;,]);\4;g; tX;
+      s;'\'';'\'\\\\\'\'';g
+      s;^.*$;value='\''&'\'';
+      H; g;
+
+      s;^[^\n]*[\n ]+;;
+      s;\n+$;;;
+
+      p;
+    }
+    ' \
   | while read -r line; do
+    declare -A tag
     case "$line" in
-      key=*) echo -E "$line"
-       ;;
-      value=*) echo -E "$line"
-       ;;
-      tag=*) ot=''
-            echo -E "$line" \
-            | sed -r 's:^tag=::;s:\;([A-Z+_-]+="[^"]+"|[A-Z+_-]+=[^\;]+):\n\1:g;' \
-            | sed -r 's:([A-Z+_-]+)="?(.*)"?:tag\[\1\]="\2":g' \
-            | sed -r '/^ *$/d' \
-            | sort |while read -r tag; do
-              nt="$(echo -E "$tag" |sed -r 's:^tag\[([A-Z+_-]+)\]="(.*)"$:\1:')"
-              nv="$(echo -E "$tag" |sed -r 's:^tag\[([A-Z+_-]+)\]="(.*)"$:\2:')"
-              [ "$nt" = "$ot" ] && vl="$nv,$vl" || vl="$nv"
-              echo -E "tag[$nt]=\"$vl\""
-              ot="$nt"
-            done
-       ;;
+      value*) eval "$line";;
+      tag*)   eval "$line";;
+      key*)
+        if [ -z "$key" ]; then
+          eval "$line"
+        else
+          values[$key]="$value"
+          for t in ${(k)tag}; do
+            values[${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
 }
@@ -107,33 +152,8 @@ view_course() {  #Parameter: Calendarfile
   if [ "$cachefile" -nt "$calendarfile" ]; then
     cat "$cachefile"
   else
-    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
+    ics_parse "$calendarfile"
     . ${_EXEC}/templates/view_course.sh |tee "$cachefile"
   fi
 }
@@ -145,32 +165,7 @@ edit_course() {  #Parameter: Calendarfile
   [ -f "$tempfile" ] && calendarfile="$tempfile"
   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
-          [ -n "$value" ] && values[$key]="$value" || values[$key]='\r'
-          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
+  ics_parse "$calendarfile"
   . ${_EXEC}/templates/edit_course.sh
 }