]> git.plutz.net Git - serve0/blobdiff - list.sh
improved grouping, improved shell compatibility
[serve0] / list.sh
diff --git a/list.sh b/list.sh
index 2d9dff832cd480ab70f29cacc5e6dfa209ee36ba..8ba460e066388c267eb53ae16b2df95341ac04d0 100644 (file)
--- a/list.sh
+++ b/list.sh
@@ -29,7 +29,7 @@ list_item() {
     name="$(HTML "$ITEM/$name")"
     printf '[div .list .file
               [a href="%s" [img src="%s?a=thumbnail"]][label %s]
-              [span .time %i:%imin] [span .dim %ix%i] %s
+              [span .time %i:%02imin] [span .dim %ix%i] %s
               [checkbox "select" "%s" id="select_%s"][label for="select_%s" +]
             ]' \
       "$link" "$link" "${name##*/}" \
@@ -37,11 +37,11 @@ list_item() {
       "$width" "$height" \
       "$(printf '%s\n' "${tags#tags=}" \
          | sed -r "$UNSTRING"' s;^;,;; s;,+;,;g; s;,$;;;
-                   :X s;,([^,]+)(,|$); [span .tag \1]\2;; tX;'
+                   :X s;,-?([^,]+)(,|$); [span .tag\n \1]\2;; tX;'
       )" "$name" "$link" "$link"
   else
     printf 'Canning record for nonexist file: %s\n' "$name" >&2
-    meta_purge "$_DATA/$ITEM/$name"
+    meta_purge "$_DATA/$ITEM/$name"
   fi
 }
 
@@ -49,12 +49,12 @@ list_item() {
 [ "$FILTER" ] && list_fex="$(
   fex='p'
   STRING "$FILTER^" \
-  | sed -r 's;\^;\n;g; s;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\&;g' \
+  | sed -E 's;\^;\n;g; s;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\&;g' \
   | while read -r f; do
-    [ ! "${f#~}" ] && continue
-    [ "${f#~}" = "$f" ] \
+    [ "${f#\~}" ] || continue
+    [ "${f#\~}" = "$f" ] \
     && fex="/(\ttags=([^\t]*,)?)(${f})((,[^\t]*)?\t)/{${fex}}" \
-    || fex="/(\ttags=([^\t]*,)?)(${f#~})((,[^\t]*)?\t)/d; ${fex}"
+    || fex="/(\ttags=([^\t]*,)?)(${f#\~})((,[^\t]*)?\t)/d; ${fex}"
     printf '%s\n' "${fex}"
   done \
   | tail -n1
@@ -71,15 +71,16 @@ list_fullname(){
 
 list_filter(){
   if [ "$FILTER" ]; then
-    sed -nr "$list_fex"
+    printf "FEX: %s\n" "$list_fex" >&2
+    sed -nE "$list_fex"
   elif [ "${SEARCH#!}" != "${SEARCH}" ]; then
     grep -aviEe "$(STRING "${SEARCH}" \
-                 | sed -r ':x s;((^|[^\\])(\\\\)*)\+;\1 ;g; tx;
+                 | sed -E ':x s;((^|[^\\])(\\\\)*)\+;\1 ;g; tx;
                             s;((^|[^\\])(\\\\)*)\\\+;\1+;g;
                             s; ;\\+;g;')"
   elif [ "${SEARCH}" ]; then
     grep -aiEe "$(STRING "${SEARCH}" \
-                 | sed -r ':x s;((^|[^\\])(\\\\)*)\+;\1 ;g; tx;
+                 | sed -E ':x s;((^|[^\\])(\\\\)*)\+;\1 ;g; tx;
                             s;((^|[^\\])(\\\\)*)\\\+;\1+;g;
                             s; ;\\+;g;')"
   else
@@ -88,12 +89,35 @@ list_filter(){
 }
 
 list_order(){
-  local fm fn fn
+  local fm fn fn al length ln h w t c name buffer l
 
   if [ $ORDER = Name ]; then
     sort -k6 |sed 's;^;metashort\t;;'
+  elif [ $ORDER = Group ]; then
+    sed -E '
+      :X
+      s;^([^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^ 0-9]*)-([0-9a-zA-Z_-]{11}\r|ph[0-9a-f]{13}\r|[0-9]{8}\r)(.*)$;\1-\r\3 \2\n;;
+      t;
+      s;^([^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^ 0-9]*)([0-9]+)(.*)$;\1\r\3 \2;;
+      tX;' \
+    | { sort -n -k7 -k8 -k9 -k10 -k11 |sort -s -k6,6 ; echo '0 0 0 tags= comment= _'; } \
+    | while read -r length h w t c name; do
+      if [ "${ln%% *}" = "${name%% *}" ]; then
+        al=$((al + length))
+        buffer="${buffer}${BR}$length  $h      $w      $t      $c      $name"
+      else
+       printf '%s\n' "$buffer" |while read -r l; do
+          [ "$l" ] && printf '%s       %s\n' "$al" "$l"
+        done
+        al="$length"
+        buffer="$length        $h      $w      $t      $c      $name"
+      fi
+      ln="$name"
+    done \
+    | sort -s -n -k1,1 |sed -E 's;^[0-9]+\t;metashort\t;;' \
+    | sed -E ':X s;^([^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^\r]*)\r([^ ]*) ([^ ]+)( .*)?$;\1\3\2\4;; tX'
   elif [ $ORDER = Length ]; then
-    sort -n -k1 |sed 's;^;metashort\t;;'
+    sort -sn -k1 |sed 's;^;metashort\t;;'
   elif [ $ORDER = Date ]; then
     while read -r fm; do
       sn="${fm##*      }"
@@ -101,7 +125,7 @@ list_order(){
       printf '%i       %s      %s\n' \
              "$(stat -c %Y "$fn")" "${fm%      *}" "$fn"
     done \
-    | sort -n -k1 |cut -f2- |sed 's;^;metalong\t;;'
+    | sort -srn -k1 |sed -E 's;^[0-9]+\t;metalong\t;;'
   fi
 }
 
@@ -130,7 +154,7 @@ list_filemeta(){
 
 list_items() {
   local mode meta
-  mode="$(COOKIE mode |grep -m1 -axE 'index|browse' || printf browse )"
+  mode="$(COOKIE mode |grep -m1 -axE 'index|browse' || printf index )"
   
   if [ "$mode" = browse ]; then
     [ "$ITEM" ] && printf 'dir\t..\n'
@@ -160,10 +184,16 @@ list_paginate() {
   done
   printf ']'
 
+  [ $(( c % LISTSIZE )) -gt 0 ] \
+  && end=$((c / LISTSIZE + 1)) \
+  || end=$((c / LISTSIZE))
+
   printf '[div .pagination'
-  for n in $( seq 1 $((c / LISTSIZE + 1)) ); do
-    printf '[a .page href="%s" %s]' \
-      "?p=$(( (n - 1) * LISTSIZE + 1))&${qry}" "$n"
+  for n in $( seq 1 $end ); do
+    c=$(( (n - 1) * LISTSIZE + 1 ))
+    [ $c = $page ] \
+    && printf '[a .page .current href="%s" %s]' "?p=${c}&${qry}" "$n" \
+    || printf '[a .page href="%s" %s]' "?p=${c}&${qry}" "$n"
   done
   printf ']'
 }
@@ -172,7 +202,10 @@ printf 'Content-Type: text/html;charset=utf-8\r\n\r\n'
 
 { printf '
 [!DOCTYPE HTML]
-[html [head [title Listing]
+[html [head [title '
+  w_bmname
+  printf ' by %s]' "$ORDER"
+  printf '
   [meta name="viewport" content="width=device-width"]
   [link rel=stylesheet href="/style.css" ]
 ] [body
@@ -190,13 +223,18 @@ printf 'Content-Type: text/html;charset=utf-8\r\n\r\n'
   [form method=POST action="?a=multitag"'
     list_items \
     | list_paginate
-    printf '
-    [div #editing
-      [a href="#multitag" Add Tags]'
+    [ -d "$_DATA/$ITEM/.index" ] && { printf '
+    [div #editing'
       w_tagging
-      w_index
-      printf '
-    ]
-  ]
+    printf '
+    ]'; }
+  printf '
+  ]'
+  [ ! -d "$_DATA/$ITEM/.index" ] && { printf '
+  [div #editing'
+    w_index
+  printf '
+  ]'; }
+  printf '
 ] ]
 '; } | "$_EXEC/cgilite/html-sh.sed"