xref: /plugin/ditaa/syntax.php (revision 3c74ed326053f4f9eec8c46a77015da4f21b9093)
1a34ed36bSDennis Ploeger<?php
2a34ed36bSDennis Ploeger/**
3a34ed36bSDennis Ploeger * Ditaa-Plugin: Converts Ascii-Flowcharts into a png-File
4a34ed36bSDennis Ploeger *
5a34ed36bSDennis Ploeger * @license     GPL 2 (http://www.gnu.org/licenses/gpl.html)
6a34ed36bSDennis Ploeger * @author      Dennis Ploeger <develop [at] dieploegers [dot] de>
7a34ed36bSDennis Ploeger * @author      Christoph Mertins <c [dot] mertins [at] gmail [dot] com>
8d402f512SAndreas Gohr * @author      Andreas Gohr <andi@splitbrain.org>
9a34ed36bSDennis Ploeger */
10a34ed36bSDennis Ploeger
11a34ed36bSDennis Ploegerif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
12a34ed36bSDennis Ploegerif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
13a34ed36bSDennis Ploegerrequire_once(DOKU_PLUGIN.'syntax.php');
14a34ed36bSDennis Ploeger
15a34ed36bSDennis Ploegerclass syntax_plugin_ditaa extends DokuWiki_Syntax_Plugin {
16a34ed36bSDennis Ploeger
17a34ed36bSDennis Ploeger    /**
18a34ed36bSDennis Ploeger     * What about paragraphs?
19a34ed36bSDennis Ploeger     */
20a34ed36bSDennis Ploeger    function getPType(){
21a34ed36bSDennis Ploeger        return 'normal';
22a34ed36bSDennis Ploeger    }
23a34ed36bSDennis Ploeger
24a34ed36bSDennis Ploeger    /**
25a34ed36bSDennis Ploeger     * What kind of syntax are we?
26a34ed36bSDennis Ploeger     */
27a34ed36bSDennis Ploeger    function getType(){
28a34ed36bSDennis Ploeger        return 'substition';
29a34ed36bSDennis Ploeger    }
30a34ed36bSDennis Ploeger
31a34ed36bSDennis Ploeger    /**
32a34ed36bSDennis Ploeger     * Where to sort in?
33a34ed36bSDennis Ploeger     */
34a34ed36bSDennis Ploeger    function getSort(){
35a34ed36bSDennis Ploeger        return 200;
36a34ed36bSDennis Ploeger    }
37a34ed36bSDennis Ploeger
38a34ed36bSDennis Ploeger
39a34ed36bSDennis Ploeger    /**
4072a2bf1dSAndreas Gohr     * Connect pattern to lexer
41a34ed36bSDennis Ploeger     */
42a34ed36bSDennis Ploeger
43a34ed36bSDennis Ploeger    function connectTo($mode) {
4472a2bf1dSAndreas Gohr        $this->Lexer->addSpecialPattern('<ditaa.*?>\n.*?\n</ditaa>',$mode,'plugin_ditaa');
45a34ed36bSDennis Ploeger    }
46a34ed36bSDennis Ploeger
47a34ed36bSDennis Ploeger
48a34ed36bSDennis Ploeger
49a34ed36bSDennis Ploeger    /**
50a34ed36bSDennis Ploeger     * Handle the match
51a34ed36bSDennis Ploeger     */
5272a2bf1dSAndreas Gohr    function handle($match, $state, $pos, &$handler) {
532a956e66SAndreas Gohr        $info = $this->getInfo();
542a956e66SAndreas Gohr
5572a2bf1dSAndreas Gohr        // prepare default data
5672a2bf1dSAndreas Gohr        $return = array(
5772a2bf1dSAndreas Gohr                        'data'      => '',
5872a2bf1dSAndreas Gohr                        'width'     => 0,
5972a2bf1dSAndreas Gohr                        'height'    => 0,
6072a2bf1dSAndreas Gohr                        'antialias' => true,
6172a2bf1dSAndreas Gohr                        'edgesep'   => true,
6272a2bf1dSAndreas Gohr                        'round'     => false,
6372a2bf1dSAndreas Gohr                        'shadow'    => true,
6472a2bf1dSAndreas Gohr                        'scale'     => 1,
6572a2bf1dSAndreas Gohr                        'align'     => '',
662a956e66SAndreas Gohr                        'version'   => $info['date'], //forece rebuild of images on update
6772a2bf1dSAndreas Gohr                       );
68a34ed36bSDennis Ploeger
69a34ed36bSDennis Ploeger
7072a2bf1dSAndreas Gohr        // prepare input
7172a2bf1dSAndreas Gohr        $lines = explode("\n",$match);
7272a2bf1dSAndreas Gohr        $conf = array_shift($lines);
7372a2bf1dSAndreas Gohr        array_pop($lines);
7472a2bf1dSAndreas Gohr
7572a2bf1dSAndreas Gohr        // match config options
7672a2bf1dSAndreas Gohr        if(preg_match('/\b(left|center|right)\b/i',$conf,$match)) $return['align'] = $match[1];
7772a2bf1dSAndreas Gohr        if(preg_match('/\b(\d+)x(\d+)\b/',$conf,$match)){
7872a2bf1dSAndreas Gohr            $return['width']  = $match[1];
7972a2bf1dSAndreas Gohr            $return['height'] = $match[2];
80a34ed36bSDennis Ploeger        }
812a956e66SAndreas Gohr        if(preg_match('/\b(\d+(\.\d+)?)X\b/',$conf,$match)) $return['scale']  = $match[1];
8272a2bf1dSAndreas Gohr        if(preg_match('/\bwidth=([0-9]+)\b/i', $conf,$match)) $return['width'] = $match[1];
8372a2bf1dSAndreas Gohr        if(preg_match('/\bheight=([0-9]+)\b/i', $conf,$match)) $return['height'] = $match[1];
8472a2bf1dSAndreas Gohr        // match boolean toggles
8572a2bf1dSAndreas Gohr        if(preg_match_all('/\b(no)?(antialias|edgesep|round|shadow)\b/i',$conf,$matches,PREG_SET_ORDER)){
8672a2bf1dSAndreas Gohr            foreach($matches as $match){
8772a2bf1dSAndreas Gohr                $return[$match[2]] = ! $match[1];
8872a2bf1dSAndreas Gohr            }
8972a2bf1dSAndreas Gohr        }
9072a2bf1dSAndreas Gohr
9172a2bf1dSAndreas Gohr        $return['data'] = join("\n",$lines);
9272a2bf1dSAndreas Gohr
9372a2bf1dSAndreas Gohr        return $return;
94a34ed36bSDennis Ploeger    }
95a34ed36bSDennis Ploeger
96a34ed36bSDennis Ploeger    /**
97a34ed36bSDennis Ploeger     * Create output
98a34ed36bSDennis Ploeger     */
9972a2bf1dSAndreas Gohr    function render($format, &$R, $data) {
10072a2bf1dSAndreas Gohr        if($format != 'xhtml') return;
101a34ed36bSDennis Ploeger
1022a956e66SAndreas Gohr        if($this->getConf('java')){
1032a956e66SAndreas Gohr            // run ditaa on our own server
1042a956e66SAndreas Gohr            $img = DOKU_BASE.'lib/plugins/ditaa/ditaa.php?'.buildURLparams($data,'&');
1052a956e66SAndreas Gohr        }else{
1062a956e66SAndreas Gohr            // use ditaa.org for rendering
10772a2bf1dSAndreas Gohr            $pass = array(
10872a2bf1dSAndreas Gohr                'grid'  => $data['data'],
10972a2bf1dSAndreas Gohr                'scale' => $data['scale']
11072a2bf1dSAndreas Gohr            );
11172a2bf1dSAndreas Gohr            if(!$data['antialias']) $pass['A'] = 'on';
11272a2bf1dSAndreas Gohr            if(!$data['shadow'])    $pass['S'] = 'on';
11372a2bf1dSAndreas Gohr            if($data['round'])      $pass['r'] = 'on';
11472a2bf1dSAndreas Gohr            if(!$data['edgesep'])   $pass['E'] = 'on';
11572a2bf1dSAndreas Gohr            $pass['timeout'] = 25;
116a34ed36bSDennis Ploeger
11772a2bf1dSAndreas Gohr            $img = 'http://ditaa.org/ditaa/render?'.buildURLparams($pass,'&');
11872a2bf1dSAndreas Gohr            $img = ml($img,array('w'=>$data['width'],'h'=>$data['height']));
1192a956e66SAndreas Gohr        }
120a34ed36bSDennis Ploeger
121b4142778SAndreas Gohr        $R->doc .= '<img src="'.$img.'" class="media'.$data['align'].'" alt=""';
122b4142778SAndreas Gohr        if($data['width'])  $R->doc .= ' width="'.$data['width'].'"';
123b4142778SAndreas Gohr        if($data['height']) $R->doc .= ' height="'.$data['height'].'"';
124b4142778SAndreas Gohr        if($data['align'] == 'right') $ret .= ' align="right"';
125b4142778SAndreas Gohr        if($data['align'] == 'left')  $ret .= ' align="left"';
126b4142778SAndreas Gohr        $R->doc .= '/>';
127a34ed36bSDennis Ploeger    }
128a34ed36bSDennis Ploeger
1292a956e66SAndreas Gohr
130a34ed36bSDennis Ploeger    /**
1312a956e66SAndreas Gohr     * Run the ditaa Java program
132a34ed36bSDennis Ploeger     */
1332a956e66SAndreas Gohr    function _run($data,$cache) {
1342a956e66SAndreas Gohr        global $conf;
135a34ed36bSDennis Ploeger
1362a956e66SAndreas Gohr        $temp = tempnam($conf['tmpdir'],'ditaa_');
1372a956e66SAndreas Gohr        io_saveFile($temp,$data['data']);
138a34ed36bSDennis Ploeger
1392a956e66SAndreas Gohr        $cmd  = $this->getConf('java');
1402a956e66SAndreas Gohr        $cmd .= ' -Djava.awt.headless=true -jar';
1412a956e66SAndreas Gohr        $cmd .= ' '.escapeshellarg(dirname(__FILE__).'/ditaa/ditaa0_9.jar'); //ditaa jar
1422a956e66SAndreas Gohr        $cmd .= ' '.escapeshellarg($temp); //input
1432a956e66SAndreas Gohr        $cmd .= ' '.escapeshellarg($cache); //output
1442a956e66SAndreas Gohr        $cmd .= ' -s '.escapeshellarg($data['scale']);
1452a956e66SAndreas Gohr        if(!$data['antialias']) $cmd .= ' -A';
1462a956e66SAndreas Gohr        if(!$data['shadow'])    $cmd .= ' -S';
1472a956e66SAndreas Gohr        if($data['round'])      $cmd .= ' -r';
1482a956e66SAndreas Gohr        if(!$data['edgesep'])   $cmd .= ' -E';
149a34ed36bSDennis Ploeger
150a34ed36bSDennis Ploeger        exec($cmd, $output, $error);
1512a956e66SAndreas Gohr        @unlink($temp);
152a34ed36bSDennis Ploeger
153*3c74ed32SAndreas Gohr        if ($error != 0){
154*3c74ed32SAndreas Gohr            if($conf['debug']){
155*3c74ed32SAndreas Gohr                dbglog(join("\n",$output),'ditaa command failed: '.$cmd);
156*3c74ed32SAndreas Gohr            }
157*3c74ed32SAndreas Gohr            return false;
158*3c74ed32SAndreas Gohr        }
159a34ed36bSDennis Ploeger        return true;
160a34ed36bSDennis Ploeger    }
161a34ed36bSDennis Ploeger
162a34ed36bSDennis Ploeger}
163a34ed36bSDennis Ploeger
164a34ed36bSDennis Ploeger
165a34ed36bSDennis Ploeger
166