xref: /plugin/ditaa/syntax.php (revision d402f512c4c6c58746219ee98fb5fc6701f7d5a0)
1a34ed36bSDennis Ploeger<?php
2a34ed36bSDennis Ploeger
3a34ed36bSDennis Ploeger/**
4a34ed36bSDennis Ploeger * Ditaa-Plugin: Converts Ascii-Flowcharts into a png-File
5a34ed36bSDennis Ploeger *
6a34ed36bSDennis Ploeger * @license     GPL 2 (http://www.gnu.org/licenses/gpl.html)
7a34ed36bSDennis Ploeger * @author      Dennis Ploeger <develop [at] dieploegers [dot] de>
8a34ed36bSDennis Ploeger * @author      Christoph Mertins <c [dot] mertins [at] gmail [dot] com>
9*d402f512SAndreas Gohr * @author      Andreas Gohr <andi@splitbrain.org>
10a34ed36bSDennis Ploeger */
11a34ed36bSDennis Ploeger
12a34ed36bSDennis Ploegerif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
13a34ed36bSDennis Ploegerif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
14a34ed36bSDennis Ploegerrequire_once(DOKU_PLUGIN.'syntax.php');
15a34ed36bSDennis Ploeger
16a34ed36bSDennis Ploegerclass syntax_plugin_ditaa extends DokuWiki_Syntax_Plugin {
17a34ed36bSDennis Ploeger
18a34ed36bSDennis Ploeger    var $ditaa_name = '';
19a34ed36bSDennis Ploeger
20a34ed36bSDennis Ploeger    var $ditaa_width = -1;
21a34ed36bSDennis Ploeger
22a34ed36bSDennis Ploeger    var $ditaa_height = -1;
23a34ed36bSDennis Ploeger
24a34ed36bSDennis Ploeger    var $ditaa_data = '';
25a34ed36bSDennis Ploeger
26a34ed36bSDennis Ploeger    var $pathToJava = "/opt/blackdown-jdk-1.4.2.02/bin/java";
27a34ed36bSDennis Ploeger
28a34ed36bSDennis Ploeger    var $pathToDitaa = "/var/www/sst.intern.editable/dokuwiki/htdocs/ditaa.jar";
29a34ed36bSDennis Ploeger
30a34ed36bSDennis Ploeger    var $tempdir = "/tmp";
31a34ed36bSDennis Ploeger
32a34ed36bSDennis Ploeger
33a34ed36bSDennis Ploeger    /**
34a34ed36bSDennis Ploeger     * What about paragraphs?
35a34ed36bSDennis Ploeger     */
36a34ed36bSDennis Ploeger    function getPType(){
37a34ed36bSDennis Ploeger        return 'normal';
38a34ed36bSDennis Ploeger    }
39a34ed36bSDennis Ploeger
40a34ed36bSDennis Ploeger    /**
41a34ed36bSDennis Ploeger     * What kind of syntax are we?
42a34ed36bSDennis Ploeger     */
43a34ed36bSDennis Ploeger    function getType(){
44a34ed36bSDennis Ploeger        return 'substition';
45a34ed36bSDennis Ploeger    }
46a34ed36bSDennis Ploeger
47a34ed36bSDennis Ploeger    /**
48a34ed36bSDennis Ploeger     * Where to sort in?
49a34ed36bSDennis Ploeger     */
50a34ed36bSDennis Ploeger    function getSort(){
51a34ed36bSDennis Ploeger        return 200;
52a34ed36bSDennis Ploeger    }
53a34ed36bSDennis Ploeger
54a34ed36bSDennis Ploeger
55a34ed36bSDennis Ploeger    /**
56a34ed36bSDennis Ploeger     * Connect pattern to lexer (Beginning of parsing)
57a34ed36bSDennis Ploeger     */
58a34ed36bSDennis Ploeger
59a34ed36bSDennis Ploeger    function connectTo($mode) {
60a34ed36bSDennis Ploeger        $this->Lexer->addEntryPattern('<ditaa.*?>(?=.*?\x3C/ditaa\x3E)', $mode, 'plugin_ditaa');
61a34ed36bSDennis Ploeger    }
62a34ed36bSDennis Ploeger
63a34ed36bSDennis Ploeger    function postConnect() {
64a34ed36bSDennis Ploeger        $this->Lexer->addExitPattern('</ditaa>', 'plugin_ditaa');
65a34ed36bSDennis Ploeger    }
66a34ed36bSDennis Ploeger
67a34ed36bSDennis Ploeger
68a34ed36bSDennis Ploeger    /**
69a34ed36bSDennis Ploeger     * Handle the match
70a34ed36bSDennis Ploeger     */
71a34ed36bSDennis Ploeger    function handle($match, $state, $pos, &$handler)
72a34ed36bSDennis Ploeger    {
73a34ed36bSDennis Ploeger
74a34ed36bSDennis Ploeger        switch ($state) {
75a34ed36bSDennis Ploeger            case DOKU_LEXER_ENTER:
76a34ed36bSDennis Ploeger                    preg_match('/width=([0-9]+)/i', substr($match,6,-1), $match_width);
77a34ed36bSDennis Ploeger                    preg_match('/height=([0-9]+)/i', substr($match,6,-1), $match_height);
78a34ed36bSDennis Ploeger                    preg_match('/name=([a-zA-Z_0-9]+)/i', substr($match,6,-1), $match_name);
79a34ed36bSDennis Ploeger                    return array('begin', $match_name[1], $match_width[1], $match_height[1]);
80a34ed36bSDennis Ploeger                    break;
81a34ed36bSDennis Ploeger            case DOKU_LEXER_EXIT:
82a34ed36bSDennis Ploeger                    return array('end');
83a34ed36bSDennis Ploeger                    break;
84a34ed36bSDennis Ploeger            case DOKU_LEXER_UNMATCHED:
85a34ed36bSDennis Ploeger                    return array('data', $match);
86a34ed36bSDennis Ploeger                    break;
87a34ed36bSDennis Ploeger
88a34ed36bSDennis Ploeger        }
89a34ed36bSDennis Ploeger    }
90a34ed36bSDennis Ploeger
91a34ed36bSDennis Ploeger    /**
92a34ed36bSDennis Ploeger     * Create output
93a34ed36bSDennis Ploeger     */
94a34ed36bSDennis Ploeger    function render($format, &$renderer, $data)
95a34ed36bSDennis Ploeger    {
96a34ed36bSDennis Ploeger
97a34ed36bSDennis Ploeger        global $conf;
98a34ed36bSDennis Ploeger
99a34ed36bSDennis Ploeger        if ($data[0] == 'begin') {
100a34ed36bSDennis Ploeger
101a34ed36bSDennis Ploeger            list($state, $name, $width, $height) = $data;
102a34ed36bSDennis Ploeger
103a34ed36bSDennis Ploeger        } else if ($data[0] == 'data') {
104a34ed36bSDennis Ploeger
105a34ed36bSDennis Ploeger            list($state, $mydata) = $data;
106a34ed36bSDennis Ploeger
107a34ed36bSDennis Ploeger        } else {
108a34ed36bSDennis Ploeger
109a34ed36bSDennis Ploeger            $state = $data[0];
110a34ed36bSDennis Ploeger
111a34ed36bSDennis Ploeger        }
112a34ed36bSDennis Ploeger
113a34ed36bSDennis Ploeger        switch($state) {
114a34ed36bSDennis Ploeger
115a34ed36bSDennis Ploeger            case 'begin': return $this->_ditaa_begin($renderer, $name, $width, $height);
116a34ed36bSDennis Ploeger            case 'data' : return $this->_ditaa_data($mydata);
117a34ed36bSDennis Ploeger            case 'end'  : return $this->_ditaa_end($renderer);
118a34ed36bSDennis Ploeger
119a34ed36bSDennis Ploeger        }
120a34ed36bSDennis Ploeger
121a34ed36bSDennis Ploeger    }
122a34ed36bSDennis Ploeger
123a34ed36bSDennis Ploeger    /**
124a34ed36bSDennis Ploeger     * Store values for later ditaa-rendering
125a34ed36bSDennis Ploeger     *
126a34ed36bSDennis Ploeger     * @param object    $renderer The dokuwiki-renderer
127a34ed36bSDennis Ploeger     * @param string    $name   The name for the ditaa-object
128a34ed36bSDennis Ploeger     * @param width     $width  The width for the ditaa-object
129a34ed36bSDennis Ploeger     * @param height    $height The height for the ditaa-object
130a34ed36bSDennis Ploeger     * @return  bool            All parameters are set
131a34ed36bSDennis Ploeger     */
132a34ed36bSDennis Ploeger
133a34ed36bSDennis Ploeger    function _ditaa_begin(&$renderer, $name, $width, $height)
134a34ed36bSDennis Ploeger    {
135a34ed36bSDennis Ploeger        // Check, if name is given
136a34ed36bSDennis Ploeger
137a34ed36bSDennis Ploeger        $name = trim(strtolower($name));
138a34ed36bSDennis Ploeger
139a34ed36bSDennis Ploeger        if ($name == '') {
140a34ed36bSDennis Ploeger
141a34ed36bSDennis Ploeger            $renderer->doc .= '---NO NAME FOR FLOWCHART GIVEN---';
142a34ed36bSDennis Ploeger            return true;
143a34ed36bSDennis Ploeger
144a34ed36bSDennis Ploeger        }
145a34ed36bSDennis Ploeger
146a34ed36bSDennis Ploeger        $width = trim($width);
147a34ed36bSDennis Ploeger        $height = trim($height);
148a34ed36bSDennis Ploeger
149a34ed36bSDennis Ploeger        if (($width != '') && (settype($width, 'int'))) {
150a34ed36bSDennis Ploeger
151a34ed36bSDennis Ploeger            $this->ditaa_width = $width;
152a34ed36bSDennis Ploeger
153a34ed36bSDennis Ploeger        }
154a34ed36bSDennis Ploeger
155a34ed36bSDennis Ploeger        if (($height != '') && (settype($height, 'int'))) {
156a34ed36bSDennis Ploeger
157a34ed36bSDennis Ploeger            $this->ditaa_height = $height;
158a34ed36bSDennis Ploeger
159a34ed36bSDennis Ploeger        }
160a34ed36bSDennis Ploeger
161a34ed36bSDennis Ploeger        $this->ditaa_name = $name;
162a34ed36bSDennis Ploeger
163a34ed36bSDennis Ploeger        $this->ditaa_data = '';
164a34ed36bSDennis Ploeger
165a34ed36bSDennis Ploeger        return true;
166a34ed36bSDennis Ploeger
167a34ed36bSDennis Ploeger    }
168a34ed36bSDennis Ploeger
169a34ed36bSDennis Ploeger    /**
170a34ed36bSDennis Ploeger     * Expand the data for the ditaa-object
171a34ed36bSDennis Ploeger     *
172a34ed36bSDennis Ploeger     * @param   string  $data   The data for the ditaa-object
173a34ed36bSDennis Ploeger     * @return  bool            If everything was right
174a34ed36bSDennis Ploeger     */
175a34ed36bSDennis Ploeger
176a34ed36bSDennis Ploeger    function _ditaa_data($data)
177a34ed36bSDennis Ploeger    {
178a34ed36bSDennis Ploeger
179a34ed36bSDennis Ploeger        $this->ditaa_data .= $data;
180a34ed36bSDennis Ploeger
181a34ed36bSDennis Ploeger        return true;
182a34ed36bSDennis Ploeger
183a34ed36bSDennis Ploeger    }
184a34ed36bSDennis Ploeger
185a34ed36bSDennis Ploeger    /**
186a34ed36bSDennis Ploeger     * Render the ditaa-object
187a34ed36bSDennis Ploeger     *
188a34ed36bSDennis Ploeger     * @param object    $renderer   The dokuwiki-Renderer
189a34ed36bSDennis Ploeger     * @return  bool                If everything was right
190a34ed36bSDennis Ploeger     */
191a34ed36bSDennis Ploeger
192a34ed36bSDennis Ploeger    function _ditaa_end(&$renderer)
193a34ed36bSDennis Ploeger    {
194a34ed36bSDennis Ploeger        global $conf, $INFO;
195a34ed36bSDennis Ploeger
196a34ed36bSDennis Ploeger        // Write a text file for ditaa
197a34ed36bSDennis Ploeger
198a34ed36bSDennis Ploeger        $tempfile = tempnam($this->tempdir, 'ditaa_');
199a34ed36bSDennis Ploeger
200a34ed36bSDennis Ploeger        $file = fopen($tempfile.'.txt', 'w');
201a34ed36bSDennis Ploeger        fwrite($file, $this->ditaa_data);
202a34ed36bSDennis Ploeger        fclose($file);
203a34ed36bSDennis Ploeger
204a34ed36bSDennis Ploeger        $md5 = md5_file($tempfile.'.txt');
205a34ed36bSDennis Ploeger
206a34ed36bSDennis Ploeger        $mediadir = $conf["mediadir"]."/".str_replace(":", "/",$INFO['namespace'] );
207a34ed36bSDennis Ploeger
208a34ed36bSDennis Ploeger        if (!is_dir($mediadir)) {
209a34ed36bSDennis Ploeger            umask(002);
210a34ed36bSDennis Ploeger            mkdir($mediadir,0777);
211a34ed36bSDennis Ploeger        }
212a34ed36bSDennis Ploeger
213a34ed36bSDennis Ploeger        $imagefile = $mediadir.'/ditaa_'.$this->ditaa_name.'_'.$md5.'.png';
214a34ed36bSDennis Ploeger
215a34ed36bSDennis Ploeger        if ( !file_exists($imagefile)) {
216a34ed36bSDennis Ploeger
217a34ed36bSDennis Ploeger            $cmd = $this->pathToJava." -Djava.awt.headless=true -jar ".$this->pathToDitaa." ".$tempfile.".txt ".$tempfile.".png";
218a34ed36bSDennis Ploeger
219a34ed36bSDennis Ploeger            exec($cmd, $output, $error);
220a34ed36bSDennis Ploeger
221a34ed36bSDennis Ploeger            if ($error != 0) {
222a34ed36bSDennis Ploeger                $renderer->doc .= '---ERROR CONVERTING DIAGRAM---';
223a34ed36bSDennis Ploeger                   return false;
224a34ed36bSDennis Ploeger            }
225a34ed36bSDennis Ploeger
226a34ed36bSDennis Ploeger            if (file_exists($imagefile)) {
227a34ed36bSDennis Ploeger                unlink($imagefile);
228a34ed36bSDennis Ploeger            }
229a34ed36bSDennis Ploeger
230a34ed36bSDennis Ploeger            if ( !copy($tempfile.'.png', $imagefile) ) {
231a34ed36bSDennis Ploeger                return false;
232a34ed36bSDennis Ploeger            }
233a34ed36bSDennis Ploeger
234a34ed36bSDennis Ploeger            // Remove input file
235a34ed36bSDennis Ploeger            unlink($tempfile.'.png');
236a34ed36bSDennis Ploeger            unlink($tempfile);
237a34ed36bSDennis Ploeger        }
238a34ed36bSDennis Ploeger
239a34ed36bSDennis Ploeger        unlink($tempfile.'.txt');
240a34ed36bSDennis Ploeger
241a34ed36bSDennis Ploeger        // Output Img-Tag
242a34ed36bSDennis Ploeger
243a34ed36bSDennis Ploeger        $width = NULL;
244a34ed36bSDennis Ploeger
245a34ed36bSDennis Ploeger        if ($this->ditaa_width != -1) {
246a34ed36bSDennis Ploeger            $width = $this->ditaa_width;
247a34ed36bSDennis Ploeger        }
248a34ed36bSDennis Ploeger
249a34ed36bSDennis Ploeger        $height = NULL;
250a34ed36bSDennis Ploeger
251a34ed36bSDennis Ploeger        if ($this->ditaa_height != -1) {
252a34ed36bSDennis Ploeger            $height = $this->ditaa_height;
253a34ed36bSDennis Ploeger        }
254a34ed36bSDennis Ploeger
255a34ed36bSDennis Ploeger        $renderer->doc .= $renderer->internalmedia($INFO['namespace'].':ditaa_'.$this->ditaa_name.'_'.$md5.'.png', $this->ditaa_name, NULL, $width, $height, false);
256a34ed36bSDennis Ploeger
257a34ed36bSDennis Ploeger        return true;
258a34ed36bSDennis Ploeger
259a34ed36bSDennis Ploeger    }
260a34ed36bSDennis Ploeger
261a34ed36bSDennis Ploeger}
262a34ed36bSDennis Ploeger
263a34ed36bSDennis Ploeger
264a34ed36bSDennis Ploeger
265a34ed36bSDennis Ploeger
266a34ed36bSDennis Ploeger?>
267