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 121*b4142778SAndreas Gohr $R->doc .= '<img src="'.$img.'" class="media'.$data['align'].'" alt=""'; 122*b4142778SAndreas Gohr if($data['width']) $R->doc .= ' width="'.$data['width'].'"'; 123*b4142778SAndreas Gohr if($data['height']) $R->doc .= ' height="'.$data['height'].'"'; 124*b4142778SAndreas Gohr if($data['align'] == 'right') $ret .= ' align="right"'; 125*b4142778SAndreas Gohr if($data['align'] == 'left') $ret .= ' align="left"'; 126*b4142778SAndreas 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 1532a956e66SAndreas Gohr if ($error != 0) return false; 154a34ed36bSDennis Ploeger return true; 155a34ed36bSDennis Ploeger } 156a34ed36bSDennis Ploeger 157a34ed36bSDennis Ploeger} 158a34ed36bSDennis Ploeger 159a34ed36bSDennis Ploeger 160a34ed36bSDennis Ploeger 161