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?>