*/ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); /** * Include an external file to reduce some clutter and define some * functions. */ require_once(DOKU_PLUGIN.'svg/header.php'); /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_svg extends DokuWiki_Syntax_Plugin { var $xml_data; function getInfo(){ return array( 'author' => 'Austen Dicken', 'email' => 'admin@cvpcs.org', 'date' => '2007-05-16', 'name' => 'DokuWiki SVG Plugin', 'desc' => 'Supplies a way to render SVG images inline within a document.', 'url' => 'http://www.cvpcs.org/dokuwiki/lib/exe/fetch.php?id=project%3Adokuwiki-svg&cache=cache&media=project:dokuwiki-svg.tar.gz', ); } function getType(){ return 'protected'; } function getSort(){ return 999; } function connectTo($mode) { $this->Lexer->addEntryPattern('',$mode,'plugin_svg'); } function postConnect() { $this->Lexer->addExitPattern('','plugin_svg'); } function handle($match, $state, $pos, &$handler){ switch ($state) { case DOKU_LEXER_ENTER : break; case DOKU_LEXER_MATCHED : break; case DOKU_LEXER_UNMATCHED : break; case DOKU_LEXER_EXIT : break; case DOKU_LEXER_SPECIAL : break; } return array( $state, $match ); } function render($mode, &$renderer, $data) { global $syntax_plugin_svg_pcount; if($mode == 'xhtml'){ list( $state, $match ) = $data; switch( $state ) { case DOKU_LEXER_ENTER : $this->xml_data = ''; break; case DOKU_LEXER_EXIT : if( $syntax_plugin_svg_pcount == 0 ) { $this->clearImages(); } $this->save(); $this->renderSVG( $renderer ); $syntax_plugin_svg_pcount++; break; default: $this->xml_data .= $match; break; } return true; } return false; } function clearImages() { foreach( glob( SYNTAX_PLUGIN_SVG_MEDIADIR . 'media/' . md5( getID() ) . '*' ) as $filename ) { unlink( $filename ); } } function save() { global $syntax_plugin_svg_pcount; $this->xml_data = ltrim( $this->xml_data ); $filename = md5( getID() ) . $syntax_plugin_svg_pcount . '.svg'; switch( $this->getConf( 'output' ) ) { case 'imagick': if( extension_loaded( 'imagick' ) ) { $ih = new Imagick(); $ih->readImageBlob( $this->xml_data ); $ih->setImageFormat( $this->getConf( 'im_format' ) ); $ih->writeImage( SYNTAX_PLUGIN_SVG_MEDIADIR . 'media/' . substr( $filename, 0, -3 ) . strtolower( $this->getConf( 'im_format' ) ) ); $ih->destroy(); break; } case 'magickwand': if( extension_loaded( 'magickwand' ) ) { $mwh = NewMagickWand(); MagickReadImageBlob( $mwh, $this->xml_data ); MagickSetFormat( $mwh, $this->getConf( 'mw_format' ) ); MagickPaintTransparentImage( $mwh, NewPixelWand( '#FFFFFF' ) ); MagickWriteImage( $mwh, SYNTAX_PLUGIN_SVG_MEDIADIR . 'media/' . substr( $filename, 0, -3 ) . strtolower( $this->getConf( 'mw_format' ) ) ); DestroyMagickWand( $mwh ); break; } case 'embed': case 'object': case 'iframe': $fh = fopen( SYNTAX_PLUGIN_SVG_MEDIADIR . 'media/' . $filename, 'w' ); fwrite( $fh, $this->xml_data ); fclose( $fh ); break; } } function renderSVG( &$renderer ) { global $syntax_plugin_svg_pcount; $svgp = new syntax_plugin_svg_parser(); $svgp->parse( $this->xml_data ); switch( $this->getConf( 'output' ) ) { case 'imagick': if( extension_loaded( 'imagick' ) ) { $renderer->doc .= 'SVGImage'
    								.  $syntax_plugin_svg_pcount . ''; break; } case 'magickwand': if( extension_loaded( 'magickwand' ) ) { $renderer->doc .= 'SVGImage'
    								.  $syntax_plugin_svg_pcount . ''; break; } case 'embed': $renderer->doc .= ''; break; case 'object': $renderer->doc .= ''; case 'iframe': $renderer->doc .= ''; break; } } }