From: tho Date: Fri, 13 Apr 2007 10:56:46 +0000 (+0000) Subject: added search engine X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=fbb92f7d46961a9994ff74703f470c36654fb2be;p=senf.git added search engine git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@225 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/Examples/Mainpage.dox b/Examples/Mainpage.dox index 002b0e1..f8ef7eb 100644 --- a/Examples/Mainpage.dox +++ b/Examples/Mainpage.dox @@ -62,6 +62,8 @@ specific type of socket which returns ethernet packets directly from the network wire. By uncommenting the last line, you may switch the interface into promiscuous mode. + \until // + We will now read packets from the socket forever, that is until the user hits Ctrl-C \skip while @@ -158,9 +160,9 @@ \see \ref components \n \ref build \n - libSocket API reference \n - libPackets API reference \n - libUtils API reference + libSocket API reference \n + libPackets API reference \n + libUtils API reference */ diff --git a/doclib/Doxyfile.global b/doclib/Doxyfile.global index b959702..5d8dbba 100644 --- a/doclib/Doxyfile.global +++ b/doclib/Doxyfile.global @@ -21,6 +21,7 @@ INTERNAL_DOCS = YES SOURCE_BROWSER = YES ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 3 +SEARCHENGINE = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES diff --git a/doclib/doxy-header-overview.html b/doclib/doxy-header-overview.html index 9a4bf37..050cc2b 100644 --- a/doclib/doxy-header-overview.html +++ b/doclib/doxy-header-overview.html @@ -13,6 +13,11 @@ div.tabs ul li.$projectname a { background-color: #EDE497; }
diff --git a/doclib/doxy-header.html b/doclib/doxy-header.html index b3499de..ba83bb6 100644 --- a/doclib/doxy-header.html +++ b/doclib/doxy-header.html @@ -13,6 +13,11 @@ div.tabs ul li.$projectname a { background-color: #EDE497; }
diff --git a/doclib/html-munge.xsl b/doclib/html-munge.xsl index 341275b..a7f17c3 100644 --- a/doclib/html-munge.xsl +++ b/doclib/html-munge.xsl @@ -10,6 +10,9 @@ + + + @@ -74,5 +77,5 @@ anchor - + diff --git a/doclib/search.php b/doclib/search.php new file mode 100644 index 0000000..7fc04f5 --- /dev/null +++ b/doclib/search.php @@ -0,0 +1,64 @@ + + + +Search + + + + + + + + + + + + diff --git a/doclib/search_functions.php b/doclib/search_functions.php new file mode 100644 index 0000000..0431d0c --- /dev/null +++ b/doclib/search_functions.php @@ -0,0 +1,381 @@ +1 document matching your query."; + } + else // $num>1 + { + return "Found $num documents matching your query. Showing best matches first."; + } +} + +function report_matches() +{ + return "Matches: "; +} +function inputfield() +{ + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + echo ""; +} + +function readInt($file) +{ + $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file)); + $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file)); + return ($b1<<24)|($b2<<16)|($b3<<8)|$b4; +} + +function readString($file) +{ + $result=""; + while (ord($c=fgetc($file))) $result.=$c; + return $result; +} + +function readHeader($file) +{ + $header =fgetc($file); $header.=fgetc($file); + $header.=fgetc($file); $header.=fgetc($file); + return $header; +} + +function computeIndex($word) +{ + // Fast string hashing + //$lword = strtolower($word); + //$l = strlen($lword); + //for ($i=0;$i<$l;$i++) + //{ + // $c = ord($lword{$i}); + // $v = (($v & 0xfc00) ^ ($v << 6) ^ $c) & 0xffff; + //} + //return $v; + + // Simple hashing that allows for substring search + if (strlen($word)<2) return -1; + // high char of the index + $hi = ord($word{0}); + if ($hi==0) return -1; + // low char of the index + $lo = ord($word{1}); + if ($lo==0) return -1; + // return index + return $hi*256+$lo; +} + +function do_search($path, $file,$word,&$statsList) +{ + $index = computeIndex($word); + if ($index!=-1) // found a valid index + { + fseek($file,$index*4+4); // 4 bytes per entry, skip header + $index = readInt($file); + if ($index) // found words matching the hash key + { + $start=sizeof($statsList); + $count=$start; + fseek($file,$index); + $w = readString($file); + while ($w) + { + $statIdx = readInt($file); + if ($word==substr($w,0,strlen($word))) + { // found word that matches (as substring) + $statsList[$count++]=array( + "word"=>$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalHi=0; + $totalFreqHi=0; + $totalFreqLo=0; + for ($count=$start;$count $idx, + "freq" => $freq>>1, + "rank" => 0.0, + "hi" => $freq&1 + ); + if ($freq&1) // word occurs in high priority doc + { + $totalHi++; + $totalFreqHi+=$freq*$multiplier; + } + else // word occurs in low priority doc + { + $totalFreqLo+=$freq*$multiplier; + } + } + // read name and url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=$path.readString($file); + } + $statInfo["docs"]=$docInfo; + } + $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi; + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + if ($a["rank"] == $b["rank"]) + { + return 0; + } + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

".search_results()."

".matches_text(0)."
".matches_text($numDocs); + echo "\n"; + echo "
$num.".$doc["name"]."
".report_matches()." "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
\n"; +} + +function search() +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + + $paths = array( + "../doc/html/", + "../Socket/doc/html/", + "../Examples/doc/html/", + "../Packets/doc/html/", + "../Utils/doc/html/", + "../Scheduler/doc/html/", + ); + $files = array(); + $j=0; + for ($i=0; $i\n"; + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtok($query," "); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + for ($i=0; $i\n"; + foreach ($files as $file) { + fclose($file); + } +} + + +?> diff --git a/doclib/senf.css b/doclib/senf.css index d8292be..5e3c480 100644 --- a/doclib/senf.css +++ b/doclib/senf.css @@ -5,7 +5,7 @@ body { } #head { - height: 62px; + height: 72px; border-top: 5px solid #DECD40; border-bottom: 1px solid #AF9D00; background: url(logo-head.png) top left no-repeat; @@ -27,8 +27,8 @@ body { #head h2 { margin: 0 0 0 100px; - padding: 4px 0 0 42px; - height: 18px; + padding: 6px 0 0 42px; + height: 26px; background-color: #EDE497; color: #726921; font-size: 13px; @@ -36,6 +36,12 @@ body { white-space: nowrap; } +#search { + position: absolute; + top: 50px; + right: 10px; +} + #content1 { padding: 0 10px 10px 0; border-bottom: 1px solid #AF9D00;