From 0dc92c6f78995331021c3b8c6a889913cf3f7de3 Mon Sep 17 00:00:00 2001 From: Andreas Gohr <gohr@cosmocode.de> Date: Thu, 3 Nov 2005 11:17:26 +0100 Subject: [PATCH] hidepages configoption This new option accepts a RegExp to filter certain pages from all automatic listings (RSS, recent changes, search results, index). This is useful to exclude certain pages like the ones used in the sitebar templates. The regexp is matched against the full page ID with a leading colon. If it matches the page is assumed to be a hidden one. IMPORTANT: this is not related to ACL. A hidden page is still visible to all users (if not restricted by ACL) when linked or called directly. darcs-hash:20051103101726-6e07b-8d45912a1b4f6cfc9e3fce147c15f84a58ea7ca2.gz --- conf/dokuwiki.php | 1 + inc/common.php | 3 +++ inc/fulltext.php | 13 ++++++++++--- inc/pageutils.php | 24 ++++++++++++++++++++++++ inc/search.php | 8 +++++++- inc/template.php | 2 ++ 6 files changed, 47 insertions(+), 4 deletions(-) diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php index 2d89d1cde..65383017c 100644 --- a/conf/dokuwiki.php +++ b/conf/dokuwiki.php @@ -79,6 +79,7 @@ $conf['spellchecker']= 0; //enable Spellchecker (needs PHP >= 4.3 $conf['subscribers'] = 0; //enable change notice subscription support $conf['pluginmanager'] = 0; //enable automated plugin management (requires plugin) $conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0 +$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes $conf['rss_type'] = 'rss1'; //type of RSS feed to provide, by default: // 'rss' - RSS 0.91 // 'rss1' - RSS 1.0 diff --git a/inc/common.php b/inc/common.php index 4e8dd1f85..4092eb766 100644 --- a/inc/common.php +++ b/inc/common.php @@ -660,6 +660,9 @@ function _handleRecent($line,$ns,$flags){ // remember in seen to skip additional sights $seen[$id] = 1; + // check if it's a hidden page + if(isHiddenPage($id)) return false; + // filter namespace if (($ns) && (strpos($id,$ns.':') !== 0)) return false; diff --git a/inc/fulltext.php b/inc/fulltext.php index 4d4b8138c..f48250548 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -44,6 +44,11 @@ function ft_pageSearch($query,&$poswords){ } if(!count($docs)) return array(); + // create a list of hidden pages in the result + $hidden = array(); + $hidden = array_filter(array_keys($docs),'isHiddenPage'); + $not = array_merge($not,$hidden); + // remove negative matches foreach($not as $n){ unset($docs[$n]); @@ -95,13 +100,14 @@ function ft_backlinks($id){ // quick lookup of the pagename $page = noNS($id); $sw = array(); // we don't use stopwords here - $matches = idx_lookup(idx_tokenizer($page,$sw)); //pagename may contain specials (_ or .) - $docs = ft_resultCombine(array_values($matches)); + $matches = idx_lookup(idx_tokenizer($page,$sw)); // pagename may contain specials (_ or .) + $docs = array_keys(ft_resultCombine(array_values($matches))); + $docs = array_filter($docs,'isVisiblePage'); // discard hidden pages if(!count($docs)) return $result; require_once(DOKU_INC.'inc/parserutils.php'); // check instructions for matching links - foreach(array_keys($docs) as $match){ + foreach($docs as $match){ $instructions = p_cached_instructions(wikiFN($match),true); if(is_null($instructions)) continue; @@ -161,6 +167,7 @@ function ft_pageLookup($id,$pageonly=true){ } } + $pages = array_filter($pages,'isVisiblePage'); // discard hidden pages if(!count($pages)) return array(); // check ACL permissions diff --git a/inc/pageutils.php b/inc/pageutils.php index 1dc66981d..0f9b47e47 100644 --- a/inc/pageutils.php +++ b/inc/pageutils.php @@ -301,4 +301,28 @@ function getCacheName($data,$ext=''){ return $file; } +/** + * Checks a pageid against $conf['hidepages'] + * + * @author Andreas Gohr <gohr@cosmocode.de> + */ +function isHiddenPage($id){ + global $conf; + if(empty($conf['hidepages'])) return false; + + if(preg_match('/'.$conf['hidepages'].'/ui',':'.$id)){ + return true; + } + return false; +} + +/** + * Reverse of isHiddenPage + * + * @author Andreas Gohr <gohr@cosmocode.de> + */ +function isVisiblePage($id){ + return !isHiddenPage($id); +} + //Setup VIM: ex: et ts=2 enc=utf-8 : diff --git a/inc/search.php b/inc/search.php index ffe85adc1..4000c445d 100644 --- a/inc/search.php +++ b/inc/search.php @@ -125,8 +125,14 @@ function search_index(&$data,$base,$file,$type,$lvl,$opts){ return false; } - //check ACL $id = pathID($file); + + //check hidden + if($type=='f' && isHiddenPage($id)){ + return false; + } + + //check ACL if($type=='f' && auth_quickaclcheck($id) < AUTH_READ){ return false; } diff --git a/inc/template.php b/inc/template.php index 302d9d1f5..71bb64b4c 100644 --- a/inc/template.php +++ b/inc/template.php @@ -905,6 +905,8 @@ function tpl_indexerWebBug(){ global $INFO; if(!$INFO['exists']) return; + if(isHiddenPage($ID)) return; //no need to index hidden pages + $p = array(); $p['src'] = DOKU_BASE.'lib/exe/indexer.php?id='.urlencode($ID). '&'.time(); -- GitLab