*/ class syntax_plugin_wrap_div extends DokuWiki_Syntax_Plugin { protected $special_pattern = '\r\n]*?/>'; protected $entry_pattern = '(?=.*?)'; protected $exit_pattern = ''; function getType(){ return 'formatting';} function getAllowedTypes() { return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs'); } function getPType(){ return 'stack';} function getSort(){ return 195; } // override default accepts() method to allow nesting - ie, to get the plugin accepts its own entry syntax function accepts($mode) { if ($mode == substr(get_class($this), 7)) return true; return parent::accepts($mode); } /** * Connect pattern to lexer */ function connectTo($mode) { $this->Lexer->addSpecialPattern($this->special_pattern,$mode,'plugin_wrap_'.$this->getPluginComponent()); $this->Lexer->addEntryPattern($this->entry_pattern,$mode,'plugin_wrap_'.$this->getPluginComponent()); } function postConnect() { $this->Lexer->addExitPattern($this->exit_pattern, 'plugin_wrap_'.$this->getPluginComponent()); $this->Lexer->addPattern('[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)', 'plugin_wrap_'.$this->getPluginComponent()); } /** * Handle the match */ function handle($match, $state, $pos, Doku_Handler $handler){ global $conf; switch ($state) { case DOKU_LEXER_ENTER: case DOKU_LEXER_SPECIAL: $data = strtolower(trim(substr($match,strpos($match,' '),-1)," \t\n/")); return array($state, $data); case DOKU_LEXER_UNMATCHED: $handler->addCall('cdata', array($match), $pos); break; case DOKU_LEXER_MATCHED: // we have a == header ==, use the core header() renderer // (copied from core header() in inc/parser/handler.php) $title = trim($match); $level = 7 - strspn($title,'='); if($level < 1) $level = 1; $title = trim($title,'='); $title = trim($title); $handler->addCall('header',array($title,$level,$pos), $pos); // close the section edit the header could open if ($title && $level <= $conf['maxseclevel']) { $handler->addPluginCall('wrap_closesection', array(), DOKU_LEXER_SPECIAL, $pos, ''); } break; case DOKU_LEXER_EXIT: return array($state, ''); } return false; } /** * Create output */ function render($format, Doku_Renderer $renderer, $indata) { static $type_stack = array (); if (empty($indata)) return false; list($state, $data) = $indata; if($format == 'xhtml'){ /** @var Doku_Renderer_xhtml $renderer */ switch ($state) { case DOKU_LEXER_ENTER: $sectionEditStartData = ['target' => 'plugin_wrap_start', 'hid' => '']; $sectionEditEndData = ['target' =>'plugin_wrap_end', 'hid' => '']; if (!defined('SEC_EDIT_PATTERN')) { // backwards-compatibility for Frusterick Manners (2017-02-19) $sectionEditStartData = 'plugin_wrap_start'; $sectionEditEndData = 'plugin_wrap_end'; } // add a section edit right at the beginning of the wrap output $renderer->startSectionEdit(0, $sectionEditStartData); $renderer->finishSectionEdit(); // add a section edit for the end of the wrap output. This prevents the renderer // from closing the last section edit so the next section button after the wrap syntax will // include the whole wrap syntax $renderer->startSectionEdit(0, $sectionEditEndData); case DOKU_LEXER_SPECIAL: $wrap = $this->loadHelper('wrap'); $attr = $wrap->buildAttributes($data, 'plugin_wrap'); $renderer->doc .= ''; if ($state == DOKU_LEXER_SPECIAL) $renderer->doc .= ''; break; case DOKU_LEXER_EXIT: $renderer->doc .= ''; $renderer->finishSectionEdit(); break; } return true; } if($format == 'odt'){ switch ($state) { case DOKU_LEXER_ENTER: $wrap = plugin_load('helper', 'wrap'); array_push ($type_stack, $wrap->renderODTElementOpen($renderer, 'div', $data)); break; case DOKU_LEXER_EXIT: $element = array_pop ($type_stack); $wrap = plugin_load('helper', 'wrap'); $wrap->renderODTElementClose ($renderer, $element); break; } return true; } return false; } }