]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/UnfoldSubpages.php
Remove useless semicolon
[SourceForge/phpwiki.git] / lib / plugin / UnfoldSubpages.php
1 <?php
2
3 /*
4  * Copyright 2002,2004,2005 $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 /**
24  * UnfoldSubpages:  Lists the content of all SubPages of the current page.
25  *   This is e.g. useful for the CalendarPlugin, to see all entries at once.
26  *   Warning: Better don't use it with non-existant sections!
27  *              The section extractor is currently quite unstable.
28  * Usage:   <<UnfoldSubpages sortby=-mtime words=50 maxpages=5 >>
29  * Author:  Reini Urban <rurban@x-ray.at>
30  */
31
32 require_once 'lib/PageList.php';
33 require_once 'lib/TextSearchQuery.php';
34 require_once 'lib/plugin/IncludePage.php';
35
36 class WikiPlugin_UnfoldSubpages
37     extends WikiPlugin_IncludePage
38 {
39     function getName()
40     {
41         return _("UnfoldSubpages");
42     }
43
44     function getDescription()
45     {
46         return _("Includes the content of all SubPages of the current page.");
47     }
48
49     function getDefaultArguments()
50     {
51         return array_merge
52         (
53             PageList::supportedArgs(),
54             array(
55                 'pagename' => '[pagename]', // default: current page
56                 //'header'  => '',  // expandable string
57                 'quiet' => false, // print no header
58                 'sortby' => '', // [+|-]pagename, [+|-]mtime, [+|-]hits
59                 'maxpages' => false, // maximum number of pages to include (== limit)
60                 'smalltitle' => false, // if set, hide transclusion-title,
61                 //  just have a small link at the start of
62                 //  the page.
63                 'words' => false, // maximum number of words
64                 //  per page to include
65                 'lines' => false, // maximum number of lines
66                 //  per page to include
67                 'bytes' => false, // maximum number of bytes
68                 //  per page to include
69                 'sections' => false, // maximum number of sections per page to include
70                 'section' => false, // this named section per page only
71                 'sectionhead' => false // when including a named
72                 //  section show the heading
73             ));
74     }
75
76     function run($dbi, $argstr, &$request, $basepage)
77     {
78         static $included_pages = false;
79         if (!$included_pages) $included_pages = array($basepage);
80
81         $args = $this->getArgs($argstr, $request);
82         extract($args);
83         $query = new TextSearchQuery($pagename . SUBPAGE_SEPARATOR . '*', true, 'glob');
84         $subpages = $dbi->titleSearch($query, $sortby, $limit, $exclude);
85         //if ($sortby)
86         //    $subpages = $subpages->applyFilters(array('sortby' => $sortby, 'limit' => $limit, 'exclude' => $exclude));
87         //$subpages = explodePageList($pagename . SUBPAGE_SEPARATOR . '*', false,
88         //                            $sortby, $limit, $exclude);
89         if (is_string($exclude) and !is_array($exclude))
90             $exclude = PageList::explodePageList($exclude, false, false, $limit);
91         $content = HTML();
92
93         include_once 'lib/BlockParser.php';
94         $i = 0;
95         while ($page = $subpages->next()) {
96             $cpagename = $page->getName();
97             if ($maxpages and ($i++ > $maxpages)) {
98                 return $content;
99             }
100             if (in_array($cpagename, $exclude))
101                 continue;
102             // A page cannot include itself. Avoid doublettes.
103             if (in_array($cpagename, $included_pages)) {
104                 $content->pushContent(HTML::p(sprintf(_("Recursive inclusion of page %s ignored"),
105                     $cpagename)));
106                 continue;
107             }
108
109             // Check if user is allowed to get the Page.
110             if (!mayAccessPage('view', $cpagename)) {
111                 return $this->error(sprintf(_("Illegal inclusion of page %s: no read access"),
112                     $cpagename));
113             }
114
115             // trap any remaining nonexistant subpages
116             if ($page->exists()) {
117                 $r = $page->getCurrentRevision();
118                 $c = $r->getContent(); // array of lines
119                 // follow redirects
120                 if ((preg_match('/<' . '\?plugin\s+RedirectTo\s+page=(\S+)\s*\?' . '>/', implode("\n", $c), $m))
121                     or (preg_match('/<' . '\?plugin\s+RedirectTo\s+page=(.*?)\s*\?' . '>/', implode("\n", $c), $m))
122                     or (preg_match('/<<\s*RedirectTo\s+page=(\S+)\s*>>/', implode("\n", $c), $m))
123                     or (preg_match('/<<\s*RedirectTo\s+page="(.*?)"\s*>>/', implode("\n", $c), $m))
124                 ) {
125                     // Strip quotes (simple or double) from page name if any
126                     if ((string_starts_with($m[1], "'"))
127                         or (string_starts_with($m[1], "\""))
128                     ) {
129                         $m[1] = substr($m[1], 1, -1);
130                     }
131                     // trap recursive redirects
132                     if (in_array($m[1], $included_pages)) {
133                         if (!$quiet)
134                             $content->pushContent(
135                                 HTML::p(sprintf(_("Recursive inclusion of page %s ignored"),
136                                     $cpagename . ' => ' . $m[1])));
137                         continue;
138                     }
139                     $cpagename = $m[1];
140
141                     // Check if user is allowed to get the Page.
142                     if (!mayAccessPage('view', $cpagename)) {
143                         return $this->error(sprintf(_("Illegal inclusion of page %s: no read access"),
144                             $cpagename));
145                     }
146
147                     $page = $dbi->getPage($cpagename);
148                     $r = $page->getCurrentRevision();
149                     $c = $r->getContent(); // array of lines
150                 }
151
152                 // moved to IncludePage
153                 $ct = $this->extractParts($c, $cpagename, $args);
154
155                 array_push($included_pages, $cpagename);
156                 if ($smalltitle) {
157                     $pname = array_pop(explode(SUBPAGE_SEPARATOR, $cpagename)); // get last subpage name
158                     // Use _("%s: %s") instead of .": ". for French punctuation
159                     $ct = TransformText(sprintf(_("%s: %s"), "[$pname|$cpagename]",
160                             $ct),
161                         $r->get('markup'), $cpagename);
162                 } else {
163                     $ct = TransformText($ct, $r->get('markup'), $cpagename);
164                 }
165                 array_pop($included_pages);
166                 if (!$smalltitle) {
167                     $content->pushContent(HTML::p(array('class' => $quiet ?
168                             '' : 'transclusion-title'),
169                         fmt("Included from %s:",
170                             WikiLink($cpagename))));
171                 }
172                 $content->pushContent(HTML(HTML::div(array('class' => $quiet ?
173                         '' : 'transclusion'),
174                     false, $ct)));
175             }
176         }
177         if (!isset($cpagename)) {
178             return $this->error(sprintf(_("%s has no subpages defined."), $pagename));
179         }
180         return $content;
181     }
182 }
183
184
185
186 // Local Variables:
187 // mode: php
188 // tab-width: 8
189 // c-basic-offset: 4
190 // c-hanging-comment-ender-p: nil
191 // indent-tabs-mode: nil
192 // End: