array('fn' => 'FPLTemplateExtensions', 'fmt' => '#default', 'class' => 'fpltemplate'), 'bygroup' => array('fn' => 'FPLTemplateExtensions', 'template' => '#bygroup', 'class' => 'fplbygroup'), 'simple' => array('fn' => 'FPLTemplateExtensions', 'template' => '#simple', 'class' => 'fplsimple'), 'group' => array('fn' => 'FPLTemplateExtensions', 'template' => '#group', 'class' => 'fplgroup'), 'title' => array('fn' => 'FPLTemplateExtensions', 'template' => '#title', 'class' => 'fpltitle', 'order' => 'title'), )); ######################################################################## ## The function is a modified FPLTemplate from pagelist.php ######################################################################## function FPLTemplateExtensions($pagename, &$matches, $opt) { global $Cursor, $FPLFormatOpt, $FPLTemplatePageFmt; SDV($FPLTemplatePageFmt, array('{$FullName}', '{$SiteGroup}.LocalTemplates','{$SiteGroup}.PageListTemplates')); for($i=0; $i< count($opt); $i++) $args[$opt['#'][$i++]] = $opt['#'][$i]; $template = @$opt['template']; if (!$template) $template = @$opt['fmt']; list($tname, $qf) = explode('#', $template, 2); if ($tname) $tname = array(MakePageName($pagename, $tname)); else $tname = (array)$FPLTemplatePageFmt; foreach ($tname as $t) { $t = FmtPageName($t, $pagename); if (!PageExists($t)) continue; if ($qf) $t .= "#$qf"; $ttext = IncludeText($pagename, $t, true); if (!$qf || strpos($ttext, "[[#$qf]]") !== false) break; } ## remove any anchor markups to avoid duplications $ttext = preg_replace('/\\[\\[#[A-Za-z][-.:\\w]*\\]\\]/', '', $ttext); if (!@$opt['order'] && !@$opt['trail']) $opt['order'] = 'name'; $matches = array_values(MakePageListExtensions($pagename, $opt, 0)); $total = count($matches); if (@$opt['blank'] && $total ==0) { $text = IncludeText($pagename, $opt['blank']); $text = preg_replace('/\\{\\$\\$\\}/', $opt['o'], $text); $text = preg_replace('/\\{\\$\\$(\\w+)\\}/e', '$args["$1"]', $text); return $text; } // Prescan list foreach($matches as $i => $pn) { $group = PageVar($pn, '$Group'); if ($group != $lgroup) $grouptotal++; $lgroup = $group; } if (@$opt['count']) array_splice($matches, $opt['count']); if (@$opt['groupcount']) $groupmax = $opt['groupcount']; if (@$opt['pergroupcount']) $pergroupmax = $opt['pergroupcount']; $savecursor = $Cursor; $pagecount = 0; $groupcount = 0; $grouppagecount = 0; $vk = array('{$PageCount}', '{$GroupCount}', '{$GroupPageCount}', '{$PageTotal}', '{$GroupTotal}'); $vv = array(&$pagecount, &$groupcount, &$grouppagecount, $total, $grouptotal); $lgroup = ''; $out = ''; foreach($matches as $i => $pn) { $prev = (string)@$matches[$i-1]; $next = (string)@$matches[$i+1]; $Cursor['<'] = $Cursor['<'] = $prev; $Cursor['='] = $pn; $Cursor['>'] = $Cursor['>'] = $next; $group = PageVar($pn, '$Group'); if ($group != $lgroup) { $groupcount++; $grouppagecount = 0; } $grouppagecount++; $pagecount++; if($groupmax && $groupcount > $groupmax) break; if($pergroupmax && $grouppagecount > $pergroupmax) continue; $item = str_replace($vk, $vv, $ttext); $item = preg_replace('/\\{\\$\\$\\}/', $opt['o'], $item); $item = preg_replace('/\\{\\$\\$(\\w+)\\}/e', '$args["$1"]', $item); $item = preg_replace('/\\{(=|&[lg]t;)(\\$\\w+)\\}/e', "PageVar(\$pn, '$2', '$1')", $item); $out .= $item; $lgroup = $group; } $class = preg_replace('/[^-a-zA-Z0-9\\x80-\\xff]/', ' ', @$opt['class']); $div = ($class) ? "
" : '
'; return $div.MarkupToHTML($pagename, $out, array('escape' => 0)).'
'; } ######################################################################## ## The function is a modified MakePageList from pagelist.php ######################################################################## ## MakePageListExtensions generates a list of pages using the specifications given ## by $opt. function MakePageListExtensions($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']; } elseif (@$opt['targets']) { $pn = $opt['targets']; $page = ($readf >= 1000) ? RetrieveAuthPage($pn, 'read', false, READPAGE_CURRENT) : ReadPage($pn, READPAGE_CURRENT); $list = explode(",", $page['targets']); } 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