4 * Copyright 1999,2000,2001,2002,2004 $ThePhpWikiProgrammingTeam
5 * Copyright 2009 Marc-Etienne Vargenau, Alcatel-Lucent
7 * This file is part of PhpWiki.
9 * PhpWiki is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * PhpWiki is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with PhpWiki; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 * <?plugin PageGroup parent=MyTableOfContents ?>
30 * parent=MyTableOfContents
31 * label="Visit more pages in MyTableOfContents"
34 * <?plugin PageGroup parent=MyTableOfContents section=PartTwo loop=true ?>
36 * <?plugin PageGroup parent=MyTableOfContents loop=1 ?>
39 * Updated to use new HTML(). It mostly works, but it's still a giant hackish mess.
41 class WikiPlugin_PageGroup
45 return _("PageGroup");
48 function getDescription() {
49 return sprintf(_("PageGroup for %s"),'[pagename]');
52 function getVersion() {
53 return preg_replace("/[Revision: $]/", '',
57 function getDefaultArguments() {
61 'section' => _("Contents"),
67 // Stolen from IncludePage.php
68 function extractGroupSection ($section, $content, $page) {
69 $qsection = preg_replace('/\s+/', '\s+', preg_quote($section, '/'));
70 if (preg_match("/ ^(!{1,})\\s*$qsection" // section header
71 . " \\s*$\\n?" // possible blank lines
72 . " ( (?: ^.*\\n? )*? )" // some lines
73 . " (?= ^\\1 | \\Z)/xm", // sec header (same or higher level) (or EOF)
74 implode("\n", $content),
77 //FIXME: return list of Wiki_Pagename objects
78 foreach (explode("\n", $match[2]) as $line) {
80 // Strip trailing blanks lines and ---- <hr>s
81 $text = preg_replace("/\\s*^-{4,}\\s*$/", "", $text);
82 // Strip leading list chars: * or #
83 $text = preg_replace("/^[\*#]+\s*(\S.+)$/", "\\1", $text);
84 // Strip surrounding []
85 // FIXME: parse [ name | link ]
86 $text = preg_replace("/^\[\s*(\S.+)\s*\]$/", "\\1", $text);
92 return array(sprintf(_("<%s: no such section>"), $page ." ". $section));
95 function run($dbi, $argstr, &$request, $basepage) {
97 $args = $this->getArgs($argstr, $request);
100 // FIXME: WikiPlugin has no way to report when
101 // required args are missing?
102 $error_text = sprintf("%s: ", "WikiPlugin_" .$this->getName());
103 $error_text .= sprintf(_("A required argument '%s' is missing."), 'parent');
104 return HTML::div(array('class' => "error"), $error_text);
106 $directions = array ('next' => _("Next"),
107 'previous' => _("Previous"),
108 'contents' => _("Contents"),
109 'first' => _("First"),
114 $sep = $WikiTheme->getButtonSeparator();
116 $sep = " | "; // force some kind of separator
120 $label = $WikiTheme->makeLinkButton($parent);
122 // This is where the list extraction occurs from the named
123 // $section on the $parent page.
125 $p = $dbi->getPage($parent);
127 $r = $p->getRevision($rev);
129 $this->error(sprintf(_("%s(%d): no such revision"), $parent,
134 $r = $p->getCurrentRevision();
137 $c = $r->getContent();
138 $c = $this->extractGroupSection($section, $c, $parent);
140 $pagename = $request->getArg('pagename');
142 // The ordered list of page names determines the page
143 // ordering. Right now it doesn't work with a WikiList, only
144 // normal lines of text containing the page names.
146 $thispage = array_search($pagename, $c);
148 $go = array ('previous','next');
150 $links->pushcontent($label);
151 $links->pushcontent(" [ "); // an experiment
152 $lastindex = count($c) - 1; // array is 0-based, count is 1-based!
154 foreach ( $go as $go_item ) {
155 //yuck this smells, needs optimization.
156 if ($go_item == 'previous') {
158 if ($thispage == 0) {
159 $linkpage = $c[$lastindex];
161 $linkpage = $c[$thispage - 1];
163 // mind the French : punctuation
164 $text = fmt("%s: %s", $directions[$go_item],
165 $WikiTheme->makeLinkButton($linkpage));
166 $links->pushcontent($text);
167 $links->pushcontent($sep); // this works because
168 // there are only 2 go
169 // items, previous,next
171 if ($thispage == 0) {
174 $linkpage = $c[$thispage - 1];
175 $text = fmt("%s: %s", $directions[$go_item],
176 $WikiTheme->makeLinkButton($linkpage));
177 $links->pushcontent($text);
178 $links->pushcontent($sep); //this works
184 } else if ($go_item == 'next') {
186 if ($thispage == $lastindex) {
189 $linkpage = $c[$thispage + 1];
191 $text = fmt("%s: %s", $directions[$go_item],
192 $WikiTheme->makeLinkButton($linkpage));
194 if ($thispage == $lastindex) {
197 $linkpage = $c[$thispage + 1];
198 $text = fmt("%s: %s", $directions[$go_item],
199 $WikiTheme->makeLinkButton($linkpage));
202 $links->pushcontent($text);
205 $links->pushcontent(" ] "); // an experiment
214 // c-hanging-comment-ender-p: nil
215 // indent-tabs-mode: nil