summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2006-11-10 16:14:53 +0100
committerAndreas Gohr <andi@splitbrain.org>2006-11-10 16:14:53 +0100
commitda96af357215605d855d6ce8ef8fb50ffb679641 (patch)
treefb168534bdb989614796cdfdd2fd8febc404a37c
parent122b469f774df8026a8a6182d2bc026ae1a06e2b (diff)
downloadrpg-da96af357215605d855d6ce8ef8fb50ffb679641.tar.gz
rpg-da96af357215605d855d6ce8ef8fb50ffb679641.tar.bz2
OpenSearch support
This adds support for the OpenSearch specification to autodetect DokuWiki's search engine. The patch was submitted by Mike Frysinger some time ago. Some changes were made to the original patch. Only tested in FireFox 2.0 darcs-hash:20061110151453-7ad00-298ad77603854a604a642c0afd3975a997b8dc09.gz
-rw-r--r--inc/template.php2
-rw-r--r--lib/exe/ajax.php51
-rw-r--r--lib/exe/opensearch.php38
3 files changed, 89 insertions, 2 deletions
diff --git a/inc/template.php b/inc/template.php
index 3593cc602..cf3bf8da0 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -179,6 +179,8 @@ function tpl_metaheaders($alt=true){
// the usual stuff
$head['meta'][] = array( 'name'=>'generator', 'content'=>'DokuWiki '.getVersion() );
+ $head['link'][] = array( 'rel'=>'search', 'type'=>'application/opensearchdescription+xml',
+ 'href'=>DOKU_BASE.'lib/exe/opensearch.php', 'title'=>$conf['title'] );
$head['link'][] = array( 'rel'=>'start', 'href'=>DOKU_BASE );
$head['link'][] = array( 'rel'=>'contents', 'href'=> wl($ID,'do=index',false,'&'),
'title'=>$lang['btn_index'] );
diff --git a/lib/exe/ajax.php b/lib/exe/ajax.php
index 5218803ea..3f64dc7ac 100644
--- a/lib/exe/ajax.php
+++ b/lib/exe/ajax.php
@@ -23,8 +23,12 @@ header('Content-Type: text/html; charset=utf-8');
//call the requested function
-if (!isset($_POST['call'])) { return; }
-$call = 'ajax_'.$_POST['call'];
+if(isset($_POST['call']))
+ $call = 'ajax_'.$_POST['call'];
+else if(isset($_GET['call']))
+ $call = 'ajax_'.$_GET['call'];
+else
+ return;
if(function_exists($call)){
$call();
}else{
@@ -47,6 +51,7 @@ function ajax_qsearch(){
global $lang;
$query = cleanID($_POST['q']);
+ if(empty($query)) $query = cleanID($_GET['q']);
if(empty($query)) return;
require_once(DOKU_INC.'inc/html.php');
@@ -68,6 +73,48 @@ function ajax_qsearch(){
}
/**
+ * Support OpenSearch suggestions
+ *
+ * @link http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0
+ * @author Mike Frysinger <vapier@gentoo.org>
+ */
+function ajax_suggestions() {
+ global $conf;
+ global $lang;
+
+ $query = cleanID($_POST['q']);
+ if(empty($query)) $query = cleanID($_GET['q']);
+ if(empty($query)) return;
+
+ require_once(DOKU_INC.'inc/html.php');
+ require_once(DOKU_INC.'inc/fulltext.php');
+ require_once(DOKU_INC.'inc/JSON.php');
+
+ $data = array();
+ $data = ft_pageLookup($query);
+ if(!count($data)) return;
+
+ // limit results to 15 hits
+ $data = array_slice($data, 0, 15);
+ $data = array_map('trim',$data);
+ $data = array_map('noNS',$data);
+ $data = array_unique($data);
+ sort($data);
+
+ /* now construct a json */
+ $suggestions = array(
+ $query, // the original query
+ $data, // some suggestions
+ array(), // no description
+ array() // no urls
+ );
+ $json = new JSON();
+
+ header('Content-Type: application/x-suggestions+json');
+ print $json->encode($suggestions);
+}
+
+/**
* Refresh a page lock and save draft
*
* Andreas Gohr <andi@splitbrain.org>
diff --git a/lib/exe/opensearch.php b/lib/exe/opensearch.php
new file mode 100644
index 000000000..e23d16d20
--- /dev/null
+++ b/lib/exe/opensearch.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * DokuWiki OpenSearch creator
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @link http://www.opensearch.org/
+ * @author Mike Frysinger <vapier@gentoo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
+if(!defined('NOSESSION')) define('NOSESSION',true); // we do not use a session or authentication here (better caching)
+if(!defined('NL')) define('NL',"\n");
+require_once(DOKU_INC.'inc/init.php');
+
+// try to be clever about the favicon location
+if(file_exists(DOKU_INC.'favicon.ico')){
+ $ico = DOKU_URL.'favicon.ico';
+}elseif(DOKU_TPL.'images/favicon.ico'){
+ $ico = DOKU_URL.'lib/tpl/'.$conf['template'].'/images/favicon.ico';
+}elseif(DOKU_TPL.'favicon.ico'){
+ $ico = DOKU_URL.'lib/tpl/'.$conf['template'].'/favicon.ico';
+}else{
+ $ico = DOKU_URL.'lib/tpl/default/images/favicon.ico';
+}
+
+// output
+header('Content-Type: application/opensearchdescription+xml; charset=utf-8');
+echo '<?xml version="1.0"?>'.NL;
+echo '<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">'.NL;
+echo ' <ShortName>'.htmlspecialchars($conf['title']).'</ShortName>'.NL;
+echo ' <Image type="image/x-icon">'.$ico.'</Image>'.NL;
+echo ' <Url type="text/html" template="'.DOKU_URL.DOKU_SCRIPT.'?do=search&amp;id={searchTerms}" />'.NL;
+echo ' <Url type="application/x-suggestions+json" template="'.
+ DOKU_URL.'lib/exe/ajax.php?call=suggestions&amp;q={searchTerms}" />'.NL;
+echo '</OpenSearchDescription>'.NL;
+
+//Setup VIM: ex: et ts=4 enc=utf-8 :