1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 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;
}
}
|