diff options
Diffstat (limited to 'src/search_opensearch.php')
-rw-r--r-- | src/search_opensearch.php | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/search_opensearch.php b/src/search_opensearch.php new file mode 100644 index 0000000..3b59516 --- /dev/null +++ b/src/search_opensearch.php @@ -0,0 +1,127 @@ +<script language="PHP"> +require "search-functions.php"; + +$mode = array_key_exists('v', $_GET)?$_GET['v']:""; +$query = array_key_exists('query', $_GET)?$_GET['query']:""; + +$query_results = run_query($query); + +switch ($mode) +{ + case "opensearch.xml": + opensearch_description(); + break; + case "json": + opensearch_json_results($query, $query_results); + break; + case "xml": + opensearch_xml_results($query, $query_results); + break; + default: + invalid_format($query, $query_results); + break; +} + +function opensearch_description() +{ + global $config; + global $translator; + + $shortname = $translator['search']." ".$config['PROJECT_NAME']; + $link = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']); + header("Content-Type: application/xml"); + echo <<<END_OPENSEARCH +<?xml version="1.0" encoding="UTF-8"?> +<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> +<ShortName>$shortname</ShortName> +<Description>Doxygen Search</Description> +<InputEncoding>UTF-8</InputEncoding> +<!-- +<Image height="16" width="16" type="image/x-icon"> +http://dev.squello.com/doc/html/favicon.ico</Image> +--> +<Url type="text/html" method="GET" +template="$link/search.php?query={searchTerms}" /> +<Url type="application/x-suggestions+json" method="GET" +template="$link/search-opensearch.php?v=json&query={searchTerms}" /> +<Url type="application/x-suggestions+xml" method="GET" +template="$link/search-opensearch.php?v=xml&query={searchTerms}" /> +</OpenSearchDescription> +END_OPENSEARCH; +} + +function opensearch_xml_results($query, array $results) +{ + // Much as I hate copy'n'paste code re-use, this is for testing; + // I expect a richer version to come soon. + // Although I hate that IE does this richer than FF more... + $qs_results = array(); + foreach ($results as $i => $val) + { + foreach ($val['words'] as $j => $word) + { + if (array_key_exists($word, $qs_results)) + $qs_results[$word['match']]++; + else + $qs_results[$word['match']] = 1; + } + } + $result = <<<END_FRAG +<?xml version="1.0"?> +<SearchSuggestion xmlns="http://schemas.microsoft.com/Search/2008/suggestions"> +<Query>$query</Query> +<Section> +END_FRAG; + foreach ($qs_results as $word => $count) + { + $result .= <<<END_FRAG +<Item> +<Text>$word</Text> +<Description>$count results</Description> +</Item> +END_FRAG; + } + $result .= <<<END_FRAG +</Section> +</SearchSuggestion> +END_FRAG; + echo $result; +} + +function opensearch_json_results($query, array $results) +{ + $qs_results = array(); + foreach ($results as $i => $val) + { + foreach ($val['words'] as $j => $word) + { + if (array_key_exists($word, $qs_results)) + $qs_results[$word['match']]++; + else + $qs_results[$word['match']] = 1; + } + } + $result = '["'.$query.'", ['; + $json_words = ""; + $json_descriptions = ""; + $i = 0; + foreach ($qs_results as $word => $count) + { + if ($i != 0) + { + $json_words .= ", "; + $json_descriptions .= ", "; + } + $json_words .= '"'.$word.'"'; + $json_descriptions .= '"'.$count.' result'.($count==1?'':'s').'"'; + $i++; + } + print "[\"$query\", [$json_words],[$json_descriptions]]"; +} + +function invalid_format($query, array $results) +{ + print "Search results for '$query':\n\n"; + print_r($results); +} +</script> |