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
|
<?php
/**
* Span 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_span extends DokuWiki_Syntax_Plugin {
protected $special_pattern = '<span\b[^>\r\n]*?/>';
protected $entry_pattern = '<span\b.*?>(?=.*?</span>)';
protected $exit_pattern = '</span>';
function getType(){ return 'formatting';}
function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); }
function getPType(){ return 'normal';}
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());
}
/**
* Handle the match
*/
function handle($match, $state, $pos, Doku_Handler $handler){
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);
return false;
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'){
switch ($state) {
case DOKU_LEXER_ENTER:
case DOKU_LEXER_SPECIAL:
$wrap = $this->loadHelper('wrap');
$attr = $wrap->buildAttributes($data);
$renderer->doc .= '<span'.$attr.'>';
if ($state == DOKU_LEXER_SPECIAL) $renderer->doc .= '</span>';
break;
case DOKU_LEXER_EXIT:
$renderer->doc .= '</span>';
break;
}
return true;
}
if($format == 'odt'){
switch ($state) {
case DOKU_LEXER_ENTER:
$wrap = plugin_load('helper', 'wrap');
array_push ($type_stack, $wrap->renderODTElementOpen($renderer, 'span', $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;
}
}
|