mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-10-05 19:18:01 +08:00
351 lines
7.2 KiB
Bash
351 lines
7.2 KiB
Bash
#!/bin/sh
|
|
|
|
set_ENV() {
|
|
|
|
# global var
|
|
BASE_NAME=$(basename $1 .sh)
|
|
|
|
if [ -n "$HTTP_ACCEPT_LANGUAGE" -a -d ../form/$HTTP_ACCEPT_LANGUAGE ]; then
|
|
FORM_FILE_DIR=../form/$HTTP_ACCEPT_LANGUAGE
|
|
else
|
|
FORM_FILE_DIR=../form/en
|
|
fi
|
|
|
|
# ULib version
|
|
ULIB_VERSION=1.0.5
|
|
|
|
# location of index db
|
|
IR_DIRECTORY=../../../IR
|
|
|
|
# location of docs indexed
|
|
DOC_DIRECTORY=/usr/src/ULib-$ULIB_VERSION/tests/examples/IR/doc
|
|
|
|
# directory to put result search, session, etc...
|
|
RESULT_DIR=../result
|
|
|
|
if [ -n "$HTTP_COOKIE" ]; then
|
|
RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
|
|
fi
|
|
|
|
export BASE_NAME FORM_FILE_DIR ULIB_VERSION IR_DIRECTORY DOC_DIRECTORY RESULT_DIR TMP_FORM_FILE SET_COOKIE FORM_PART1 FORM_PART2 FORM_PART3 QUERY TIME
|
|
|
|
# paginazione
|
|
export FOR_PAGE NUM_START NUM_END NUM_DOC pagina_corrente link_paginazione
|
|
}
|
|
|
|
write_OUTPUT() {
|
|
|
|
if [ -n "$1" ]; then
|
|
|
|
if [ -n "$SET_COOKIE" ]; then
|
|
|
|
# REQ: Set-Cookie: TODO[ data expire path domain secure HttpOnly ]
|
|
# ----------------------------------------------------------------------------------------------------------------------------
|
|
# string -- Data to put into the cookie -- must
|
|
# int -- Lifetime of the cookie in HOURS -- must (0 -> valid until browser exit)
|
|
# string -- Path where the cookie can be used -- opt
|
|
# string -- Domain which can read the cookie -- opt
|
|
# bool -- Secure mode -- opt
|
|
# bool -- Only allow HTTP usage -- opt
|
|
# ----------------------------------------------------------------------------------------------------------------------------
|
|
# RET: Set-Cookie: ulib_sid=data&expire&HMAC-MD5(data&expire); expires=expire(GMT); path=path; domain=domain; secure; HttpOnly
|
|
|
|
echo -e "Set-Cookie: TODO[ $SET_COOKIE 24 ]\r"
|
|
|
|
fi
|
|
|
|
echo -e "Content-Type: text/html; charset=iso-8859-1\r\n\r"
|
|
echo -n -E "$1"
|
|
|
|
exit 0
|
|
|
|
fi
|
|
}
|
|
|
|
view_form() {
|
|
|
|
if [ -z "$FORM_PART3" ]; then
|
|
FORM_PART3=$ULIB_VERSION
|
|
fi
|
|
|
|
printf -v OUTPUT "`cat $FORM_FILE_DIR/$BASE_NAME.tmpl`" "sh" "$FORM_PART1" "$FORM_PART2" "$FORM_PART3"
|
|
|
|
unset FORM_PART1 FORM_PART2
|
|
}
|
|
|
|
view_form_with_help() {
|
|
|
|
FORM_PART1=$BASE_NAME".sh"
|
|
|
|
if [ -z "$FORM_PART2" ]; then
|
|
FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.hlp`"
|
|
fi
|
|
|
|
view_form
|
|
}
|
|
|
|
view_form_without_help() {
|
|
|
|
FORM_PART1="?ext=help"
|
|
|
|
if [ -z "$FORM_PART2" ]; then
|
|
FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.top`"
|
|
fi
|
|
|
|
view_form
|
|
}
|
|
|
|
load_value_session() {
|
|
|
|
if [ -f $TMP_FORM_FILE ]; then
|
|
|
|
i=0
|
|
while read LINE
|
|
do
|
|
let "i = i + 1"
|
|
|
|
eval v$i=\"$LINE\"
|
|
done < $TMP_FORM_FILE
|
|
|
|
fi
|
|
}
|
|
|
|
save_value_session() {
|
|
|
|
cat <<END >$TMP_FORM_FILE
|
|
$1
|
|
$2
|
|
$3
|
|
$4
|
|
$5
|
|
END
|
|
}
|
|
|
|
execute_query() {
|
|
|
|
# set session cookie
|
|
|
|
if [ -z "$HTTP_COOKIE" ]; then
|
|
SET_COOKIE=SESSION_$$
|
|
HTTP_COOKIE=$SET_COOKIE
|
|
RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
|
|
fi
|
|
|
|
mkdir -p $RESULT_DIR
|
|
|
|
TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query
|
|
|
|
QUERY=$1
|
|
FOR_PAGE=$2
|
|
|
|
# run query
|
|
|
|
(cd ../../..; TIME='%e' time ../../examples/IR/query -c index.cfg "$QUERY") 2>$TMP_FORM_FILE >$RESULT_DIR/$BASE_NAME.list
|
|
|
|
TIME=`tail -n 1 $TMP_FORM_FILE`
|
|
NUM_DOC=`wc -l < $RESULT_DIR/$BASE_NAME.list`
|
|
|
|
# read num records index db
|
|
|
|
CDB_NUM_RECS=../../../../../cdb/cdbnumrecs
|
|
|
|
if [ -x $CDB_NUM_RECS ]; then
|
|
|
|
NUM_REC_DOCS=`$CDB_NUM_RECS < $IR_DIRECTORY/db/tbl_names.cdb`
|
|
NUM_REC_WORDS=`$CDB_NUM_RECS < $IR_DIRECTORY/db/tbl_words.cdb`
|
|
|
|
fi
|
|
|
|
printf -v FORM_PART3 "$ULIB_VERSION, with %u documents and %u words." $NUM_REC_DOCS $NUM_REC_WORDS
|
|
|
|
set_paginazione 1
|
|
|
|
view_page
|
|
|
|
save_value_session "$QUERY" $FOR_PAGE $TIME $NUM_DOC "$FORM_PART3"
|
|
}
|
|
|
|
view_page() {
|
|
|
|
# header
|
|
|
|
printf -v RESULT_TOP "`cat $FORM_FILE_DIR/result.top`" $NUM_START $NUM_END $NUM_DOC "$QUERY" $TIME
|
|
|
|
# documents
|
|
|
|
if [ $NUM_DOC -eq 0 ]; then
|
|
|
|
RESULT_DOC="<p class=\"note\">Your search did not match any documents.</p>"
|
|
|
|
else
|
|
|
|
RESULT_DOC_FILE="`cat $FORM_FILE_DIR/result.doc`"
|
|
|
|
DOC_VEC=( $(cat "$RESULT_DIR/$BASE_NAME.list") )
|
|
|
|
for (( i=$NUM_START-1; i<$NUM_END; i+=1 )); do
|
|
|
|
DOC=${DOC_VEC[i]}
|
|
|
|
SNIPPET_DOC=`fmt -w 300 $IR_DIRECTORY/doc/$DOC | head -n 1 | ../../../../base/crypto_xml`
|
|
|
|
printf -v ADD "$RESULT_DOC_FILE" $IR_DIRECTORY/doc/$DOC `basename $DOC` "$SNIPPET_DOC" $DOC_DIRECTORY/$DOC
|
|
|
|
RESULT_DOC=$RESULT_DOC$ADD" "
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
# link page
|
|
|
|
printf -v RESULT_PAG "`cat $FORM_FILE_DIR/result.pag`" "$link_paginazione"
|
|
|
|
FORM_PART2="$RESULT_TOP $RESULT_DOC $RESULT_PAG"
|
|
|
|
view_form_without_help
|
|
}
|
|
|
|
view_page_result() {
|
|
|
|
TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query
|
|
|
|
load_value_session
|
|
|
|
QUERY="$v1"
|
|
FOR_PAGE=$v2
|
|
TIME=$v3
|
|
NUM_DOC=$v4
|
|
FORM_PART3="$v5"
|
|
|
|
set_paginazione $1
|
|
|
|
view_page
|
|
}
|
|
|
|
# funzioni che creano i link alle pagine dei risultati
|
|
# ----------------------------------------------------
|
|
|
|
crea_link() {
|
|
|
|
if [ "$pagina_corrente" = "$1" ]; then
|
|
ADD="<span class=\"pnow\">$1</span>"
|
|
else
|
|
ADD="<a href=\"?page=$1\" class=\"pnum\">$1</a>"
|
|
fi
|
|
|
|
link_paginazione=$link_paginazione$ADD" "
|
|
}
|
|
|
|
set_paginazione() {
|
|
|
|
pagina_corrente=$1
|
|
|
|
if [ $NUM_DOC -le $FOR_PAGE ]; then
|
|
|
|
if [ $NUM_DOC -eq 0 ]; then
|
|
NUM_START=0
|
|
else
|
|
NUM_START=1
|
|
fi
|
|
|
|
NUM_END=$NUM_DOC
|
|
|
|
link_paginazione="<span class=\"void\">PREV</span><span class=\"void\">NEXT</span>"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
let "pagina_precedente = $pagina_corrente - 1"
|
|
let "pagina_successiva = $pagina_corrente + 1"
|
|
|
|
let "tot_pagine = $NUM_DOC / $FOR_PAGE"
|
|
let "resto = $NUM_DOC % $FOR_PAGE"
|
|
|
|
if [ $resto -ne 0 ]; then
|
|
let "tot_pagine = $tot_pagine + 1"
|
|
fi
|
|
|
|
let "ultima_pagina = $tot_pagine - 1"
|
|
let "penultima_pagina = $ultima_pagina - 1"
|
|
|
|
# link alla pagina precedente
|
|
|
|
if [ $pagina_corrente -eq 1 ]; then
|
|
NUM_START=1
|
|
|
|
link_paginazione="<span class=\"void\">PREV</span> "
|
|
else
|
|
let "NUM_START = 1 + $pagina_precedente * $FOR_PAGE"
|
|
|
|
link_paginazione="<a href=\"?page=$pagina_precedente\" class=\"pnum\">PREV</a> "
|
|
fi
|
|
|
|
# mostriamo sempre il link alla prima pagina
|
|
|
|
crea_link 1
|
|
|
|
# se il prossimo link non è alla seconda pagina aggiungo dei puntini ... oppure la sola pagina mancante
|
|
|
|
if [ $pagina_precedente -gt 2 ]; then
|
|
|
|
if [ $pagina_precedente -eq 3 ]; then
|
|
crea_link 2
|
|
else
|
|
link_paginazione=$link_paginazione" ... "
|
|
fi
|
|
|
|
fi
|
|
|
|
# creo i link alla pagina corrente ed a quelle ad essa vicine
|
|
|
|
for (( i=$pagina_precedente; i<=$pagina_successiva; i+=1 )); do
|
|
|
|
# se tra quelle vicine c'è la prima pagina (già riportata)
|
|
|
|
if [ $i -lt 2 ]; then
|
|
continue
|
|
fi
|
|
|
|
# se tra quelle vicine c'è l'ultima pagina (che mostrerò con le prossime istruzioni)
|
|
|
|
if [ $i -gt $ultima_pagina ]; then
|
|
continue
|
|
fi
|
|
|
|
crea_link $i
|
|
done
|
|
|
|
# se il precedente link non era alla penultima pagina aggiungo dei puntini ... oppure la sola pagina mancante
|
|
|
|
if [ $pagina_successiva -lt $ultima_pagina ]; then
|
|
|
|
if [ $pagina_successiva -eq $penultima_pagina ]; then
|
|
crea_link $ultima_pagina
|
|
else
|
|
link_paginazione=$link_paginazione" ... "
|
|
fi
|
|
|
|
fi
|
|
|
|
# mostriamo il link all'ultima pagina se questa non coincide con la prima
|
|
|
|
if [ $tot_pagine -ne 1 ]; then
|
|
crea_link $tot_pagine
|
|
fi
|
|
|
|
# link alla pagina successiva
|
|
|
|
if [ $pagina_corrente -eq $tot_pagine ]; then
|
|
NUM_END=$NUM_DOC
|
|
|
|
link_paginazione=$link_paginazione"<span class=\"void\">NEXT</span>"
|
|
else
|
|
let "NUM_END = $NUM_START + $FOR_PAGE - 1"
|
|
|
|
link_paginazione=$link_paginazione"<a href=\"?page=$pagina_successiva\" class=\"pnum\">NEXT</a>"
|
|
fi
|
|
}
|
|
# ------------------------------------------------------
|