]> git.plutz.net Git - serve0/blobdiff - list.sh
further increase thumbnail quality (though still using jpeg ;-)
[serve0] / list.sh
diff --git a/list.sh b/list.sh
index 248027fb71a10b0134508d55b301d6d0ae8c4a0c..18799f3ec3af2f77442224ca7191d62aeca1d88f 100644 (file)
--- a/list.sh
+++ b/list.sh
@@ -4,27 +4,31 @@
 . "$_EXEC/widgets.sh"
 
 list_item() {
-  local name path length width height tags comment n
+  local name link path length width height tags comment n
   name="$(HTML "$1")"
-  path="$(URL "$ITEM/$1")"
+  link="$(URL "$ITEM/$1")"
+  path="$(HTML "$ITEM/$1")"
   qry=$(HTML "$QUERY_STRING")
 
   if [ -d "$_DATA/$ITEM/$1" ]; then
     printf '[a .list .dir href="%s" %s]' "${path}?${qry}" "$name"
-  else
+  elif [ -f "$_DATA/$ITEM/$1" ]; then
     read -r length width height tags comment n <<-EOF
        $(meta_info "$_DATA/$ITEM/$1")
        EOF
     printf '[div .list .file
-              [a href="%s" [img src="%s?a=thumbnail"][label %s]]
+              [a href="%s" [img src="%s?a=thumbnail"]][label %s]
               [span .time %i:%imin] [span .dim %ix%i] %s
-              [checkbox "select" "%s" id="select_%s" form="multitag"][label for="select_%s" +]
+              [checkbox "select" "%s" id="select_%s"][label for="select_%s" +]
             ]' \
-      "$path" "$path" "$name" \
+      "$link" "$link" "$name" \
       "$((length / 60))" "$((length % 60))" \
       "$width" "$height" \
       "$(UNSTRING "${tags#tags=}" |tr , '\0' |xargs -r0 printf ' [span .tag %s]')" \
       "$path" "$path" "$path"
+  else
+    printf 'Canning record for nonexist file: %s\n' "$1" >&2
+    meta_purge "$_DATA/$ITEM/$1"
   fi
 }
 
@@ -48,6 +52,15 @@ list_directories(){
   | tail -n1
 )"
 
+list_fullname(){
+  sn="$1"
+  [ ! "${sn%%*/*}" ] && base="${sn%/*}" || base=.
+  file="$(printf '%s' "$_DATA/$ITEM/$sn".*)"
+  file="${file##*/}"
+  [ -e "$_DATA/$ITEM/$base/${file}" ] \
+  && printf '%s\n' "${base}/${file}"
+}
+
 list_filemeta(){
   local meta base f fn file
   base="$1"
@@ -57,53 +70,57 @@ list_filemeta(){
   if [ $ORDER = Name ]; then
     sort -k6 "$meta"
   elif [ $ORDER = Length ]; then
-    sort -n "$meta"
+    sort -n -k1 "$meta"
   else
     cat "$meta"
   fi \
   | if [ "$FILTER" ]; then
     sed -nr "$list_fex"
   elif [ "${SEARCH#!}" != "${SEARCH}" ]; then
-    grep -viE "$(STRING "${SEARCH#!}")"
+    grep -aviE "$(STRING "${SEARCH#!}" |sed -r ':x s;((^|[^\\])(\\\\)*)\+;\1\\+;g; tx;')"
   else
-    grep -iE "$(STRING "${SEARCH}")"
-  fi |cut -f6 \
-  | UNSTRING \
+    grep -aiE "$(STRING "${SEARCH}" \
+                 | sed -r ':x s;((^|[^\\])(\\\\)*)\+;\1 ;g; tx;
+                            s;((^|[^\\])(\\\\)*)\\\+;\1+;g;
+                            s; ;\\+;g;')"
+  fi |cut -f6 | UNSTRING \
   | while read -r fn; do
-    file="$(printf '%s' "$_DATA/$ITEM/$base/${fn%${CR}}".*)"
-    file="${file##*/}"
-    [ -e "$_DATA/$ITEM/$base/${file}" ] \
-    && printf '%s\n' "${base}/${file}"
-  done
+    printf '%s\n' "${base}/${fn%${CR}}"
+  done | tee .index/debug
 }
 
 list_index(){
   local meta
   (cd "$_DATA/$ITEM";
     find ./ -path '*/.index/meta'
-  ) | while meta="$(line)"; do
+  ) | while read -r meta; do
     list_filemeta "${meta%/.index/meta}"
   done
 }
 
+list_dateorder(){
+  while read -r sn; do 
+    list_fullname "$sn"
+  done \
+  | xargs -rd'\n' stat -c '%Y  %n' \
+  | sort -rn |cut -d/ -f2- \
+  | sed -r 's;\.[^\.]*$;;;'
+}
+
 list_items() {
   local mode
-  mode="$(COOKIE mode |grep -m1 -xE 'index|browse' || printf browse )"
+  mode="$(COOKIE mode |grep -m1 -axE 'index|browse' || printf browse )"
 
   [ "$mode" = browse -a "$ITEM" ] && printf '..\n'
 
   if   [ "$mode" = browse -a "$ORDER" = Date ]; then
     list_directories
-    list_filemeta . \
-    | xargs -rd'\n' stat -c '%Y        %n' \
-    | sort -rn |cut -d/ -f2-
+    list_filemeta . |list_dateorder
+  elif [ "$mode" = index  -a "$ORDER" = Date ]; then
+    list_index |list_dateorder
   elif [ "$mode" = browse ]; then
     list_directories
     list_filemeta .
-  elif [ "$mode" = index  -a "$ORDER" = Date ]; then
-    list_index \
-    | xargs -rd'\n' stat -c '%Y        %n' \
-    | sort -rn | cut -d/ -f2-
   elif [ "$mode" = index ]; then
     list_index
   fi
@@ -111,13 +128,13 @@ list_items() {
 
 list_paginate() {
   local page i c n end
-  page="$(GET p |grep -xE '[0-9]+' || printf 1)"; c=1
+  page="$(GET p |grep -axE '[0-9]+' || printf 1)"; c=1
   end=$((page + LISTSIZE))
 
   printf '[div .itemlist '
   while read -r i; do
     [ $c -ge $page -a $c -lt $end  ] \
-    && list_item "$i"
+    && list_item "$(list_fullname "$i")"
     c=$((c + 1))
   done
   printf ']'
@@ -125,7 +142,7 @@ list_paginate() {
   printf '[div .pagination'
   for n in $( seq 1 $((c / LISTSIZE + 1)) ); do
     printf '[a .page href="%s" %s]' \
-      "?p=$(( (n - 1) * LISTSIZE + 1))" "$n"
+      "?p=$(( (n - 1) * LISTSIZE + 1))&$qry" "$n"
   done
   printf ']'
 }
@@ -145,8 +162,9 @@ printf 'Content-Type: text/html;charset=utf-8\r\n\r\n'
     [a #t_avsearch href="#advsearch" Advanced]
     [a #t_prefs href="#prefs" &#x2699;]
   ]'
-  w_prefs
+  w_bookmarks
   w_advsearch
+  w_prefs
   printf '
   [form method=POST action="?a=multitag"'
     list_items \