* * Add OpenSearch autodiscovery & suggestions to PmWiki * * Developed and tested using PmWiki 2.2.0, * * To install, first add the following to your config file, * adjusted for your configuration: include_once("$FarmD/cookbook/opensearch.php"); * For more information, please see the online documentation at * http://www.pmwiki.org/wiki/Cookbook/OpenSearch * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * Version 2, as published by the Free Software Foundation. * http://www.gnu.org/copyleft/gpl.html */ $RecipeInfo['OpenSearch']['Version'] = '2009-02-20'; SDV( $OpenSearchUrl, $ScriptUrl ); $HTMLHeaderFmt['opensearch'] = "\n'; if ( !in_array( $action, array( 'search', 'suggest', 'opensearchdescription' ) ) ) return; $HandleActions['search'] = 'HandleSuggestedSearch'; // default 'HandleSearchA' $HandleActions['suggest'] = 'HandleSuggest'; $HandleAuth['suggest'] = 'read'; $HandleActions['opensearchdescription'] = 'HandleOpenSearchDescription'; $HandleAuth['opensearchdescription'] = 'read'; function HandleSuggestedSearch( $pagename, $level = 'read' ) { $rq = htmlspecialchars(stripmagic(@$_REQUEST['q']), ENT_NOQUOTES); if ( $rq && ( substr_count( $rq, '.' ) == 1 ) && PageExists($rq) ) Redirect($rq); HandleSearchA( $pagename, $level ); } function HandleOpenSearchDescription( $pagename, $level = 'read' ) { global $WikiTitle, $Charset, $OpenSearchData, $OpenSearchUrl; header("Content-type: application/opensearchdescription+xml; charset=UTF-8"); // see http://www.opensearch.org/Specifications/OpenSearch/1.1 for all valid elements SDVA( $OpenSearchData, array( 'ShortName' => substr( $WikiTitle, 0, 16 ), 'Description' => "Search $WikiTitle" ) ); echo "\n $ScriptUrl\n"; foreach( $OpenSearchData as $k => $v ) { if ( $Charset != 'UTF-8' ) $v = mb_convert_encoding( $v, 'UTF-8', $Charset ); if ( ( $k == 'Image' ) && !strcasecmp( substr( $v, -3 ), 'ico' ) ) echo "\t".''.$v."\n"; else echo "\t<$k>$v\n"; } echo ''; } function HandleSuggest( $pagename, $level = 'read' ) { global $Charset, $SearchPatterns, $OpenSearchSuggestMaxResults; SDV( $OpenSearchSuggestMaxResults, 10 ); $rq = htmlspecialchars( stripmagic(@$_REQUEST['q']), ENT_NOQUOTES ); $json[0] = $rq; $json[1] = array(); if ($rq) { $ls = ListPages( "/$rq/i" ); if ($ls) { sort($ls); $group_begins = preg_grep( "/^$rq/i", $ls ); $name_begins = preg_grep( "/\.$rq/i", $ls ); $casematch = preg_grep( "/^$rq/", $ls ); $doubles = strlen($rq)>1 ? preg_grep( "/$rq.*$rq/i", $ls ) : array(); $ls = array_slice(array_unique(array_merge( $group_begins, $name_begins, $casematch, $doubles, $ls )), 0, $OpenSearchSuggestMaxResults ); $json[1] = $ls; foreach ( array( 2=>'$Title', 3=>'$PageUrl' ) as $i => $var ) foreach( $ls as $pn ) { $json[$i][] = PageVar( $pagename, $var, $pn ); } } } header("Content-type: application/x-suggestions+json; charset=$Charset"); //echo json_encode($json); echo '['; foreach( $json as $i => $a ) { if ($i) echo ','; $a = str_replace( array('\\','"'), array('\\\\','\\"'), $a ); if (is_array($a)) { echo '['; foreach( $a as $j => $s ) { if ($j) echo ','; echo '"'.$s.'"'; } echo ']'; } else echo '"'.$a.'"'; } echo ']'; exit; }