1<?php 2/** 3 * JMol2-Plugin: Parses jmol file blocks 4 * 5 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6 * @author Luigi Micco 7 * @version 1.0 8 */ 9if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 10 require_once(DOKU_INC.'inc/init.php'); 11if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 12 require_once(DOKU_PLUGIN.'syntax.php'); 13class syntax_plugin_jmol2 extends DokuWiki_Syntax_Plugin { 14 var $jmolDir = ''; 15 var $jmolJS = ''; 16// var $pdbdir = ''; 17 18 // Constructor 19 function syntax_plugin_jmol2(){ 20 $sl = (substr(DOKU_BASE,-1)!='/')?'/':''; 21 $this->jmolDir = DOKU_BASE.$sl.'lib/plugins/jmol2/jmol/'; 22 $this->jmolJS = $this->jmolDir.'Jmol.js'; 23 } 24 function getInfo(){ 25 return array( 26 'author' => 'Luigi Micco', 27 'email' => 'l.micco@tiscali.it', 28 'date' => '2010-02-15', 29 'name' => 'Jmol2 Plugin', 30 'desc' => 'Parses jmol-blocks 31 <jmol (FILENAME) (WIDTH) (HEIGHT) (BACKGROUND)>... script ...</jmol>', 32 'url' => 'http://www.bitlibero.com/dokuwiki/jmol2.zip',); 33 } 34 35 function getType(){ return 'protected'; } 36 function getSort(){ return 815; } 37 function connectTo($mode){ 38 $this->Lexer->addEntryPattern('<jmol.*?>(?=.*?</jmol>)',$mode,'plugin_jmol2'); 39 } 40 function postConnect(){ 41 $this->Lexer->addExitPattern('</jmol>','plugin_jmol2'); 42 } 43 44 // Handling lexer 45 function handle($match, $state, $pos) { 46 switch ($state){ 47 case DOKU_LEXER_ENTER : 48 list($pdbname,$width,$height,$background) = explode(" ", substr($match, 2+4, -1)); 49 return array($state, array($pdbname,$width,$height,$background)); 50 case DOKU_LEXER_UNMATCHED : 51 return array($state, $match); 52 case DOKU_LEXER_EXIT : 53 return array($state, ''); 54 } 55 return array(); 56 } 57/** 58 * Render Jmol applet 59 */ 60 function render($mode, &$renderer, $data){ 61 if($mode != 'xhtml') 62 return false; 63 global $conf; 64 @list($state, $match) = $data; 65 66 switch ($state){ 67 case DOKU_LEXER_ENTER : 68 list($pdbname,$width,$height,$background) = $match; 69 70 if (!empty($pdbname)) { 71 $width = empty($width)?300:urlencode($width); 72 $height = empty($height)?$width:urlencode($height); 73 $background = empty($background)?"#ffffff":$background; 74 75 $pdbname = preg_replace("/{{([^|}]+).*}}/","$1",$pdbname); 76 if ($pdbname != ".") { 77 $pdbFileLink = ml($pdbname); 78 } 79 80 $renderer->doc .= '<form><script type="text/javascript" src="'.$this->jmolJS.'"></script>'; 81 $renderer->doc .= '<script>jmolInitialize(" '.$this->jmolDir .'",false);'; 82 $renderer->doc .= 'jmolSetAppletColor("'.$background.'");'; 83 $renderer->doc .= 'jmolApplet(['.$width.','.$height.']'; 84 if (!empty($pdbFileLink)) $renderer->doc .= ',"load '.$pdbFileLink.'"'; 85 $renderer->doc .= ');'; 86 } else { 87 $renderer->doc .= '<form><script>'; 88 } 89 break; 90 case DOKU_LEXER_UNMATCHED : 91 $temp = $data[1]; 92 $items = explode("}}", $data[1]); 93 for ($i = 0; $i < count($items); $i++) { 94 $pdbname = ""; 95 if (stristr($items[$i], "load {{")) { 96 $pdbname = ereg_replace(".*\load \{\{", "", $items[$i]); 97 $pdbname = ereg_replace("\}\}.*", "", $pdbname); 98 if ($pdbname != "") { 99 $temp = str_replace("load {{" . $pdbname . "}}", "load ".ml($pdbname), $temp); 100 } 101 } 102 } 103 104 $renderer->doc .= $temp; 105 break; 106 case DOKU_LEXER_EXIT : 107 $renderer->doc .= '</script></form>'; 108 break; 109 } 110 } 111} 112?>