1 <?php
2 // must be run within Dokuwiki
3 if(!defined('DOKU_INC')) die();
4 
5 require_once(DOKU_PLUGIN.'formatplus/formatting.php');
6 
7 class syntax_plugin_formatplus_blockinsertplus extends FormattingPlus_Syntax_Plugin {
8 
9   var $disabled = false;
10 
11   function _getName() {
12     return 'BlockInsert+';
13   }
14   function _getDesc() {
15     return 'Wraps text in <INS> tags with optional meta-data.
16             Syntax: <ins desc @date>...</ins>';
17   }
18   function _getConfig() {
19     return 'block_ins_del';
20   }
21 
22   function _getFormatting() {
23     return array();
24   }
25 
26   function getSort() {
27     return 85;
28   }
29 
30   function getType() {
31     return 'container';
32   }
33 
34   function getAllowedTypes() {
35     return array('container','paragraphs','formatting','substition','disabled','protected');
36   }
37 
38   function getPType() {
39     return 'stack';
40   }
41 
42   function preConnect() {
43     if ($this->_disabledSyntax($this->_getConfig()))
44       $this->disabled = true;
45   }
46 
47   function connectTo($mode) {
48     if (!$this->disabled) {
49       $this->Lexer->addEntryPattern('<ins>(?=.*</ins>)', $mode, 'plugin_formatplus_blockinsertplus');
50       $this->Lexer->addEntryPattern('<ins [^>\r\n]+? @[^>\r\n]+?>(?=.*</ins>)', $mode, 'plugin_formatplus_blockinsertplus');
51       $this->Lexer->addEntryPattern('<ins [^>\r\n]+?>(?=.*</ins>)', $mode, 'plugin_formatplus_blockinsertplus');
52     }
53   }
54 
55   function postConnect() {
56     if (!$this->disabled) {
57       $this->Lexer->addExitPattern('</ins>', 'plugin_formatplus_blockinsertplus');
58     }
59   }
60 
61   function handle($match, $state, $pos, &$handler){
62     switch ($state) {
63       case DOKU_LEXER_ENTER:
64         $match = substr($match,4,-1);
65         if(!empty($match)){
66           if(preg_match("/^(.*) =(.*?) @(.*?)$/", $match, $matches)){
67             $output = array(trim($matches[1]),trim($matches[2]),trim($matches[3]));
68           }elseif(preg_match("/^(.*) @(.*?) =(.*?)$/", $match, $matches)){
69             $output = array(trim($matches[1]),trim($matches[3]),trim($matches[2]));
70           }elseif(preg_match("/^(.*) =(.*?)$/", $match, $matches)){
71             $output = array(trim($matches[1]),trim($matches[2]),'');
72           }elseif(preg_match("/^(.*) @(.*?)$/", $match, $matches)){
73             $output = array(trim($matches[1]),'',trim($matches[2]));
74           }else{
75             $output = array(trim($match),'','');
76           }
77         }else{
78           $output = array('','','');
79         }
80         break;
81       case DOKU_LEXER_EXIT:
82         $output = '';
83         break;
84       case DOKU_LEXER_UNMATCHED:
85         $output = $match;
86         break;
87     }
88     return array($state,$output);
89   }
90 
91   function render($format, &$renderer, $data) {
92     list($state,$output) = $data;
93     if (substr($format,0,5) == 'xhtml'){
94       switch ($state) {
95         case DOKU_LEXER_ENTER:
96           $renderer->doc .= "<ins class=\"block\"";
97           if(!empty($output[0])){
98             $renderer->doc .= ' title="'.$renderer->_xmlEntities($output[0]).'"';
99           }
100           if(!empty($output[1])){
101             $renderer->doc .= ' cite="'.$renderer->_xmlEntities($output[1]).'"';
102           }
103           if(!empty($output[2])){
104             $renderer->doc .= ' datetime="'.$renderer->_xmlEntities($output[2]).'"';
105           }
106           $renderer->doc .= '><div class="inserted">'.DOKU_LF;
107           break;
108         case DOKU_LEXER_EXIT:
109           $renderer->doc .= DOKU_LF."</div></ins>".DOKU_LF;
110           break;
111         case DOKU_LEXER_UNMATCHED:
112           $renderer->doc .= $renderer->_xmlEntities($output);
113           break;
114       }
115       return true;
116     } elseif ($format == 'metadata') {
117       switch ($state) {
118         case DOKU_LEXER_ENTER:
119           $sp = '';
120           $line = '';
121           if(!empty($output[0])){
122             $line .= '['.$output[0].']';
123             $sp = ' ';
124           }
125           if(!empty($output[1])){
126             $line .= $sp.$output[1];
127             $sp = ' ';
128           }
129           if(!empty($output[2])){
130             $line .= $sp.$output[2];
131           }
132           if ($renderer->capture)
133             $renderer->doc .= $line;
134           break;
135         case DOKU_LEXER_EXIT:
136           if ($renderer->capture) {
137             $renderer->doc .= DOKU_LF;
138             if (strlen($renderer->doc) > 250) $renderer->capture = false;
139           }
140           break;
141         case DOKU_LEXER_UNMATCHED:
142           if ($renderer->capture) $renderer->doc .= $output;
143           break;
144       }
145       return true;
146     }
147     return false;
148   }
149 
150 }
151