]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/LikePages.php
Whitespace only
[SourceForge/phpwiki.git] / lib / plugin / LikePages.php
1 <?php
2
3 /**
4  * Copyright 1999, 2000, 2001, 2002 $ThePhpWikiProgrammingTeam
5  *
6  * This file is part of PhpWiki.
7  *
8  * PhpWiki is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * PhpWiki is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22
23 require_once 'lib/TextSearchQuery.php';
24 require_once 'lib/PageList.php';
25
26 class WikiPlugin_LikePages
27 extends WikiPlugin
28 {
29     function getName() {
30         return _("LikePages");
31     }
32
33     function getDescription() {
34         return sprintf(_("List page names which share an initial or final title word with '%s'."),
35                        '[pagename]');
36     }
37
38     function getDefaultArguments() {
39         return array_merge
40             (
41              PageList::supportedArgs(),
42              array('page'     => '[pagename]',
43                    'prefix'   => false,
44                    'suffix'   => false,
45                    'noheader' => false,
46                    ));
47     }
48     // info arg allows multiple columns
49     // info=mtime,hits,summary,version,author,locked,minor
50     // exclude arg allows multiple pagenames exclude=HomePage,RecentChanges
51
52     function run($dbi, $argstr, &$request, $basepage) {
53         $args = $this->getArgs($argstr, $request);
54
55         extract($args);
56         if (empty($page) && empty($prefix) && empty($suffix))
57             return '';
58
59         if ($prefix) {
60             $suffix = false;
61             $descrip = fmt("Page names with prefix '%s'", $prefix);
62         }
63         elseif ($suffix) {
64             $descrip = fmt("Page names with suffix '%s'", $suffix);
65         }
66         elseif ($page) {
67             $words = preg_split('/[\s:-;.,]+/',
68                                 SplitPagename($page));
69             $words = preg_grep('/\S/', $words);
70
71             $prefix = reset($words);
72             $suffix = end($words);
73
74             $descrip = fmt("These pages share an initial or final title word with '%s'",
75                            WikiLink($page, 'auto'));
76         }
77
78         // Search for pages containing either the suffix or the prefix.
79         $search = $match = array();
80         if (!empty($prefix)) {
81             $search[] = $this->_quote($prefix);
82             $match[]  = '^' . preg_quote($prefix, '/');
83         }
84         if (!empty($suffix)) {
85             $search[] = $this->_quote($suffix);
86             $match[]  = preg_quote($suffix, '/') . '$';
87         }
88
89         if ($search)
90             $query = new TextSearchQuery(join(' OR ', $search));
91         else
92             $query = new NullTextSearchQuery; // matches nothing
93
94         $match_re = '/' . join('|', $match) . '/';
95
96         $pagelist = new PageList($info, $exclude, $args);
97         if (!$noheader)
98             $pagelist->setCaption($descrip);
99         $pages = $dbi->titleSearch($query);
100         while ($page = $pages->next()) {
101             $name = $page->getName();
102             if (!preg_match($match_re, $name))
103                 continue;
104             $pagelist->addPage($page);
105         }
106
107         return $pagelist;
108     }
109
110     function _quote($str) {
111         return "'" . str_replace("'", "''", $str) . "'";
112     }
113 };
114
115 // Local Variables:
116 // mode: php
117 // tab-width: 8
118 // c-basic-offset: 4
119 // c-hanging-comment-ender-p: nil
120 // indent-tabs-mode: nil
121 // End: