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 summary=""
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
50 return _("OldStyleTable");
53 function getDescription() {
54 return _("Layout tables using the old markup style.");
57 function getDefaultArguments() {
67 function handle_plugin_args_cruft($argstr, $args) {
71 function run($dbi, $argstr, &$request, $basepage) {
72 include_once 'lib/InlineParser.php';
74 $args = $this->getArgs($argstr, $request);
75 $default = $this->getDefaultArguments();
76 foreach (array('cellpadding','cellspacing','border') as $arg) {
77 if (!is_numeric($args[$arg])) {
78 $args[$arg] = $default[$arg];
81 $lines = preg_split('/\s*?\n\s*/', $argstr);
82 $table_args = array();
83 $default_args = array_keys($default);
84 foreach ($default_args as $arg) {
85 if ($args[$arg] == '' and $default[$arg] == '')
86 continue; // ignore '' arguments
87 if ($arg == 'caption')
88 $caption = $args[$arg];
90 $table_args[$arg] = $args[$arg];
92 $table = HTML::table($table_args);
94 $table->pushContent(HTML::caption($caption));
95 if (preg_match("/^\s*(cellpadding|cellspacing|border|caption|summary)/", $lines[0]))
97 foreach ($lines as $line) {
100 if (strstr($line,"=")) {
101 $tmp = explode("=",$line);
102 if (in_array(trim($tmp[0]),$default_args))
105 if ($line[0] != '|') {
106 // bogus error if argument
107 trigger_error(sprintf(_("Line %s does not begin with a '|'."), $line), E_USER_WARNING);
109 $table->pushContent($this->_parse_row($line, $basepage));
116 function _parse_row ($line, $basepage) {
117 $brkt_link = "\\[ .*? [^]\s] .*? \\]";
118 $cell_content = "(?: [^[] | ".ESCAPE_CHAR."\\[ | $brkt_link )*?";
120 preg_match_all("/(\\|+) (v*) ([<>^]?) \s* ($cell_content) \s* (?=\\||\$)/x",
121 $line, $matches, PREG_SET_ORDER);
125 foreach ($matches as $m) {
128 if (strlen($m[1]) > 1)
129 $attr['colspan'] = strlen($m[1]);
130 if (strlen($m[2]) > 0)
131 $attr['rowspan'] = strlen($m[2]) + 1;
134 $attr['align'] = 'center';
135 else if ($m[3] == '>')
136 $attr['align'] = 'right';
138 $attr['align'] = 'left';
140 // Assume new-style inline markup.
141 $content = TransformInline($m[4], 2.0, $basepage);
143 $row->pushContent(HTML::td($attr, HTML::raw(' '),
144 $content, HTML::raw(' ')));
154 // c-hanging-comment-ender-p: nil
155 // indent-tabs-mode: nil