+ | sort |uniq -c |sort -rn |sed -E 's;^ *[0-9]+ ;;;' \
+ | UNSTRING | HTML \
+ | sed -E 's;
\;;\n;g; s;\n+;\n;g;'
+}
+
+tclist(){
+ printf %s "$*" \
+ | sed -rn '/:/s;^-?([^:]+):.*$;\1;p' \
+ |sort -u
+}
+
+c_tags="$_DATA/.index/tags.cache";
+if [ ! -s "$c_tags" ]; then
+ taglist >"$c_tags.$$"
+ mv "$c_tags.$$" "$c_tags"
+fi
+w_tags="$(cat "$c_tags")"
+
+c_tagcategories="$_DATA/.index/tagcategories.cache"
+if [ ! -s "$c_tagcategories" ]; then
+ tclist "$w_tags" >"$c_tagcategories.$$"
+ mv "$c_tagcategories.$$" "$c_tagcategories"
+fi
+w_tagcategories="$(cat "$c_tagcategories")"
+
+[ "$ORDER" = Name ] && w_coname=checked
+[ "$ORDER" = Date ] && w_codate=checked
+[ "$ORDER" = Length ] && w_colength=checked
+[ "$ORDER" = Group ] && w_cogroup=checked
+
+w_bmname=
+w_bmname(){
+ [ "$w_bmname" ] || w_bmname="$(
+ bm="$_DATA/.index/bookmarks"
+ name="$(grep -m1 -aF " search=${w_str_s} filter=${w_str_f}${CR}" "$bm" 2>&-)"
+
+ if [ "$name" ]; then
+ printf '%s' "$name" |cut -f1 |UNSTRING |HTML
+ else
+ printf '%s\t%s' "$SEARCH" "$FILTER" \
+ | sed -r '/^\t$/{ s;\t;All;; q;}
+ /.*\t$/{ s;\t$;;; q;}
+ /^\t.*/{ s;^\t;;;
+ :x; s;(^|[~^|])([^|^~:]+):;\1;; tx;
+ s;\^; and ;g; s;\|;,;g; s;~;not ;g; q;}' \
+ | HTML
+ fi
+ )"
+ printf '%s' "$w_bmname"
+}
+
+w_bookmarks(){
+ local bm="$_DATA/.index/bookmarks" name='' search='' filter=''
+ [ ! -d "${bm%/*}" ] && return 0
+ [ ! -f "$bm" ] && touch "$bm"
+
+ grep -qaF " search=$w_str_s filter=${w_str_f}${CR}" "$bm" && name=Update || name=Add
+
+ cat <<-EOF
+ [form #bookmarks action=?a=bookmark method=POST
+ [a href="#" x]
+ [hidden "ref" "${w_refuri}"]
+ [hidden "search" "$(HTML "$SEARCH")"][hidden "filter" "$(HTML "$FILTER")"]
+ [label Name for current page:]
+ [input name="name" value="$(w_bmname)" placeholder="Name" ]
+ [button type="submit" . ${name}]
+ EOF
+ [ "$name" ] && printf ' [submit "delete" "delete" Delete]'
+
+ sort "$bm" |while read -r name search filter; do
+ search="${search#search=}" filter="${filter#filter=}" filter="${filter%${CR}}"
+ [ "$search" = "${w_str_s}" -a "$filter" = "${w_str_f}" ] && continue
+
+ name="$(UNSTRING "$name")";
+ search="$(UNSTRING "${search}" |URL)";
+ filter="$(UNSTRING "${filter}" |URL)";
+ cat <<-EOF
+ [label .link . $(HTML "$name" |sed 's;,\;;&[wbr];g;')]
+ [a .link target=blank href="/?o=Name&s=${search}&f=${filter}" by Name]
+ [a .link target=blank href="/?o=Date&s=${search}&f=${filter}" by Date]
+ [a .link target=blank href="/?o=Length&s=${search}&f=${filter}" by Length]
+ [a .link target=blank href="/?o=Group&s=${search}&f=${filter}" by Group]
+ EOF
+ done
+ printf ']'
+}
+
+w_search(){
+ cat <<-EOF
+ [form #search method=GET action=./?
+ [select name=o size=1
+ [option disabled=disabled Order By]
+ [option value=Name ${w_coname} Name]
+ [option value=Date ${w_codate} Date]
+ [option value=Length ${w_colength} Length]
+ [option value=Group ${w_cogroup} Group]
+ ]
+ [input name=s placeholder=Search value="$(HTML "$SEARCH")"]
+ [a #t_avsearch href="#advsearch" Advanced]
+ ]
+ EOF