aboutsummaryrefslogtreecommitdiffhomepage
path: root/doc/ref/csharp/html/SearchHelp.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'doc/ref/csharp/html/SearchHelp.inc.php')
-rw-r--r--doc/ref/csharp/html/SearchHelp.inc.php173
1 files changed, 173 insertions, 0 deletions
diff --git a/doc/ref/csharp/html/SearchHelp.inc.php b/doc/ref/csharp/html/SearchHelp.inc.php
new file mode 100644
index 0000000000..b905e130cf
--- /dev/null
+++ b/doc/ref/csharp/html/SearchHelp.inc.php
@@ -0,0 +1,173 @@
+<?
+// Contributed to the Sandcastle Help File Builder project by Thomas Levesque
+
+class Ranking
+{
+ public $filename;
+ public $pageTitle;
+ public $rank;
+
+ function __construct($file, $title, $rank)
+ {
+ $this->filename = $file;
+ $this->pageTitle = $title;
+ $this->rank = $rank;
+ }
+}
+
+
+/// <summary>
+/// Split the search text up into keywords
+/// </summary>
+/// <param name="keywords">The keywords to parse</param>
+/// <returns>A list containing the words for which to search</returns>
+function ParseKeywords($keywords)
+{
+ $keywordList = array();
+ $words = preg_split("/[^\w]+/", $keywords);
+
+ foreach($words as $word)
+ {
+ $checkWord = strtolower($word);
+ $first = substr($checkWord, 0, 1);
+ if(strlen($checkWord) > 2 && !ctype_digit($first) && !in_array($checkWord, $keywordList))
+ {
+ array_push($keywordList, $checkWord);
+ }
+ }
+
+ return $keywordList;
+}
+
+
+/// <summary>
+/// Search for the specified keywords and return the results as a block of
+/// HTML.
+/// </summary>
+/// <param name="keywords">The keywords for which to search</param>
+/// <param name="fileInfo">The file list</param>
+/// <param name="wordDictionary">The dictionary used to find the words</param>
+/// <param name="sortByTitle">True to sort by title, false to sort by
+/// ranking</param>
+/// <returns>A block of HTML representing the search results.</returns>
+function Search($keywords, $fileInfo, $wordDictionary, $sortByTitle)
+{
+ $sb = "<ol>";
+ $matches = array();
+ $matchingFileIndices = array();
+ $rankings = array();
+
+ $isFirst = true;
+
+ foreach($keywords as $word)
+ {
+ if (!array_key_exists($word, $wordDictionary))
+ {
+ return "<strong>Nothing found</strong>";
+ }
+ $occurrences = $wordDictionary[$word];
+
+ $matches[$word] = $occurrences;
+ $occurrenceIndices = array();
+
+ // Get a list of the file indices for this match
+ foreach($occurrences as $entry)
+ array_push($occurrenceIndices, ($entry >> 16));
+
+ if($isFirst)
+ {
+ $isFirst = false;
+ foreach($occurrenceIndices as $i)
+ {
+ array_push($matchingFileIndices, $i);
+ }
+ }
+ else
+ {
+ // After the first match, remove files that do not appear for
+ // all found keywords.
+ for($idx = 0; $idx < count($matchingFileIndices); $idx++)
+ {
+ if (!in_array($matchingFileIndices[$idx], $occurrenceIndices))
+ {
+ array_splice($matchingFileIndices, $idx, 1);
+ $idx--;
+ }
+ }
+ }
+ }
+
+ if(count($matchingFileIndices) == 0)
+ {
+ return "<strong>Nothing found</strong>";
+ }
+
+ // Rank the files based on the number of times the words occurs
+ foreach($matchingFileIndices as $index)
+ {
+ // Split out the title, filename, and word count
+ $fileIndex = explode("\x00", $fileInfo[$index]);
+
+ $title = $fileIndex[0];
+ $filename = $fileIndex[1];
+ $wordCount = intval($fileIndex[2]);
+ $matchCount = 0;
+
+ foreach($keywords as $words)
+ {
+ $occurrences = $matches[$word];
+
+ foreach($occurrences as $entry)
+ {
+ if(($entry >> 16) == $index)
+ $matchCount += $entry & 0xFFFF;
+ }
+ }
+
+ $r = new Ranking($filename, $title, $matchCount * 1000 / $wordCount);
+ array_push($rankings, $r);
+
+ if(count($rankings) > 99)
+ break;
+ }
+
+ // Sort by rank in descending order or by page title in ascending order
+ if($sortByTitle)
+ {
+ usort($rankings, "cmprankbytitle");
+ }
+ else
+ {
+ usort($rankings, "cmprank");
+ }
+
+ // Format the file list and return the results
+ foreach($rankings as $r)
+ {
+ $f = $r->filename;
+ $t = $r->pageTitle;
+ $sb .= "<li><a href=\"$f\" target=\"_blank\">$t</a></li>";
+ }
+
+ $sb .= "</ol";
+
+ if(count($rankings) < count($matchingFileIndices))
+ {
+ $c = count(matchingFileIndices) - count(rankings);
+ $sb .= "<p>Omitted $c more results</p>";
+ }
+
+ return $sb;
+}
+
+function cmprank($x, $y)
+{
+ return $y->rank - $x->rank;
+}
+
+function cmprankbytitle($x, $y)
+{
+ return strcmp($x->pageTitle, $y->pageTitle);
+}
+
+?>