*/
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;
}
}