123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php if (!defined('PmWiki')) exit();
- /* Copyright 2002-2004 Patrick R. Michaud (pmichaud@pobox.com)
- This file is part of PmWiki; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version. See pmwiki.php for full details.
- This script provides search capabilities for PmWiki. It is included
- by default from the stdconfig.php script unless disabled by
- $EnableSearch=0; in config.php.
- */
- XLSDV('en',array(
- 'SearchFor' => 'Results of searching for <em>$Needle</em>:',
- 'SearchFound' =>
- '$MatchCount pages found out of $MatchSearched pages searched.'
- ));
- SDV($HandleActions['search'],'HandleSearch');
- if (isset($EnablePathInfo) && !$EnablePathInfo)
- SDV($SearchTagFmt,"<form class='wikisearch' action='\$ScriptUrl'
- method='get'><input type='hidden' name='pagename'
- value='$[Main/SearchWiki]'><input class='wikisearchbox' type='text'
- name='text' value='\$Needle' size='40' /><input class='wikisearchbutton'
- type='submit' value='$[Search]' /></form>");
- SDV($SearchTagFmt,"<form class='wikisearch'
- action='\$ScriptUrl/$[Main/SearchWiki]' method='get'><input
- class='wikisearchbox' type='text' name='text' value='\$Needle'
- size='40' /><input class='wikisearchbutton' type='submit'
- value='$[Search]' /></form>");
- SDV($SearchResultsFmt,"$[SearchFor]
- $HTMLVSpace<dl class='wikisearch'>\$MatchList</dl>
- $HTMLVSpace$[SearchFound]$HTMLVSpace");
- SDV($PageSearchFmt,
- "<h1 class='wikiaction'>$[Search Results]</h1>\$SearchResults");
- SDV($SearchListItemFmt,'<dd><a href="$PageUrl">$Title</a></dd>');
- SDV($SearchListGroupFmt,'<dt><a href="$ScriptUrl/$Group">$Group</a> /</dt>');
- SDV($InlineReplacements['/\\[\\[\\$Search\\]\\]/e'],
- "FmtPageName(\$GLOBALS['SearchTagFmt'],\$pagename)");
- SDV($InlineReplacements['/\\[\\[\\$Searchresults\\]\\]/e'],
- "Keep(SearchResults(\$pagename))");
- foreach(array('group'=>'SearchGroup','text'=>'Needle') as $k=>$v) {
- $Search[$k]='';
- if (isset($_POST[$k])) $Search[$k]=stripmagic($_POST[$k]);
- if (isset($_GET[$k])) $Search[$k]=stripmagic($_GET[$k]);
- }
- if (preg_match("!^($GroupNamePattern)?/!i",$Search['text'],$match))
- $Search['group'] = $match[1];
- if ($action!='edit') {
- $Needle = str_replace('$','$',htmlentities($Search['text'],ENT_QUOTES));
- $SearchGroup = htmlentities($Search['group'],ENT_QUOTES);
- }
- function SearchResults($pagename) {
- global $Search,$WikiLibDirs,$GroupNamePattern,$SearchExcludePatterns,
- $SearchListItemFmt,$SearchListGroupFmt,$SearchResultsFmt,
- $GroupFreeLinkPattern,$PageNameSpace;
- if (!$Search['text']) return "";
- $matches = array(); $matchsearched = 0;
- $group = $Search['group'];
- $terms = preg_replace("!^($GroupNamePattern)?/!i","",$Search['text']);
- $terms = preg_split('/((?<!\\S)[-+]?[\'"].*?[\'"](?!\\S)|\\S+)/',$terms,-1,
- PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
- $excl = array(); $incl = array();
- foreach($terms as $t) {
- if (trim($t)=="") continue;
- preg_match('/^([-+]?)([\'"]?)(.+?)\\2$/',$t,$match);
- if ($match[1]=='-') $excl[] = $match[3];
- else $incl[] = $match[3];
- }
- $dirlist = (array)$WikiLibDirs;
- while (count($dirlist)>0) {
- $dir = array_shift($dirlist);
- $dfp = opendir($dir); if (!$dfp) continue;
- while (($pagefile=readdir($dfp))!=false) {
- if (substr($pagefile,0,1)=='.') continue;
- if (is_dir("$dir/$pagefile"))
- { array_push($dirlist,"$dir/$pagefile"); continue; }
- if (@$seen[$pagefile]++) continue;
- if ($group && strcasecmp(FmtPageName('$Group',$pagefile),$group)!=0)
- continue;
- if (isset($SearchExcludePatterns))
- foreach((array)$SearchExcludePatterns as $t)
- if (preg_match($t,$pagefile)) continue 2;
- $page = ReadPage($pagefile); Lock(0); if (!$page) continue;
- $matchsearched++;
- $text = $pagefile."\n".preg_replace("/$GroupFreeLinkPattern/e","'$0'.preg_replace('/\\s+/','$PageNameSpace',ucwords('$3'.'$4')).' '.'$3'.'$5'",$page['text']);
- foreach($excl as $t) if (stristr($text,$t)) continue 2;
- foreach($incl as $t) if (!stristr($text,$t)) continue 2;
- $matches[] = $pagefile;
- }
- closedir($dfp);
- }
- sort($matches); reset($matches);
- $MatchList = array();
- foreach($matches as $pagefile) {
- $pgroup = FmtPageName($SearchListGroupFmt,$pagefile);
- if ($pgroup!=@$lgroup) {
- $MatchList[] = $pgroup;
- $lgroup = $pgroup;
- }
- $MatchList[] = FmtPageName($SearchListItemFmt,$pagefile);
- }
- $GLOBALS['MatchList'] = join('',$MatchList);
- $GLOBALS['MatchCount'] = count($matches);
- $GLOBALS['MatchSearched'] = $matchsearched;
- $GLOBALS['SearchIncl'] = $incl;
- $GLOBALS['SearchExcl'] = $excl;
- $GLOBALS['GCount'] = 0;
- return FmtPageName($SearchResultsFmt,$pagename);
- }
- function HandleSearch($pagename) {
- global $HandleSearchFmt,$SearchResults,$CurrentTime;
- global $PageStartFmt,$PageSearchFmt,$PageEndFmt;
- $SearchResults = SearchResults($pagename);
- $GLOBALS['LastModified'] = $CurrentTime;
- $GLOBALS['LastModifiedBy'] = @$Author;
- $GLOBALS['HTMLTitle'] = 'Search Results';
- $GLOBALS['GCount'] = 0;
- SDV($HandleSearchFmt,array(&$PageStartFmt, &$PageSearchFmt, &$PageEndFmt));
- PrintFmt($pagename,$HandleSearchFmt);
- }
- ?>
|