* @page http://iar.spb.ru/projects/doku/styler * @version 0.2 */ /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_styler_styler extends DokuWiki_Syntax_Plugin { /** * Get the type of syntax this plugin defines. * @return string */ public function getType() { return 'container'; } /** * What kind of syntax do we allow (optional) * @return string[] */ public function getAllowedTypes() { return array('container', 'substition', 'protected', 'disabled', 'formatting', 'paragraphs'); } /** * Define how this plugin is handled regarding paragraphs. * @return string */ public function getPType() { return 'stack'; } /** * Where to sort in? * @return int */ public function getSort() { return 205; } /** * Connect lookup pattern to lexer. * @param $mode String The desired rendermode. */ public function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*?\x3C/style\x3E)', $mode, 'plugin_styler_styler'); $this->Lexer->addEntryPattern('(?=.*?\x3C/quote\x3E)', $mode, 'plugin_styler_styler'); $this->Lexer->addEntryPattern('(?=.*?\x3C/epigraph\x3E)', $mode, 'plugin_styler_styler'); } /** * Second pattern to say when the parser is leaving your syntax mode. */ public function postConnect() { $this->Lexer->addExitPattern('', 'plugin_styler_styler'); $this->Lexer->addExitPattern('', 'plugin_styler_styler'); $this->Lexer->addExitPattern('', 'plugin_styler_styler'); } /** * Handler to prepare matched data for the rendering process. * @param $match String The text matched by the patterns. * @param $state Integer The lexer state for the match. * @param $pos Integer The character position of the matched text. * @param $handler Doku_Handler Reference to the Doku_Handler object. * @return array */ public function handle($match, $state, $pos, Doku_Handler $handler) { global $conf; switch ($state) { case DOKU_LEXER_ENTER: $match = str_replace(array('<', '>'), array('', ''), $match); $attrib = preg_split('/\s+/', strtolower($match)); if ($attrib[0]) { return array(array_shift($attrib), $state, $attrib); } else { return array($match, $state, array()); } case DOKU_LEXER_UNMATCHED: return array($match, $state, array()); case DOKU_LEXER_EXIT: return array('', $state, array()); } return array(); } /** * Handle the actual output creation. * @param $mode String The output format to generate. * @param $renderer Doku_Renderer A reference to the renderer object. * @param $data Array The data created by the handle() method. * @return bool */ public function render($mode, Doku_Renderer $renderer, $data) { global $st; global $et; global $conf; global $prt; if ($mode == 'xhtml') { switch ($data[1]) { case DOKU_LEXER_ENTER: $class = ''; foreach ( array( 'left', 'right', 'center', 'justify', 'box', 'float-left', 'float-right', 'background' ) as $v ) { if (in_array($v, $data[2])) { $class .= ' styler-' . $v; } } $renderer->doc .= "

\n"; // It is hack if ($data[0] == 'quote') { $renderer->doc .= '
'; } elseif ($data[0] == 'epigraph') { $renderer->doc .= '
'; } else { $renderer->doc .= '
'; } break; case DOKU_LEXER_UNMATCHED: $renderer->doc .= htmlspecialchars($data[0]); break; case DOKU_LEXER_EXIT: $renderer->doc .= "
\n

"; // "

" and "\n

" is hack break; } return true; } return false; } }