<?php
/**
 *  Applet Plugin  
 *
 *  @license    GPL 2 ( http://www.gnu.org/licenses/gpl.html )
 *  @author     Stylianos [at] Dritsas [dot] net    
 *
 *  Description:
 *  A very basic Java applet handling plugin.
 *
 *  Acknowledgments:
 *  The draw applet author(s) for a very readable plugin   
 */
 
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');
 
/**
 *  Applet Plugin 
 */
class syntax_plugin_applet extends DokuWiki_Syntax_Plugin {
 
  /**
   *  Plugin Info 
   */
  function getInfo( ) {
    return array(
      'author' => 'Stylianos Dritsas',
      'email'  => 'stylianos [at] dritsas [dot] net',
      'date'   => '2006-03-05',
      'name'   => 'applet',
      'desc'   => 'Java Applet Plugin',
      'url'    => 'https://www.dokuwiki.org/plugin:applet',
    );
  }
 
  /**
   *  Typology?
   */  
  function getType( ) { 
		return 'substition'; 
	}
  
  /**
   *  Sort Code? 
   */  
  function getSort( ) {
    return 316;
  }
	
  /**
   *  Pattern Matching? 
   */  
  function connectTo($mode) {       
    $this->Lexer->addSpecialPattern( '<applet.*?>', $mode, 'plugin_applet' ); 
  }
    
  /**
   *  Parsing
   *  1. Very rough parsing involved
   *  2. Applet parameters not included
   */    
  function handle( $match, $state, $pos, &$handler ) {
    preg_match( '/width=([0-9]+)/i',            substr( $match, 6, -1 ), $match_width   );
    preg_match( '/height=([0-9]+)/i',           substr( $match, 6, -1 ), $match_height  );
    preg_match( '/code=([a-zA-Z_0-9.]+)/i',     substr( $match, 6, -1 ), $match_code    );
    preg_match( '/archive=([a-zA-Z_0-9:.]+)/i', substr( $match, 6, -1 ), $match_archive );
    return array( 
      $match_code[1], 
      $match_width[1], 
      $match_height[1], 
      $match_archive[1] 
    );
  }
    
  /**
   *  Rendering
   *  1. There is no error checking involved whatsoever
   *  2. Assuming that all applets come in a jar or zip archive
   *  3. The namespace to path conversion is highly ad-hoc-ish
   */  
  function render( $mode, &$renderer, $data ) {
    if($mode == 'xhtml'){
      list( $code, $width, $height, $archive ) = $data;
      //$archive = 'data/media/' . str_replace( ":", "/", $archive );
      $archive = DOKU_BASE . 'lib/exe/fetch.php?media=' . $archive;
      $renderer->doc .= "<applet code=\"$code\" " . 
                               "width=\"$width\" " .
                              "height=\"$height\" " .
                             "archive=\"$archive\"></applet>";   
      return true;
    } else {
      return false;
    }
  }   
}