4 * Copyright 1999, 2000, 2001, 2002 $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 along
20 * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 * OldStyleTable: Layout tables using the old table style.
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
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>></code>
39 * generates a right justified column, <code><</code> a left
40 * justified column and <code>^</code> a centered column
41 * (which is the default.)
43 * @author Geoffrey T. Dairiki
46 class WikiPlugin_OldStyleTable
51 return _("OldStyleTable");
54 function getDescription()
56 return _("Layout tables using the old markup style.");
59 function getDefaultArguments()
70 function handle_plugin_args_cruft($argstr, $args)
75 function run($dbi, $argstr, &$request, $basepage)
77 include_once 'lib/InlineParser.php';
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];
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];
95 $table_args[$arg] = $args[$arg];
97 $table = HTML::table($table_args);
99 $table->pushContent(HTML::caption($caption));
100 if (preg_match("/^\s*(cellpadding|cellspacing|border|caption|summary)/", $lines[0]))
102 foreach ($lines as $line) {
105 if (strstr($line, "=")) {
106 $tmp = explode("=", $line);
107 if (in_array(trim($tmp[0]), $default_args))
110 if ($line[0] != '|') {
111 // bogus error if argument
112 trigger_error(sprintf(_("Line %s does not begin with a '|'."), $line), E_USER_WARNING);
114 $table->pushContent($this->_parse_row($line, $basepage));
121 function _parse_row($line, $basepage)
123 $brkt_link = "\\[ .*? [^]\s] .*? \\]";
124 $cell_content = "(?: [^[] | " . ESCAPE_CHAR . "\\[ | $brkt_link )*?";
126 preg_match_all("/(\\|+) (v*) ([<>^]?) \s* ($cell_content) \s* (?=\\||\$)/x",
127 $line, $matches, PREG_SET_ORDER);
131 foreach ($matches as $m) {
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;
140 $attr['align'] = 'center';
141 else if ($m[3] == '>')
142 $attr['align'] = 'right';
144 $attr['align'] = 'left';
146 // Assume new-style inline markup.
147 $content = TransformInline($m[4], 2.0, $basepage);
149 $row->pushContent(HTML::td($attr, HTML::raw(' '),
150 $content, HTML::raw(' ')));
162 // c-hanging-comment-ender-p: nil
163 // indent-tabs-mode: nil