'30', 'button' => FmtPageName('$[Search]', $pagename), 'searchlabel' => FmtPageName('$[Search for]', $pagename), 'pageslabel' => FmtPageName('$[On pages]', $pagename), 'caselabel' => FmtPageName('$[Case sensitive search]', $pagename), 'prefix' => 'link', 'header' => 'full', )); // defaults array SDVA($TextExtractOpt, array ( 'markup' => 'code', 'unit' => 'line', 'highlight' => 'bold', 'case' => 0, 'error' => 1, )); // markup expression {(extract pattern pagename ...)} $MarkupExpr['extract'] = 'TextExtract($pagename, @$args, @$argp)'; // markup (:extract ....:) Markup('extractform', '>links','/\\(:extract(\\s.*?)?:\\)/e', "ExtractFormMarkup(\$pagename, ParseArgs(PSS('$1')))"); // markup (:extractresult:) Markup('extractresult','directives','/\\(:extractresult(s)?:\\)/e', "MarkupExtractResults(\$pagename)"); function MarkupExtractResults($pagename) { $out = MarkupToHTML($pagename, $GLOBALS['ExtractDisplayFmt']); //srip p tags from beginning and end, trim end space $out = rtrim(preg_replace("/^

(.*?)<\\/p>$/s","$1", $out)); return Keep($out); } // ?action=extract calls function HandleExtract() $HandleActions['extract'] = 'HandleExtract'; // extractor search form function ExtractFormMarkup($pagename, $opt) { global $ExtractFormOpt, $EnablePathInfo; $opt = array_merge($ExtractFormOpt, $opt); $opt['action'] = 'extract'; if(isset($opt['target'])) $target = MakePageName($pagename, $opt['target']); else $target = $pagename; $out = FmtPageName(" class='wikisearch' action='\$PageUrl' method='get'>", $target); $opt['n'] = IsEnabled($EnablePathInfo, 0) ? '' : $target; $out .= "\n"; $out .= " \n"; if (!isset($opt['page'])) { $out .= " \n"; } $out .= "
{$opt['searchlabel']}
{$opt['pageslabel']}
{$opt['caselabel']}"; $out .= "      
\n"; foreach($opt as $k => $v) { if ($v == '' || is_array($v)) continue; if ($k=='q' || $k=='label' || $k=='value' || $k=='size' || $k=='patlabel' || $k=='pagelabel') continue; $k = str_replace("'", "'", $k); $v = str_replace("'", "'", $v); $out .= " \n"; } return "

"; } // action=extract handler function HandleExtract($pagename) { global $ExtractDisplayFmt; $req = RequestArgs(); $args[] = $req['pattern']; $pgs1 = preg_split("/[\s,|]+/", $req['page'], -1, PREG_SPLIT_NO_EMPTY); $pgs2 = preg_split("/[\s,|]+/", $req['page2'], -1, PREG_SPLIT_NO_EMPTY); $args = array_merge($args, $pgs1, $pgs2); $text = TextExtract($pagename, $args, $req); $ExtractDisplayFmt = $text; HandleDispatch($pagename,'browse',''); } // main text extract processing function TextExtract($pagename, $args, $opt = NULL) { global $TextExtractOpt, $TextExtract, $FmtV, $FmtPV; if ($args[0]=='' && $args[1]=='') return ''; //start time #$stime = strtok(microtime(), ' ') + strtok(''); //clean input options, set default options unset($opt[''],$opt['#']); foreach($opt as $i => $v) if ($v=='' || strstr($v,'{$$')) unset($opt[$i]); $opt = array_merge($TextExtractOpt, $opt); //use first argument as regex text pattern $pat = array_shift($args); $exclpat = array("*","?","+","(",")","[","]","^","$","|","/","??","\\","//"); foreach($exclpat as $v) if($pat==$v) return '%red%Error: disallowed character input!'; //check & use query from PmWiki searchbox if(isset($FmtV['$Needle']) && $FmtV['$Needle']>0) { $pat = ltrim($FmtV['$Needle']); $opt['error'] = 0; } //case insensitive search if (@$opt['case']==1) $qi = ''; else $qi = 'i'; //suppress highlight for 'include everything' pattern if($pat=='.') $opt['highlight'] = ''; //create source pagelist $grp = PageVar($pagename, '$Group'); $exlist = array(); $srclist = array(); $plist = array(); if (isset($opt['group'])) $args[] = "{$opt['group']}.*"; if (isset($opt['name'])) $args[] = "*.{$opt['name']}"; foreach($args as $src) { $pgs = preg_split("/[\s,|]+/", $src, -1, PREG_SPLIT_NO_EMPTY); $plist = array_merge($plist, $pgs); } foreach($plist as $src) { //check for exclusions if($src{0}=='-') { $src = substr($src, 1); //check for group.name pattern if (strstr($src,'.')) $pgpat = $src; else $pgpat = $grp.".".$src; //make preg pattern from wildcard pattern $prpat = GlobToPCRE(FixGlob($pgpat)); //make list from preg name pattern $exlist = array_merge($exlist, ListPages("/$prpat[0]/")); } //check for section suffix elseif (strstr($src,'#')) $srclist[] = $src; //additions else { //check for group.name pattern if (strstr($src,'.')) $pgpat = $src; else $pgpat = $grp.".".$src; //make preg pattern from wildcard pattern $prpat = GlobToPCRE(FixGlob($pgpat)); //make list from preg name pattern $srclist = array_merge($srclist, ListPages("/$prpat[0]/")); } } $sourcelist = array_diff($srclist, $exlist); //don't order list if (pagelist ) input. (pagelist order= will be honoured) if (!isset($FmtV['$Needle'])) sort($sourcelist); $sourcecount = 0; #count($sourcelist); $pagecount = 0; /* DEBUG// ?>
$h) { if ($i=='0') continue; $hds[$i] = "!".$h; } foreach($hds as $i=>$h) { $par[$i] = preg_split("/(\n\n)/", $h, PREG_SPLIT_OFFSET_CAPTURE); $paras = array_merge($paras, $par[$i]); } $textrows = $paras; ##DEBUG## echo "
 \$paras "; print_r($paras); echo "
"; } foreach ($textrows as $row) { //skip pages which don't match if ($opt['unit']=='page' && !preg_match("/($pat)/".$qi, $text)) continue; //preserve empty rows for 'all including' pattern if ($opt['unit']=='line' && $row=="" && $pat==".") { $newrows[] = $row; continue; } //skip rows which don't match if ($opt['unit']=='line' && !preg_match("/($pat)/".$qi, $row)) continue; if ($opt['unit']=='para' && !preg_match("/($pat)/".$qi, $row)) continue; //process lines containing markup directives switch($opt['markup']) { case 'cut': if(preg_match("/\\(:/", $row, $mc)) continue 2; case 'on': if ($pat=="." || $opt['unit']=='page') break; case 'code': # $row = str_replace("(:redirect ", "(:redirect ", $row); $row = str_replace("<","<",$row); $row = str_replace(">",">",$row); $row = preg_replace("/^(!+)/",'!!!!!' , $row); $row = preg_replace("/\\{(\\(\\w+\\b.*?\\))\\}/", "{$1}", $row); $row = str_replace("(:","(:",$row); if(preg_match("/(\\[[@|=])|([@|=]\\])/", $row, $m00)) { $aa = preg_match_all("/\\[@/", $row, $maa); $bb = preg_match_all("/\\@]/", $row, $mbb); if ($aa>$bb) $row = $row."@]"; if ($aa<$bb) $row = "[@".$row; if (preg_match_all("/(\\[[@|=])[^\\]]*(\\(:)(.*?[@|=]\\])/", $row, $mp)) { foreach($mp[0] as $i => $v) { $v = str_replace("(:","(:",$v); $row = str_replace( $mp[0][$i], $v, $row); } } } break; } //exclude lines containing matches with cut pattern if ($opt['cut']!='') if(preg_match("/({$opt['cut']})/".$qi, $row)) continue; $row = ltrim($row); //check for & add prefix line if($opt['prefix']!='' && $pf==0) { if($opt['prefix']=='link' ) { $newrows[] = "(:spacer:)\\\\"; $newrows[] = "'''[[$source]]'''(:spacer:)"; } elseif($opt['prefix']=='linkmod' ) { $newrows[] = "(:spacer:)\\\\"; $lmod = PageVar($srcname,'$LastModified'); $lmby = PageVar($srcname,'$LastModifiedBy'); $newrows[] = "%rfloat%''last modified by [[~{$lmby}]] on {$lmod}'' %left%'''[[$source]]'''(:spacer:)"; } else $newrows[] = $opt['prefix']; } //check if textrow needs processing if($opt['snip']!='') $row = preg_replace("/{$opt['snip']}/", '', $row); //highlighting matches if($opt['highlight']=='bold') { if(preg_match_all("/(\\[[@|=])([^\\]]*)($pat)(.*?)([@|=]\\])/".$qi, $row, $mb)) { foreach($mb[0] as $i => $v) { if (strstr($v, "(:")) $v = str_replace(":",":",$v); if ($mb[1][$i]=='[@') $mbnew = preg_replace("/($pat)/".$qi, "@]'''$1'''[@", $v); else if ($mb[1][$i]=='[=') $mbnew = preg_replace("/($pat)/".$qi, "=] '''$1''' [=", $v); $row = str_replace( $mb[0][$i], $mbnew, $row); } } else $row = preg_replace("/($pat)/".$qi,"'''$1'''", $row); } $newrows[] = $row; if ($opt['unit']=='para') $newrows[] = "(:spacer:)"; $pf = 1; //set prefix marker } } $sourcecount++; if ($opt['suffix']!='') $newrows[] = $suffix; if($pf==1) $pagecount++; if (isset($opt['count'])) if ($pagecount == $opt['count']) break; } $newrows[] = "(:spacer:)"; //output text from array of rows $text = implode("\n", $newrows); //add header with result counter & timer switch($opt['header']) { default: $text = "{$opt['header']}\n".$text; break; case 'count': case 'counter': //count matches $cnt = preg_match_all("/($pat)/".$qi, $text, $m); $text = "'''Results: ".$cnt."''' \n----\n".$text; break; case 'all': case 'full': //count matches $cnt = preg_match_all("/($pat)/".$qi, $text, $m); //timer #$wtime = strtok(microtime(), ' ') + strtok('') - $stime; #$xtime = sprintf("%04.2f %s", $wtime, ''); //time in secs if ($pagecount>1) $from = "on {$pagecount} pages from {$sourcecount} pages searched"; if ($pagecount==1) $from = "from {$sourcecount} pages searched"; $text = "----\n[[#extracttop]]%lfloat%'''Text Extract''' %right%'''{$cnt} results'''    {$from}\n----\n".$text; $opt['footer'] = "\\\\\n\n----\n%center%'''End of Text Extract'''    [[#extracttop|(start)]] \n----"; break; } if ($opt['footer'] && $pagecount>0) { $text .= "\n{$opt['footer']}"; } if($pagecount==0 && $opt['error']==1) { $error = "\n%red%Found no matching pages!%%"; $text = $text.$error; } return $text; } //empty spacer div, normalise space for nolinebreaks and linebreaks conditions Markup('spacer', '"; } // to remove (:spacer:) markup, for use when writing output to a page, // use in form template with {$$cleanspacer (extract ....))} $MarkupExpr['cleanspacer'] = 'CleanSpacer($pagename, @$args[0])'; function CleanSpacer($pagename, $text) { $text = preg_replace("/\\(:spacer:\\)\\\*/", "", $text); return $text; }