]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/OldStyleTable.php
No underscore for private function
[SourceForge/phpwiki.git] / lib / plugin / OldStyleTable.php
1 <?php
2
3 /**
4  * Copyright 1999, 2000, 2001, 2002 $ThePhpWikiProgrammingTeam
5  * Copyright 2009 Marc-Etienne Vargenau, Alcatel-Lucent
6  *
7  * This file is part of PhpWiki.
8  *
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.
13  *
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.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23
24 /**
25  * OldStyleTable: Layout tables using the old table style.
26  *
27  * Usage:
28  * <pre>
29  *  <<OldStyleTable border||=0
30  *  ||  __Name__               |v __Cost__   |v __Notes__
31  *  | __First__   | __Last__
32  *  |> Jeff       |< Dairiki   |^  Cheap     |< Not worth it
33  *  |> Marco      |< Polo      | Cheaper     |< Not available
34  *  >>
35  * </pre>
36  *
37  * Note that multiple <code>|</code>'s lead to spanned columns,
38  * and <code>v</code>'s can be used to span rows.  A <code>&gt;</code>
39  * generates a right justified column, <code>&lt;</code> a left
40  * justified column and <code>^</code> a centered column
41  * (which is the default.)
42  *
43  * @author Geoffrey T. Dairiki
44  */
45
46 class WikiPlugin_OldStyleTable
47     extends WikiPlugin
48 {
49     function getName()
50     {
51         return _("OldStyleTable");
52     }
53
54     function getDescription()
55     {
56         return _("Layout tables using the old markup style.");
57     }
58
59     function getDefaultArguments()
60     {
61         return array(
62             'caption' => '',
63             'cellpadding' => '1',
64             'cellspacing' => '1',
65             'border' => '1',
66             'summary' => '',
67         );
68     }
69
70     function handle_plugin_args_cruft($argstr, $args)
71     {
72         return;
73     }
74
75     function run($dbi, $argstr, &$request, $basepage)
76     {
77         include_once 'lib/InlineParser.php';
78
79         $args = $this->getArgs($argstr, $request);
80         $default = $this->getDefaultArguments();
81         foreach (array('cellpadding', 'cellspacing', 'border') as $arg) {
82             if (!is_numeric($args[$arg])) {
83                 $args[$arg] = $default[$arg];
84             }
85         }
86         $lines = preg_split('/\s*?\n\s*/', $argstr);
87         $table_args = array();
88         $default_args = array_keys($default);
89         foreach ($default_args as $arg) {
90             if ($args[$arg] == '' and $default[$arg] == '')
91                 continue; // ignore '' arguments
92             if ($arg == 'caption')
93                 $caption = $args[$arg];
94             else
95                 $table_args[$arg] = $args[$arg];
96         }
97         $table = HTML::table($table_args);
98         if (!empty($caption))
99             $table->pushContent(HTML::caption($caption));
100         if (preg_match("/^\s*(cellpadding|cellspacing|border|caption|summary)/", $lines[0]))
101             $lines[0] = '';
102         foreach ($lines as $line) {
103             if (!$line)
104                 continue;
105             if (strstr($line, "=")) {
106                 $tmp = explode("=", $line);
107                 if (in_array(trim($tmp[0]), $default_args))
108                     continue;
109             }
110             if ($line[0] != '|') {
111                 // bogus error if argument
112                 trigger_error(sprintf(_("Line %s does not begin with a '|'."), $line), E_USER_WARNING);
113             } else {
114                 $table->pushContent($this->parse_row($line, $basepage));
115             }
116         }
117
118         return $table;
119     }
120
121     private function parse_row($line, $basepage)
122     {
123         $bracket_link = "\\[ .*? [^]\s] .*? \\]";
124         $cell_content = "(?: [^[] | " . ESCAPE_CHAR . "\\[ | $bracket_link )*?";
125
126         preg_match_all("/(\\|+) (v*) ([<>^]?) \s* ($cell_content) \s* (?=\\||\$)/x",
127             $line, $matches, PREG_SET_ORDER);
128
129         $row = HTML::tr();
130
131         foreach ($matches as $m) {
132             $attr = array();
133
134             if (strlen($m[1]) > 1)
135                 $attr['colspan'] = strlen($m[1]);
136             if (strlen($m[2]) > 0)
137                 $attr['rowspan'] = strlen($m[2]) + 1;
138
139             if ($m[3] == '^')
140                 $attr['align'] = 'center';
141             else if ($m[3] == '>')
142                 $attr['align'] = 'right';
143             else
144                 $attr['align'] = 'left';
145
146             // Assume new-style inline markup.
147             $content = TransformInline($m[4], 2.0, $basepage);
148
149             $row->pushContent(HTML::td($attr, HTML::raw('&nbsp;'),
150                 $content, HTML::raw('&nbsp;')));
151         }
152         return $row;
153     }
154 }
155
156 // Local Variables:
157 // mode: php
158 // tab-width: 8
159 // c-basic-offset: 4
160 // c-hanging-comment-ender-p: nil
161 // indent-tabs-mode: nil
162 // End: