#!/home/smile77/bin/vipsi
// "search site" script as used on my homepage
// -------------------------------------------
// please adjust paths ... B-)
// the search pattern passed to the script (must exist):
if !exists(pattern) var pattern = "" then
// file system base expressed as http and file
var file_root = env.DOCUMENT_ROOT # "/"
var http_root = "http://" # env.SERVER_NAME # "/"
// little patch so i can use it at home:
if env.SERVER_NAME=="_default_"
http_root = "http://" # env.HTTP_HOST # "/"
then
if env.SERVER_ADDR=="127.0.0.1" || env.SERVER_ADDR=="10.0.0.4"
file_root #= "www/little-bat.de/"
http_root #= "www/little-bat.de/"
then
// http and html header:
put "content-type: text/html",nl,nl
put "<!doctype html public \"-//w3c//dtd html 4.01 strict//en\"><html><head>"
put "<META http-equiv=Content-Type content='text/html; charset=UTF-8'>"
put "<title>search results for '"#pattern#"'</title></head>",nl
put "<body background='"#http_root#"b/hdgr.jpg' bgcolor='#CCCCCC' ",
"text=black link=black vlink=blue alink=black>",nl
// test for magic parameter to show my own source:
if exists showsource
var myfile = env.SCRIPT_FILENAME
var mysource = file(myfile)
convert mysource to html
put "<pre>",nl, mysource, nl,"</pre></body></html>",nl
end
then
// Procedure: Print usage instructions
proc DisplayHelp(errmsg)
{
put
"<p align=center> ",
"<br><b>",errmsg,"</b>",
"<br> ",
"<table border=1 width='95%' align=center cellpadding=2>",
"<tr><th align=center>",
"Help for Search Site",
"</th></tr>",nl,
"<tr><td align=center>",
"<table border=0><tr><td>",
"<ul>",
"<li>The search pattern must be at least 3 characters long.</li>",
"<li>The search is not case sensitive.</li>",
"<li>The search pattern must match exactly the text in a file.",
"<br>If it contains multiple words, then they must appear 'as written'.</li>",
"<li>Use the wildcards '?' and '*' to match any single character or",
"<br>any sequence of non-significant characters.</li>",
"</ul>",
"</td></tr></table>",
"</td></tr>",nl,
"<tr><td align=center>",
"e.g. to search for files which contain '<b>foo</b>' and '<b>bar</b>' search for '<b>foo*bar</b>'.",
"</td></tr></table>",
"<p> ",nl
}
// Procedure: search all files in directory "path"
// calls itself recursively for all subdirectories
proc Search(path)
{
if rightstr(path,1)!="/" path#="/" then
var folder = dir(file_root#path)
var i = 0
do
while ++i<=count(folder)
var item = folder[i]
var fname = item.fname
if item.flags[1]=="d" && rightstr(fname,1)!="/" fname#="/" then
if fname[1]=="." next then // skip hidden files
if fname=="b/" next then // skip images folders
if fname=="stats/" next then // skip stats folder (requires password anyway)
if item.flags[1]=="d" // recursively handle folder
Search(path#fname) next
then
var ext = fname[ rfind(fname,".") to ]
if !find(".html.hh.cpp.txt",ext) next then // no text file
var datei = lowerstr(file(file_root#path#fname))
files_scanned += 1
bytes_scanned += count(datei)
if !match(datei,pattern) next then // not found
var a=find(datei,"<title>") // found: display file
var e=find(datei,"</title>")
var title = a&&e ? datei[a+7 to e-1] : "<i>no title</i>"
Display(path,fname,title)
loop
}
// Procedure: build a link:
proc Link(url,text)
{
return "<a href='" # url # "'>" # text # "</a>"
}
// Procedure: print table row for file:
proc Display(path,fname,title)
{
files_found++
convert path to html
convert fname to html
var url = http_root # path # fname;
put "<tr><td>", Link(url,path#fname), "</td><td>", title, "</td></tr>",nl
}
// statistics counters
var files_scanned = 0
var bytes_scanned = 0
var files_found = 0
// print table start
put
"<p> <table border=1 width='95%' align=center cellpadding=2>",
"<tr><th bgcolor='#ffffcc' colspan=2 align=center style='font-size:150%;'>Search results for '", pattern, "'</th></tr>",
"<tr><th bgcolor='#00CCCC'>file</th><th bgcolor='#00CCCC'>title</th></tr>\n"
// search & print table rows
if count(pattern)>=3
pattern = "*" # lowerstr(pattern) # "*"
Search("")
then
// print table end
put "</table>",nl
// if no files found print additional help
if files_found
put
"<p align=center> ",
"<br>Scanned ",files_scanned,
" files (",bytes_scanned,
" bytes) and found <b>",files_found,
"</b> file","s"[to files_found>1],".</p>\n"
else
if count(pattern)==0 DisplayHelp("Search failed. (no search pattern given)") else
if count(pattern)<3 DisplayHelp("Search failed. (search pattern too short)") else
DisplayHelp("No files found.");
then then
then
// print info on vipsi
put
"<p> ",
"<table border=1 width='95%' align=center cellpadding=2>",
"<tr><td align=center>\n",
Link( "http://" # env.HTTP_HOST # env.SCRIPT_NAME # "?showsource=yes", "view script" ),
" powered by vipsi - vipsi shell and script language ",
Link( "http://vipsi.sourceforge.net' target='_blank","about vipsi" ),
"\n</td></tr></table>\n"
// print end of html page
put "<p> </body></html>",nl
end