<?php /** * JMol2-Plugin: Parses jmol file blocks * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Luigi Micco * @version 1.0 */ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); require_once(DOKU_INC.'inc/init.php'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); class syntax_plugin_jmol2 extends DokuWiki_Syntax_Plugin { var $jmolDir = ''; var $jmolJS = ''; // var $pdbdir = ''; // Constructor function syntax_plugin_jmol2(){ $sl = (substr(DOKU_BASE,-1)!='/')?'/':''; $this->jmolDir = DOKU_BASE.$sl.'lib/plugins/jmol2/jmol/'; $this->jmolJS = $this->jmolDir.'Jmol.js'; } function getInfo(){ return array( 'author' => 'Luigi Micco', 'email' => 'l.micco@tiscali.it', 'date' => '2010-02-15', 'name' => 'Jmol2 Plugin', 'desc' => 'Parses jmol-blocks <jmol (FILENAME) (WIDTH) (HEIGHT) (BACKGROUND)>... script ...</jmol>', 'url' => 'http://www.bitlibero.com/dokuwiki/jmol2.zip',); } function getType(){ return 'protected'; } function getSort(){ return 815; } function connectTo($mode){ $this->Lexer->addEntryPattern('<jmol.*?>(?=.*?</jmol>)',$mode,'plugin_jmol2'); } function postConnect(){ $this->Lexer->addExitPattern('</jmol>','plugin_jmol2'); } // Handling lexer function handle($match, $state, $pos) { switch ($state){ case DOKU_LEXER_ENTER : list($pdbname,$width,$height,$background) = explode(" ", substr($match, 2+4, -1)); return array($state, array($pdbname,$width,$height,$background)); case DOKU_LEXER_UNMATCHED : return array($state, $match); case DOKU_LEXER_EXIT : return array($state, ''); } return array(); } /** * Render Jmol applet */ function render($mode, &$renderer, $data){ if($mode != 'xhtml') return false; global $conf; @list($state, $match) = $data; switch ($state){ case DOKU_LEXER_ENTER : list($pdbname,$width,$height,$background) = $match; if (!empty($pdbname)) { $width = empty($width)?300:urlencode($width); $height = empty($height)?$width:urlencode($height); $background = empty($background)?"#ffffff":$background; $pdbname = preg_replace("/{{([^|}]+).*}}/","$1",$pdbname); if ($pdbname != ".") { $pdbFileLink = ml($pdbname); } $renderer->doc .= '<form><script type="text/javascript" src="'.$this->jmolJS.'"></script>'; $renderer->doc .= '<script>jmolInitialize(" '.$this->jmolDir .'",false);'; $renderer->doc .= 'jmolSetAppletColor("'.$background.'");'; $renderer->doc .= 'jmolApplet(['.$width.','.$height.']'; if (!empty($pdbFileLink)) $renderer->doc .= ',"load '.$pdbFileLink.'"'; $renderer->doc .= ');'; } else { $renderer->doc .= '<form><script>'; } break; case DOKU_LEXER_UNMATCHED : $temp = $data[1]; $items = explode("}}", $data[1]); for ($i = 0; $i < count($items); $i++) { $pdbname = ""; if (stristr($items[$i], "load {{")) { $pdbname = ereg_replace(".*\load \{\{", "", $items[$i]); $pdbname = ereg_replace("\}\}.*", "", $pdbname); if ($pdbname != "") { $temp = str_replace("load {{" . $pdbname . "}}", "load ".ml($pdbname), $temp); } } } $renderer->doc .= $temp; break; case DOKU_LEXER_EXIT : $renderer->doc .= '</script></form>'; break; } } } ?>