]> git.plutz.net Git - vhs_kurs/blobdiff - clickslide/clickslide.sh
Merge commit 'eb98affc5b5916de814d4fc666df87963bdde1e2' as 'clickslide'
[vhs_kurs] / clickslide / clickslide.sh
diff --git a/clickslide/clickslide.sh b/clickslide/clickslide.sh
new file mode 100755 (executable)
index 0000000..980365f
--- /dev/null
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+prev='' next='' idoff=0
+depth=0 ucdepth=-1
+
+base64() {
+  uuencode -m - <"$1" \
+  | sed '1d; :X;$!{N;bX;}; s;\n;;g; s;=\+;;g;'
+}
+
+{ "${0%/*}"/cgilite/html-sh.sed || cat; } \
+| {
+  line="$(line)"
+  while :; do 
+    tag="${tag}${line%%>*}"
+  
+    if [ "$line" = "${line%%>*}" ]; then
+      # $line did not contain ">" and thus was added to $tag entirely
+      if ! line="$(line)"; then
+        printf %s\\n "$tag"
+        break
+      fi
+      tag="${tag}
+  "
+    else
+      # $line is shortened by segment added to $tag
+      line="${line#*>}"
+      tag="${tag}>"
+    fi
+
+    ### Image embedding for Inline styles
+    while expr "$tag" : '.*<[^>]*style="[^"]*url("\?[^)]\+\.\(png\|jpg\|jpeg\|gif\|svg\)"\?)'; do
+      pre="${tag%%url(*)*}"
+      post="${tag#*url(*)}"
+      file="${tag#${pre}url(}" file="${file%)$post}"
+      file="${file#"}" file="${file%"}"
+      echo Inlining Background Image "$file" >&2
+      if [ -r "$file" ]; then
+        tag="${pre}url('data:image/${file##*.};base64,$(base64 "$file")')${post}"
+      fi
+    done >/dev/null
+
+    ### Image embedding for Image tags
+    while expr "$tag" : '.*<img [^>]*src="[^"]\+\.\(png\|jpg\|jpeg\|gif\|svg\)"'; do
+      pre="${tag%%src=\"*\"*}"
+      post="${tag#*src=\"*\"}"
+      file="${tag#${pre}src=\"}" file="${file%\"$post}"
+      echo Inlining Image "$file" >&2
+      if [ -r "$file" ]; then
+        tag="${pre}src=\"data:image/${file##*.};base64,$(base64 "${file}")\"${post}"
+      fi
+    done >/dev/null
+
+    ### Tag Processing
+    case $tag in
+      *\<head\>*|\*\<head\ *\>)  # Inline styles into head
+        printf '%s<meta name="viewport" content="width=device-width">
+                <meta charset="UTF-8">
+                <style type="text/css"><!--\n' "${tag%${tag#*<head*>}}"
+        cat "${0%/*}/clickslide.css"
+        printf '\n--></style>%s' "${tag#*<head*>}"
+        tag='' depth=$((depth + 1))
+        ;;
+      *\<slide\ *id=\"?*\"*\>*)  # Count slide id, insert "next" button
+        prev="$next"
+        next="${tag#*<slide }" next="${next#*id=\"}" next="${next%\"*}"
+        next="autoslide${idoff}"
+        idoff="$((idoff + 1))"
+        printf '%s<a class="nextslide" href="#%s">next</a><div class="slide" count="%i" id="%s" %s' \
+          "${tag%<slide *}" "$next" "$idoff" "$next" "${tag#*<slide }"
+        tag='' depth=$((depth + 1))
+        ;;
+      *\<slide\ *\>*|*\<slide\>*)
+        prev="$next"
+        next="autoslide${idoff}"
+        idoff="$((idoff + 1))"
+        printf '%s<a class="nextslide" href="#%s">next</a><div class="slide" count="%i" id="%s" %s' \
+          "${tag%<slide*}" "$next" "$idoff" "$next" "${tag#*<slide}"
+        tag='' depth=$((depth + 1))
+        ;;
+      *\</slide\>*)  # Insert "previous" button
+        printf '%s</div><a class="prevslide" href="#%s">previous</a>%s' \
+          "${tag%</slide>*}" "$prev" "${tag#*</slide>}"
+        tag='' depth=$((depth - 1))
+        ;;
+      *\<body*\>*)  # Insert toplevel link
+        printf '%s<a href="#" class="toplevel">overview</a>' "$tag"
+        tag='' depth=$((depth + 1))
+        ;;
+      *\</body*\>*)  # Insert total slide count
+        printf '<span class="count">%i</span>%s' "$idoff" "$tag"
+        tag='' depth=$((depth - 1))
+        ;;
+      *\<*class=\"uncover\"*\>*)  # Insert checkboxes in "uncover" lists
+        #printf '%s<li></li>' "$tag"
+        printf '%s' "$tag"
+        tag='' depth=$((depth + 1))
+        ucdepth=$depth
+        ;;
+      *\</*\>*)
+        printf %s "$tag"
+        tag='' depth=$((depth - 1))
+        [ $depth -lt $ucdepth ] && ucdepth=-1
+        ;;
+      *\<*\>*)
+        if [ $ucdepth = $depth ]; then
+          printf '%s<input type="checkbox" class="uncover"/><%s' "${tag%<*}" "${tag#*<}"
+        else
+          printf %s "$tag"
+        fi
+        [ "${tag}" = "${tag%/>}" ] && depth=$((depth + 1))
+        tag=''
+        ;;
+      *) :
+        ;;
+    esac
+  done
+}