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