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