1 <?php
2 /**
3  * TeXit-Plugin: Parses TeXit-blocks in xhtml mode
4  * Copyright (C) 2007 Danjer
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * --------------------------------------------------------------------
20  *
21  * @author     Danjer <danjer@doudouke.org>
22  * @date       2007-02-11
23  */
24 
25 
26 if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
27 if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
28 require_once(DOKU_PLUGIN.'syntax.php');
29 require_once(DOKU_PLUGIN.'texit/texitrender.php');
30 
31 /**
32  * All DokuWiki plugins to extend the parser/rendering mechanism
33  * need to inherit from this class
34  */
35 class syntax_plugin_texit extends DokuWiki_Syntax_Plugin {
36 
37     /**
38      * What kind of syntax are we?
39      */
40     public function getType(){
41       return 'protected';
42     }
43 
44     /**
45      * @return string Paragraph type
46      */
47 //    public function getPType() {
48 //        return 'normal'; // let's keep the default value
49 //    }
50 
51     /**
52      * Where to sort in?
53      */
54     public function getSort(){
55       return 100;
56     }
57 
58   /**
59    * Connect pattern to lexer
60    */
61   function connectTo($mode) {
62     $this->Lexer->addEntryPattern('<texit(?=.*\x3C/texit\x3E)', $mode,
63 				  'plugin_texit');
64   }
65 
66   function postConnect() {
67     $this->Lexer->addExitPattern('</texit>','plugin_texit');
68   }
69 
70   /**
71    * Handle the match
72    */
73   function handle($match, $state, $pos, &$handler){
74     //print_r(array('match' => $match, 'state' => $state, "pos" => $pos, "handler" => $handler));
75     //print "<br>";
76     if ($state == DOKU_LEXER_UNMATCHED) {
77 
78       $matches = preg_split('/>/u',$match,2);
79       $matches[0] = trim($matches[0]);
80       if ( trim($matches[0]) == '' ) {
81 	$matches[0] = NULL;
82       }
83       return array($state,$matches[0], $matches[1],$pos);
84     }
85 
86     return array($state,'',$match,$pos);
87   }
88 
89   /**
90    * Create output
91    */
92   function render($mode, &$renderer, $data) {
93     global $ID;
94     list($state, $substate, $match, $pos) = $data;
95     if (!isset($this->_texit)) {
96       if (!$this->configloaded) {
97 	$this->loadConfig();
98       }
99       $this->_texit = new texitrender_plugin_texit($ID);
100     }
101     if($mode == 'xhtml'){
102       $renderer->info['cache'] = $this->_texit->docache();
103       if ($state == DOKU_LEXER_EXIT) {
104 	return TRUE;
105       }
106       if ($state != DOKU_LEXER_UNMATCHED) {
107 	return FALSE;
108       }
109       switch ($substate) {
110       case 'info':
111 	if ($this->_texit->add_data($substate, $match)) {
112 	  $renderer->doc .= $this->_texit->render() . '<p>';
113 	}
114 	break;
115       case 'footer':
116       case 'begin':
117       case 'document':
118       case 'command':
119       default:
120 	break;
121       }
122       return TRUE;
123     }
124     if($mode == 'latex'){
125       if ($state == DOKU_LEXER_EXIT) {
126 	return TRUE;
127       }
128       if ($state != DOKU_LEXER_UNMATCHED) {
129 	return FALSE;
130       }
131       if (!isset($substate)) {
132 	$renderer->put($match);
133       }
134       return TRUE;
135     }
136     return FALSE;
137   }
138 }
139 ?>
140