]> git.plutz.net Git - serve0/blob - list.sh
implemented full multi file tagging
[serve0] / list.sh
1 #!/bin/sh
2
3 list_item() {
4   name="$(HTML "$1")"
5   path="$(HTML "$ITEM/$1")"
6   meta="$_DATA/$ITEM/$1"; meta="${meta%/*}/.index/meta"
7
8   if [ -d "$_DATA/$ITEM/$1" ]; then
9     printf '[a .list .dir href="%s?%s" %s]' \
10       "$path" "$(HTML "$QUERY_STRING")" "$name"
11   elif [ -f "$meta" ]; then
12     read -r length width height tags comment n <<-EOF
13         $(grep -m1 -F " ${1##*/}" "$meta")
14         EOF
15     printf '[div .list .file
16               [a href="%s" [img src="%s?a=thumbnail"][label %s]]
17               [span .time %i:%imin] [span .dim %ix%i] %s
18               [checkbox "select" "%s" id="select_%s" form="multitag"][label for="select_%s" +]
19             ]' \
20       "$path" "$path" "$name" \
21       "$((length / 60))" "$((length % 60))" \
22       "$width" "$height" \
23       "$(printf %s\\n "${tags#tags=}" |tr , ' ' |xargs printf '[span .tag %s]')" \
24       "$path" "$path" "$path"
25   else
26     printf '[div .list .file [a href="%s" [img src="%s?a=thumbnail"][label %s]]]' \
27       "$path" "$path" "$name"
28   fi
29 }
30
31 list_fs_browse(){
32   [ -d "$_DATA/$ITEM/.index" -a \! "$_DATA/$ITEM" -ot "$_DATA/$ITEM/.index/meta" ] \
33   && dir="$_DATA/$ITEM" . "$_EXEC/update_meta.sh"
34   (cd "$_DATA/$ITEM";
35    find ./ -type d \! -name .index -mindepth 1 -maxdepth 1 \
36      -exec stat -c '%Y  %n' '{}' +
37    find ./ -type f -mindepth 1 -maxdepth 1 \
38      -exec stat -c '%Y  %n' '{}' +
39   )
40 }
41 list_fs_index(){
42   find "$_DATA/$ITEM" -type d -name .index \
43   | while d="$(line)"; do
44     [ ! "${d%/.index}" -ot "$d/meta" ] \
45     && dir="${d%/.index}" . "$_EXEC/update_meta.sh"
46   done
47   (cd "$_DATA/$ITEM";
48    find ./ \! -path '*/.index/*' -type f \
49      -exec stat -c '%Y  %n' '{}' +
50   )
51 }
52
53 list_browse(){
54   meta="$_DATA/$ITEM/.index/meta"
55   [ -d "${meta%/meta}" -a \! "$_DATA/$ITEM" -ot "${meta}" ] \
56   && dir="$_DATA/$ITEM" . "$_EXEC/update_meta.sh"
57   (cd "$_DATA/$ITEM";
58     find ./ -type d \! -name .index -mindepth 1 -maxdepth 1 \
59   ) | cut -d/ -f2- | sort
60   sort -n "$meta" | cut -f6- \
61   | while f="$(line)"; do
62     [ -e "$_DATA/$ITEM/$f" ] && printf '%s\n' "$f"
63   done
64 }
65 list_index(){
66   (cd "$_DATA/$ITEM";
67     find ./ -path '*/.index/meta'
68   ) | while meta="$(line)"; do
69     base="${meta%/.index/meta}"
70     [ \! "$_DATA/$ITEM/$base" -ot "$_DATA/$ITEM/$meta" ] \
71     && dir="$_DATA/$ITEM/$base" . "$_EXEC/update_meta.sh"
72     cut -f1,6- <"$_DATA/$ITEM/$meta" \
73     | while f="$(line)"; do
74       [ -e "$_DATA/$ITEM/$base/${f#*    }" ] \
75       && printf '%s     %s\n' "${f%%    *}" "${base}/${f#*      }"
76     done
77   done \
78   | sort -n \
79   | cut -d/ -f2-
80 }
81
82 list_items() {
83   mode="$(COOKIE mode |grep -m1 -xE 'index|browse' || printf browse )"
84
85   [ "$mode" = browse -a "$ITEM" ] && printf '..\n'
86
87   if   [ "$mode" = browse -a "$ORDER" = Date ]; then
88     list_fs_browse | sort -rn | cut -d/ -f2-
89   elif [ "$mode" = browse -a "$ORDER" = Name ]; then
90     list_fs_browse | sort -k 2 | cut -d/ -f2-
91   elif [ "$mode" = index  -a "$ORDER" = Date ]; then
92     list_fs_index | sort -rn | cut -d/ -f2-
93   elif [ "$mode" = index  -a "$ORDER" = Name ]; then
94     list_fs_index | sort -k 2 | cut -d/ -f2-
95   elif [ "$mode" = browse -a "$ORDER" = Length ]; then
96     list_browse
97   elif [ "$mode" = index  -a "$ORDER" = Length ]; then
98     list_index
99   fi
100 }
101
102 list_paginate() {
103   page="$(GET p |grep -xE '[0-9]+' || printf 1)"
104
105   printf '[div .itemlist '
106   while i="$(line)"; do
107     c=$((${c-0} + 1))
108     if [ $c -lt $page ]; then
109       true
110     elif [ $c -lt $((LISTSIZE + page)) ]; then
111       list_item "$i"
112     fi
113   done
114   printf ']'
115
116   printf '[div .pagination'
117   for n in $(seq 1 $((c / LISTSIZE + 1)) ); do
118     printf '[a .page href="%s" %s]' \
119       "?p=$(( (n - 1) * LISTSIZE + 1))" "$n"
120   done
121   printf ']'
122 }
123
124 w_tagging(){
125   printf '[div #multitag [input type="hidden" name="ref" value="%s"]' "$(HTML "$REQUEST_URI")"
126   printf '[a href="#" Hide][br]'
127   find "$_DATA/$ITEM" -path '*/.index/meta' \
128        -exec cut -f4 '{}' + \
129   | cut -d= -f2- |tr , '\n' | sort -u \
130   | while read tag; do
131     cat_old="${category}"; category="${tag%%:*}"
132     [ "$category" = "$tag" ] && category="(none)"
133     [ "$cat_old" -a "$cat_old" != "$category" ] && printf ']]'
134     [ "$cat_old" != "$category" ] \
135     && printf '[fieldset [legend %s:][select name="tag" size=4 multiple' $(HTML "$category")
136     printf '[option value="%s" %s]' "$(HTML "$tag")" "$(HTML "${tag#*:}")"
137   done
138   printf ']][fieldset [legend New:][textarea name=newtag\n][button type=Submit Add Tags]]]'
139 }
140
141 printf 'Content-Type: text/html;charset=utf-8\r\n\r\n'
142
143 "$_EXEC/cgilite/html-sh.sed" <<-EOF
144 [!DOCTYPE HTML]
145 [html [head [title Listing]
146   [link rel=stylesheet href="/style.css" ]
147 ] [body
148   [div #navigation
149     [a #t_bookmarks href="#bookmarks" &#x2605;]
150     $(w_search)
151     [a #t_avsearch href="#advsearch" Advanced]
152     [a #t_prefs href="#prefs" &#x2699;]
153   ]
154   $(w_prefs)
155
156   [form method=POST action="?a=multitag"
157     $(list_items \
158       | list_paginate
159     )
160     [div #editing
161       [a href="#multitag" Add Tags] $(w_tagging)
162       $(w_index)
163     ]
164   ]
165 ] ]
166 EOF
167