]> git.plutz.net Git - serve0/blobdiff - actions/filter.sh
speed up in filtering
[serve0] / actions / filter.sh
diff --git a/actions/filter.sh b/actions/filter.sh
new file mode 100755 (executable)
index 0000000..84bd841
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/zsh
+
+if [ -n "${CONTENT_LENGTH}" -a "${CONTENT_LENGTH}" -gt 0 ]; then
+(head -c "${CONTENT_LENGTH}"; echo)|sed 's:&:\n:g;s:\r::g' |while read line; do
+  case "$line" in
+    type[0-9]=neg)
+      [ -z "$filters" ] && filters="!"
+      [ -n "$filters" ] && egrep -q '(^|\^|\||!)$' <<<"$filters" || filters="${filters}^!"
+      ;;
+    type[0-9]=pos)
+      egrep -q '(^|\^|\||!)$' <<<"$filters" || filters="${filters}^"
+      ;;
+    category=*)
+      category="$(sed 's/^category=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
+      category="$(echo -e "${category}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
+      ;;
+    filter=*)
+      filter="$(sed 's/^filter=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
+      filter="$(echo -e "${filter}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
+      egrep -q '(^|\^|\||!)$' <<<"${filters}" || filters="${filters}|"
+      filters="${filters}${filter}"
+      ;;
+    cfilter=*)
+      cfilter="$(sed 's/^cfilter=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
+      cfilter="$(echo -e "${cfilter}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
+      egrep -q '(^|\^|\||!)$' <<<"${filters}" || filters="${filters}|"
+      [ -n "$cfilter" ] && filters="${filters}${category}:${cfilter}"
+      ;;
+    o=Name) order=Name;;
+    o=Date) order=Date;;
+    o=Length) order=Length;;
+  esac
+done
+fi
+
+echo "?o=${order}&f=${filters}" >>${DATA}/meta/recent
+echo -n "Location: ?o=${order}&f=${filters}\n\n"