X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=macros%2Fsearch;fp=macros%2Fsearch;h=b3d06e85a86fbc33274b48b298b4af9b926bd48b;hb=20c6ce6a3de621383d1b6d985757366590722005;hp=0000000000000000000000000000000000000000;hpb=3260c24fcce2db7d0b0eb98234c5ba385c6f55a9;p=shellwiki diff --git a/macros/search b/macros/search new file mode 100755 index 0000000..b3d06e8 --- /dev/null +++ b/macros/search @@ -0,0 +1,148 @@ +#!/bin/sh + +# Copyright 2023, 2024 Paul Hänsch +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +I="$_DATA/index" + +. "$_EXEC/cgilite/cgilite.sh" +. "$_EXEC/cgilite/storage.sh" +. "$_EXEC/cgilite/db23.sh" +. "$_EXEC/tools.sh" +. "$_EXEC/acl.sh" + +_(){ printf %s\\n "$*"; } +[ "${LANGUAGE}" -a -r "${_EXEC}/l10n/${LANGUAGE}.sh" ] && . "${_EXEC}/l10n/${LANGUAGE}.sh" + +show_form=true show_hits='' action='' + +set -- "$@" -- +while [ $# -gt 0 ]; do case $1 in + --no-form|--noform) + show_form=''; shift 1;; + --hits|--results) + show_hits='true'; shift 1;; + --action) + action="$(HTML "$2")"; shift 2;; + --action=*|action=*) + action="$(HTML "${2#*=}")"; shift 1;; + --) shift 1; break;; + *) set -- "$@" "$1"; shift 1;; +esac; done + +searchteaser() { + local file="$1" words db3_data + local w l nc nl hits mhits cont mcont + shift 1; words="$*" + + for w in ${words}; do + grep -hiwnF "$w" "$file" + done \ + | sort -t: -k1 -n \ + | { nc=-1 hits=0 mhits=0 + while read -r l; do + nl="$nc" nc="${l%%:*}" + if [ $nc -eq $nl ]; then + hits=$((hits + 1)) + elif [ $nc -eq $((nl + 1 )) ]; then + hits=$((hits + 1)) + cont="${cont}${BR}${l#*:}" + elif [ $hits -gt $mhits ]; then + mhits="$hits" mcont="$cont" + hits=1 cont="${l#*:}" + else + hits=1 cont="${l#*:}" + fi + done + + [ $hits -gt $mhits ] \ + && STRING "$cont" \ + || STRING "$mcont" + } +} + +if [ ! "$action" -a "$LANGUAGE_DEFAULT" ]; then + action="./:${LANGUAGE}/[search]" +elif [ ! "$action" ]; then + action="./[search]" +fi + +if [ "${show_form}" = true ]; then + printf '' "$action" "$(_ Search)" "$([ "$show_hits" = true ] && GET q |HTML)" "$(_ Search)" +fi + +if [ "${show_hits}" = true ]; then + { read tags; read ntags; read words; } <<-EOF + $(GET q | awk ' + BEGIN { # Field separator FS should include punctuation, including Unicode Block U+2000 - U+206F + if ( length("¡") == 1 ) # Utf-8 aware AWK + FS = "([] \\t\\n\\r\"'\''()*+,./:;<=>?\\\\^_`{|}~[-]|%[0-9A-Fa-f]{2}|'"$(printf '[\342\200\200-\342\201\257]')"')+"; + else # UTF-8 Hack + FS = "([] \\t\\n\\r\"'\''()*+,./:;<=>?\\\\^_`{|}~[-]|%[0-9A-Fa-f]{2}|'"$(printf '\342\200[\200-\277]|\342\201[\201-\257]')"')+"; + fi + } + { t=0; for (n = 1; n <= NF; n++) if ($n ~ /#[[:alnum:]_]+/) tags[t++] = toupper($n); + t=0; for (n = 1; n <= NF; n++) if ($n ~ /![[:alnum:]_]+/) ntags[t++] = toupper($n); + t=0; for (n = 1; n <= NF; n++) if ($n !~ /![[:alnum:]_]+/) words[t++] = tolower($n); + for (t in tags) { sub(/^#/, "", tags[t]); printf "%s ", tags[t]; } print ""; + for (t in ntags) { sub(/^!/, "", ntags[t]); printf "%s ", ntags[t]; } print ""; + for (t in words) { sub(/^[!#]/, "", words[t]); printf "%s ", words[t]; } print ""; + } + ') + EOF + + printf '' +fi