xref: /plugin/tablewidth/syntax.php (revision 57d54688d73fbcc5f3935a6a08fb29fb692f6fcf)
1d0a907abSMykola Ostrovskyy<?php
2d0a907abSMykola Ostrovskyy
3d0a907abSMykola Ostrovskyy/**
4d0a907abSMykola Ostrovskyy * Plugin TableWidth
5d0a907abSMykola Ostrovskyy *
6d0a907abSMykola Ostrovskyy * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7b5ba902fSMykola Ostrovskyy * @author     Mykola Ostrovskyy <dwpforge@gmail.com>
8d0a907abSMykola Ostrovskyy */
9d0a907abSMykola Ostrovskyy
10d0a907abSMykola Ostrovskyyclass syntax_plugin_tablewidth extends DokuWiki_Syntax_Plugin {
11d0a907abSMykola Ostrovskyy
127ef3101aSMykola Ostrovskyy    private $mode;
13d0a907abSMykola Ostrovskyy
147ef3101aSMykola Ostrovskyy    public function __construct() {
15d0a907abSMykola Ostrovskyy        $this->mode = substr(get_class($this), 7);
16d0a907abSMykola Ostrovskyy    }
17d0a907abSMykola Ostrovskyy
187ef3101aSMykola Ostrovskyy    public function getType() {
19777bbe07SMykola Ostrovskyy        return 'container';
20d0a907abSMykola Ostrovskyy    }
21d0a907abSMykola Ostrovskyy
227ef3101aSMykola Ostrovskyy    public function getPType() {
23d0a907abSMykola Ostrovskyy        return 'block';
24d0a907abSMykola Ostrovskyy    }
25d0a907abSMykola Ostrovskyy
267ef3101aSMykola Ostrovskyy    public function getSort() {
27d0a907abSMykola Ostrovskyy        return 5;
28d0a907abSMykola Ostrovskyy    }
29d0a907abSMykola Ostrovskyy
307ef3101aSMykola Ostrovskyy    public function connectTo($mode) {
31777bbe07SMykola Ostrovskyy        $this->Lexer->addSpecialPattern('[\t ]*\n\|<[^\n]+?>\|(?=\s*?\n[|^])', $mode, $this->mode);
32d0a907abSMykola Ostrovskyy    }
33d0a907abSMykola Ostrovskyy
347ef3101aSMykola Ostrovskyy    public function handle($match, $state, $pos, Doku_Handler $handler) {
35d0a907abSMykola Ostrovskyy        if ($state == DOKU_LEXER_SPECIAL) {
36ea642877SMykola Ostrovskyy            if (preg_match('/\|<(\s*)(.+?)(\s*)>\|/', $match, $match) != 1) {
37d0a907abSMykola Ostrovskyy                return false;
38d0a907abSMykola Ostrovskyy            }
397ef3101aSMykola Ostrovskyy
40dc166ef9SMykola Ostrovskyy            // Sanitize the width spec to avoid injection of HTML tags and extra CSS declarations
41*57d54688SMykola Ostrovskyy            $widthSpec = str_replace(array('<', '>', ';', '"'), '', $match[2]);
42ea642877SMykola Ostrovskyy            $tableAlign = $this->getTableAlign($match[1], $match[3]);
43ea642877SMykola Ostrovskyy
44ea642877SMykola Ostrovskyy            return array($tableAlign . $widthSpec);
45d0a907abSMykola Ostrovskyy        }
467ef3101aSMykola Ostrovskyy
47d0a907abSMykola Ostrovskyy        return false;
48d0a907abSMykola Ostrovskyy    }
49d0a907abSMykola Ostrovskyy
507ef3101aSMykola Ostrovskyy    public function render($mode, Doku_Renderer $renderer, $data) {
51d0a907abSMykola Ostrovskyy        if ($mode == 'xhtml') {
52d0a907abSMykola Ostrovskyy            $renderer->doc .= '<!-- table-width ' . $data[0] . ' -->' . DOKU_LF;
537ef3101aSMykola Ostrovskyy
54d0a907abSMykola Ostrovskyy            return true;
55d0a907abSMykola Ostrovskyy        }
567ef3101aSMykola Ostrovskyy
57d0a907abSMykola Ostrovskyy        return false;
58d0a907abSMykola Ostrovskyy    }
59ea642877SMykola Ostrovskyy
60ea642877SMykola Ostrovskyy    private function getTableAlign($paddingLeft, $paddingRight) {
61ea642877SMykola Ostrovskyy        if (strlen($paddingLeft) > 1) {
62ea642877SMykola Ostrovskyy            if (strlen($paddingRight) > 1) {
63ea642877SMykola Ostrovskyy                return '>< ';
64ea642877SMykola Ostrovskyy            }
65ea642877SMykola Ostrovskyy            else {
66ea642877SMykola Ostrovskyy                return '> ';
67ea642877SMykola Ostrovskyy            }
68ea642877SMykola Ostrovskyy        }
69ea642877SMykola Ostrovskyy        else {
70ea642877SMykola Ostrovskyy            if (strlen($paddingRight) > 1) {
71ea642877SMykola Ostrovskyy                return '< ';
72ea642877SMykola Ostrovskyy            }
73ea642877SMykola Ostrovskyy        }
74ea642877SMykola Ostrovskyy
75ea642877SMykola Ostrovskyy        return '';
76ea642877SMykola Ostrovskyy    }
77d0a907abSMykola Ostrovskyy}
78