function MakePageList($pagename, $opt, $retpages = 1) { global $MakePageListOpt, $SearchPatterns, $EnablePageListProtect, $PCache, $FmtV; StopWatch('MakePageList begin'); SDVA($MakePageListOpt, array('list' => 'default')); $opt = array_merge((array) $MakePageListOpt, $opt); $readf = @$opt['readf']; # we have to read the page if order= is anything but name $order = @$opt['order']; $readf |= $order && $order != 'name' && $order != '-name'; $pats = @(array) $SearchPatterns[$opt['list']]; if (@$opt['group']) { $pats[] = FixGlob($opt['group'], '$1$2.*'); } if (@$opt['name']) { $pats[] = FixGlob($opt['name'], '$1*.$2'); } # inclp/exclp contain words to be included/excluded. $incl = array(); $inclp = array(); $inclx = false; $excl = array(); $exclp = ''; foreach ((array) @$opt[''] as $i) { $incl[] = $i; } foreach ((array) @$opt['+'] as $i) { $incl[] = $i; } foreach ((array) @$opt['-'] as $i) { $excl[] = $i; } foreach ($incl as $i) { $inclp[] = '$' . preg_quote($i) . '$i'; $inclx |= preg_match('[^\\w\\x80-\\xff]', $i); } if ($excl) { $exclp = '$' . implode('|', array_map('preg_quote', $excl)) . '$i'; } $searchterms = count($incl) + count($excl); $readf += $searchterms; # forced read if incl/excl if (@$opt['trail']) { $trail = ReadTrail($pagename, $opt['trail']); $list = array(); foreach ($trail as $tstop) { $pn = $tstop['pagename']; $list[] = $pn; $tstop['parentnames'] = array(); PCache($pn, $tstop); } foreach ($trail as $tstop) { $PCache[$tstop['pagename']]['parentnames'][] = @$trail[$tstop['parent']]['pagename']; } } else { $list = ListPages($pats); } if (IsEnabled($EnablePageListProtect, 1)) { $readf = 1000; } $matches = array(); $FmtV['$MatchSearched'] = count($list); $terms = $incl ? PageIndexTerms($incl) : array(); if (@$opt['link']) { $link = MakePageName($pagename, $opt['link']); $linkp = "/(^|,){$link}(,|\$)/i"; $terms[] = " {$link} "; $readf++; } if ($terms) { $xlist = PageIndexGrep($terms, true); $a = count($list); $list = array_diff($list, $xlist); $a -= count($list); StopWatch("MakePageList: PageIndex filtered {$a} pages"); } $xlist = array(); StopWatch('MakePageList scanning ' . count($list) . " pages, readf={$readf}"); foreach ((array) $list as $pn) { if ($readf) { $page = $readf >= 1000 ? RetrieveAuthPage($pn, 'read', false, READPAGE_CURRENT) : ReadPage($pn, READPAGE_CURRENT); if (!$page) { continue; } if (@$linkp && !preg_match($linkp, @$page['targets'])) { $xlist[] = $pn; continue; } if ($searchterms) { $text = $pn . "\n" . @$page['targets'] . "\n" . @$page['text']; if ($exclp && preg_match($exclp, $text)) { continue; } foreach ($inclp as $i) { if (!preg_match($i, $text)) { if (!$inclx) { $xlist[] = $pn; } continue 2; } } } $page['size'] = strlen(@$page['text']); } else { $page = array(); } $page['pagename'] = $page['name'] = $pn; PCache($pn, $page); $matches[] = $pn; } StopWatch('MakePageList sort'); if ($order) { SortPageList($matches, $order); } if ($xlist) { register_shutdown_function('flush'); register_shutdown_function('PageIndexUpdate', $xlist, getcwd()); } StopWatch('MakePageList end'); if ($retpages) { for ($i = 0; $i < count($matches); $i++) { $matches[$i] =& $PCache[$matches[$i]]; } } return $matches; }
function PageListTermsTargets(&$list, &$opt, $pn, &$page) { global $FmtV; static $reindex = array(); $fold = $GLOBALS['StrFoldFunction']; switch ($opt['=phase']) { case PAGELIST_PRE: $FmtV['$MatchSearched'] = count($list); $incl = array(); $excl = array(); foreach((array)@$opt[''] as $i) { $incl[] = $fold($i); } foreach((array)@$opt['+'] as $i) { $incl[] = $fold($i); } foreach((array)@$opt['-'] as $i) { $excl[] = $fold($i); } $indexterms = PageIndexTerms($incl); foreach($incl as $i) { $delim = (!preg_match('/[^\\w\\x80-\\xff]/', $i)) ? '$' : '/'; $opt['=inclp'][] = $delim . preg_quote($i,$delim) . $delim . 'i'; } if ($excl) $opt['=exclp'][] = '$'.implode('|', array_map('preg_quote',$excl)).'$i'; if (@$opt['link']) { $link = MakePageName($pn, $opt['link']); $opt['=linkp'] = "/(^|,)$link(,|$)/i"; $indexterms[] = " $link "; } if (@$opt['=cached']) return 0; if ($indexterms) { StopWatch("PageListTermsTargets begin count=".count($list)); $xlist = PageIndexGrep($indexterms, true); $list = array_diff($list, $xlist); StopWatch("PageListTermsTargets end count=".count($list)); } if (@$opt['=inclp'] || @$opt['=exclp'] || @$opt['=linkp']) return PAGELIST_ITEM|PAGELIST_POST; return 0; case PAGELIST_ITEM: if (!$page) { $page = ReadPage($pn, READPAGE_CURRENT); $opt['=readc']++; } if (!$page) return 0; if (@$opt['=linkp'] && !preg_match($opt['=linkp'], @$page['targets'])) { $reindex[] = $pn; return 0; } if (@$opt['=inclp'] || @$opt['=exclp']) { $text = $fold($pn."\n".@$page['targets']."\n".@$page['text']); foreach((array)@$opt['=exclp'] as $i) if (preg_match($i, $text)) return 0; foreach((array)@$opt['=inclp'] as $i) if (!preg_match($i, $text)) { if ($i{0} == '$') $reindex[] = $pn; return 0; } } return 1; case PAGELIST_POST: if ($reindex) PageIndexQueueUpdate($reindex); $reindex = array(); return 0; } }
function PageListTermsTargets(&$list, &$opt, $pn, &$page) { global $FmtV; switch ($opt['=phase']) { case PAGELIST_PRE: $FmtV['$MatchSearched'] = count($list); $incl = array(); $excl = array(); foreach ((array) @$opt[''] as $i) { $incl[] = $i; } foreach ((array) @$opt['+'] as $i) { $incl[] = $i; } foreach ((array) @$opt['-'] as $i) { $excl[] = $i; } $indexterms = PageIndexTerms($incl); foreach ($incl as $i) { $delim = !preg_match('/[^\\w\\x80-\\xff]/', $i) ? '$' : '/'; $opt['=inclp'][] = $delim . preg_quote($i, $delim) . $delim . 'i'; } if ($excl) { $opt['=exclp'][] = '$' . implode('|', array_map('preg_quote', $excl)) . '$i'; } if (@$opt['link']) { $link = MakePageName($pn, $opt['link']); $opt['=linkp'] = "/(^|,){$link}(,|\$)/i"; $indexterms[] = " {$link} "; } if (@$opt['=cached']) { return 0; } if ($indexterms) { StopWatch("PageListTermsTargets begin count=" . count($list)); $xlist = PageIndexGrep($indexterms, true); $list = array_diff($list, $xlist); StopWatch("PageListTermsTargets end count=" . count($list)); } if (@$opt['=inclp'] || @$opt['=exclp'] || @$opt['=linkp']) { return PAGELIST_ITEM | PAGELIST_POST; } return 0; case PAGELIST_ITEM: if (!$page) { $page = ReadPage($pn, READPAGE_CURRENT); $opt['=readc']++; } if (!$page) { return 0; } if (@$opt['=linkp'] && !preg_match($opt['=linkp'], @$page['targets'])) { $opt['=reindex'][] = $pn; return 0; } if (@$opt['=inclp'] || @$opt['=exclp']) { $text = $pn . "\n" . @$page['targets'] . "\n" . @$page['text']; foreach ((array) @$opt['=exclp'] as $i) { if (preg_match($i, $text)) { return 0; } } foreach ((array) @$opt['=inclp'] as $i) { if (!preg_match($i, $text)) { if ($i[0] == '$') { $opt['=reindex'][] = $pn; } return 0; } } } return 1; case PAGELIST_POST: if (@$opt['=reindex']) { register_shutdown_function('PageIndexUpdate', $opt['=reindex'], getcwd()); } return 0; } }