diff options
Diffstat (limited to 'plugins/55/wrap/syntax/div.php')
-rw-r--r-- | plugins/55/wrap/syntax/div.php | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/plugins/55/wrap/syntax/div.php b/plugins/55/wrap/syntax/div.php new file mode 100644 index 0000000..7bec01e --- /dev/null +++ b/plugins/55/wrap/syntax/div.php @@ -0,0 +1,134 @@ +<?php +/** + * Div Syntax Component of the Wrap Plugin + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Anika Henke <anika@selfthinker.org> + */ + +class syntax_plugin_wrap_div extends DokuWiki_Syntax_Plugin { + protected $special_pattern = '<div\b[^>\r\n]*?/>'; + protected $entry_pattern = '<div\b.*?>(?=.*?</div>)'; + protected $exit_pattern = '</div>'; + + 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 .= '<div'.$attr.'>'; + if ($state == DOKU_LEXER_SPECIAL) $renderer->doc .= '</div>'; + break; + + case DOKU_LEXER_EXIT: + $renderer->doc .= '</div>'; + $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; + } +} |