From da96af357215605d855d6ce8ef8fb50ffb679641 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Fri, 10 Nov 2006 16:14:53 +0100
Subject: [PATCH] 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
---
 inc/template.php       |  2 ++
 lib/exe/ajax.php       | 51 ++++++++++++++++++++++++++++++++++++++++--
 lib/exe/opensearch.php | 38 +++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 lib/exe/opensearch.php

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');
@@ -67,6 +72,48 @@ function ajax_qsearch(){
   print '</ul>';
 }
 
+/**
+ * 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
  *
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 :
-- 
GitLab