]> git.plutz.net Git - serve0/blobdiff - list.sh
stable sort (keep name order when sorting by lenght)
[serve0] / list.sh
diff --git a/list.sh b/list.sh
index 1a5a6cf05fce903418d04d1e956da3fce4609031..08cef51f1cf36ff9365347774d03ab378c6050eb 100644 (file)
--- a/list.sh
+++ b/list.sh
@@ -25,21 +25,23 @@ list_item() {
     name="$(list_fullname "$(UNSTRING "${name%${CR}}")")"
   fi
   if [ -f "$_DATA/$ITEM/$name" ]; then
-    display="$(HTML "$name")"
     link="$(URL "$ITEM/$name")"
+    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" \
+      "$link" "$link" "${name##*/}" \
       "$((length / 60))" "$((length % 60))" \
       "$width" "$height" \
-      "$(UNSTRING "${tags#tags=}" |tr , '\0' |xargs -r0 printf ' [span .tag %s]')" \
-      "$link" "$link" "$link"
+      "$(printf '%s\n' "${tags#tags=}" \
+         | sed -r "$UNSTRING"' s;^;,;; s;,+;,;g; s;,$;;;
+                   :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
 }
 
@@ -85,13 +87,44 @@ list_filter(){
   fi
 }
 
+groupmatch(){
+  if [ ${#1} -gt ${#2} ]; then
+    long="$1" short="$2"
+  else
+    long="$2" short="$1"
+  fi
+  com="$(expr substr "$long" 1 $((${#long} * 3 / 4)))"
+  cut="${short#$com}"
+  if [ ${#cut} -lt ${#short} ]; then
+    return 0
+  else
+    return 1
+  fi
+}
+
 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
+    { sort -k6; echo '0 0 0 tags= comment= _'; } \
+    | while read -r length h w t c name; do
+      if groupmatch "$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 -sn -k1 |sed -r 's;^[0-9]+\t;metashort\t;;'
   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##*      }"
@@ -99,7 +132,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 -r 's;^[0-9]+\t;metalong\t;;'
   fi
 }
 
@@ -158,10 +191,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 ']'
 }
@@ -188,13 +227,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"