Difference between revisions of "MediaWiki"
(File icon) |
(jmolAppletButton) |
||
Line 23: | Line 23: | ||
== Simple usage == | == Simple usage == | ||
+ | |||
+ | === Jmol applet in a MediaWiki page === | ||
To add a Jmol applet to a MediaWiki page, just add the following: | To add a Jmol applet to a MediaWiki page, just add the following: | ||
Line 55: | Line 57: | ||
{{Tag|/jmol}} | {{Tag|/jmol}} | ||
+ | === Buttons to control the Jmol applet === | ||
To add buttons to send scripts to the applet, just add the following: | To add buttons to send scripts to the applet, just add the following: | ||
Line 66: | Line 69: | ||
Applets and buttons can be combined in a single {{Tag|jmol}} tag. | Applets and buttons can be combined in a single {{Tag|jmol}} tag. | ||
+ | |||
+ | === Jmol applet in a popup window === | ||
+ | |||
+ | To add a button that opens a new window with a Jmol applet, use the {{Tag|JmolAppletButton}} tag instead of the {{Tag|JmolApplet}} tag and also add the {{Tag|text}} tag in it. For example: | ||
+ | |||
+ | {{Tag|jmol}} | ||
+ | {{Tag|jmolAppletButton}} | ||
+ | {{Tag|uploadedFileContents}}file uploaded in the wiki containing the molecular data{{Tag|/uploadedFileContents}} | ||
+ | {{Tag|text}}text displayed in the button{{Tag|text}} | ||
+ | {{Tag|/jmolAppletButton}} | ||
+ | {{Tag|/jmol}} | ||
== Reference == | == Reference == | ||
Line 83: | Line 97: | ||
** {{Tag|script}} : Jmol script to execute when the button is clicked. | ** {{Tag|script}} : Jmol script to execute when the button is clicked. | ||
** {{Tag|text}} : Text of the button. | ** {{Tag|text}} : Text of the button. | ||
− | ** {{Tag|name}} : Name of the Jmol applet linked with the button (useful if you want to use several Jmol applets in the same page). | + | ** {{Tag|name}} : Name of the button. |
+ | ** {{Tag|target}} : Name of the Jmol applet linked with the button (useful only if you want to use several Jmol applets in the same page). | ||
+ | * {{Tag|jmolAppletButton}} : A button for opening a new window with a Jmol Applet. It can contains the same tags as the {{Tag|jmolApplet}} tag, and also the following tags : | ||
+ | ** {{Tag|text}} : Text of the button. | ||
+ | ** {{Tag|title}} : Title of the new window (''doesn't work for the moment''). | ||
+ | ** {{Tag|x}} and {{Tag|y}} : Position of the new window. | ||
Line 114: | Line 133: | ||
* By default, MediaWiki authorizes the uploading of files whose name ends with a limited number of extensions. For example, if you want to authorize uploading {{File|*.cml}} files, add <tt>$wgFileExtensions[] = 'cml';</tt> in {{File|LocalSettings.php}}. | * By default, MediaWiki authorizes the uploading of files whose name ends with a limited number of extensions. For example, if you want to authorize uploading {{File|*.cml}} files, add <tt>$wgFileExtensions[] = 'cml';</tt> in {{File|LocalSettings.php}}. | ||
* You can add an icon in the {{Directory|skins/common/images/icons/}} directory for each extension (for example, {{File|fileicon-cml.png}}). In this wiki, we are using [[:Image:Fileicon_Chemical.png|this image]], which leads to the [[:Category:Molecular_Data|following result]]. | * You can add an icon in the {{Directory|skins/common/images/icons/}} directory for each extension (for example, {{File|fileicon-cml.png}}). In this wiki, we are using [[:Image:Fileicon_Chemical.png|this image]], which leads to the [[:Category:Molecular_Data|following result]]. | ||
+ | |||
+ | |||
+ | Copy the following code and paste it into {{File|extensions/Jmol/JmolMediaWiki.js}}: | ||
+ | |||
+ | <pre>/* | ||
+ | * Copyright (C) 2006 Nicolas Vervelle, The Jmol Development Team | ||
+ | * | ||
+ | * Contact: nico@jmol.org, jmol-developers@lists.sf.net | ||
+ | * | ||
+ | * This library is free software; you can redistribute it and/or | ||
+ | * modify it under the terms of the GNU Lesser General Public | ||
+ | * License as published by the Free Software Foundation; either | ||
+ | * version 2.1 of the License, or (at your option) any later version. | ||
+ | * | ||
+ | * This library is distributed in the hope that it will be useful, | ||
+ | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
+ | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
+ | * Lesser General Public License for more details. | ||
+ | * | ||
+ | * You should have received a copy of the GNU Lesser General Public | ||
+ | * License along with this library; if not, write to the Free Software | ||
+ | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
+ | */ | ||
+ | |||
+ | function jmolWikiPopupWindow(windowTitle, windowSize, windowLeft, windowTop, windowCode) { | ||
+ | var windowWidth = parseInt(windowSize) + 15; | ||
+ | var windowHeight = parseInt(windowSize) + 15; | ||
+ | var opt = "width=" + windowWidth + "," + | ||
+ | "height=" + windowHeight + "," + | ||
+ | "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1," + | ||
+ | "left=" + windowLeft + ",top=" + windowTop; | ||
+ | var s = | ||
+ | "<html><head>\n" + | ||
+ | "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/Jmol.js'></script>\n" + | ||
+ | "<title>" + windowTitle + "</title>\n" + | ||
+ | "</head><body>" + | ||
+ | "<script language='Javascript' type='text/javascript'>\n" + windowCode + "\n</script>\n" + | ||
+ | "</body></html>"; | ||
+ | |||
+ | var w = open("", windowTitle, opt); | ||
+ | w.document.open(); | ||
+ | w.document.write(s); | ||
+ | w.document.close(); | ||
+ | }</pre> | ||
Line 166: | Line 229: | ||
var $mValName; | var $mValName; | ||
var $mValOnlineContents; | var $mValOnlineContents; | ||
+ | var $mValPositionX; | ||
+ | var $mValPositionY; | ||
var $mValScript; | var $mValScript; | ||
var $mValSigned; | var $mValSigned; | ||
var $mValSize; | var $mValSize; | ||
+ | var $mValTarget; | ||
var $mValText; | var $mValText; | ||
+ | var $mValTitle; | ||
var $mValUploadedFileContents; | var $mValUploadedFileContents; | ||
var $mValUrlContents; | var $mValUrlContents; | ||
Line 198: | Line 265: | ||
} | } | ||
+ | // Renders a Jmol applet directly in the Wiki page | ||
function renderJmolApplet() { | function renderJmolApplet() { | ||
− | |||
− | |||
$this->mValOnlineContents = trim($this->mValOnlineContents); | $this->mValOnlineContents = trim($this->mValOnlineContents); | ||
$this->mValOnlineContents = preg_replace("/\t/", " ", $this->mValOnlineContents); | $this->mValOnlineContents = preg_replace("/\t/", " ", $this->mValOnlineContents); | ||
$this->mValOnlineContents = preg_replace("/\n/", "\\n'+\n'", $this->mValOnlineContents); | $this->mValOnlineContents = preg_replace("/\n/", "\\n'+\n'", $this->mValOnlineContents); | ||
+ | $this->mOutput .= "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/Jmol.js'></script>\n"; | ||
+ | $this->mOutput .= "<script language='Javascript' type='text/javascript'>\n". | ||
+ | $this->renderInternalJmolApplet("'")."\n". | ||
+ | "</script>\n"; | ||
+ | } | ||
+ | |||
+ | // Renders a button in the Wiki page that will open a new window containing a Jmol applet | ||
+ | function renderJmolAppletButton() { | ||
+ | $this->mOutput .= "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/JmolMediaWiki.js'></script>\n"; | ||
+ | $this->mOutput .= "<input type='button'"; | ||
+ | if ($this->mValName != "") { | ||
+ | $this->mOutput .= " name='".$this->mValName."' id='".$this->mValName."'"; | ||
+ | } | ||
+ | if ($this->mValText == "") { | ||
+ | $this->mValText = $this->mValTitle; | ||
+ | } | ||
+ | if ($this->mValText != "") { | ||
+ | $this->mOutput .= " value='".$this->mValText."'"; | ||
+ | } | ||
+ | $this->mOutput .= | ||
+ | " onclick=\"jmolWikiPopupWindow('".$this->mValTitle."',". | ||
+ | "'".$this->mValSize."',". | ||
+ | "'".$this->mValPositionX."',". | ||
+ | "'".$this->mValPositionY."',". | ||
+ | "'".$this->renderInternalJmolApplet("\\'")."');return true\""; | ||
+ | $this->mOutput .= "/>"; | ||
+ | } | ||
+ | |||
+ | // Renders a button to control a Jmol applet | ||
+ | function renderJmolButton() { | ||
+ | $this->mOutput .= "<script language='Javascript' type='text/javascript'>\n"; | ||
+ | if ($this->mValTarget != "") { | ||
+ | $this->mOutput .= "jmolSetTarget('".$this->mValTarget."');\n"; | ||
+ | } | ||
$this->mOutput .= | $this->mOutput .= | ||
− | " | + | "jmolButton('".$this->mValScript."', '".$this->mValText."'"; |
− | "<script>\n"; | + | if ($this->mValName != "") { |
+ | $this->mOutput .= ",'".$this->mValName."'"; | ||
+ | } | ||
+ | $this->mOutput .= ");\n". | ||
+ | "</script>\n"; | ||
+ | } | ||
+ | |||
+ | // Internal function to make a Jmol applet | ||
+ | function renderInternalJmolApplet($sep) { | ||
+ | global $wgJmolAuthorizeUrl, $wgJmolForceNameSpace; | ||
+ | $output = ""; | ||
+ | |||
if ($this->mValSigned) { | if ($this->mValSigned) { | ||
− | $ | + | $output .= "jmolInitialize(".$sep."/extensions/Jmol".$sep.", true);"; |
} else { | } else { | ||
− | $ | + | $output .= "jmolInitialize(".$sep."/extensions/Jmol".$sep.", false);"; |
} | } | ||
− | $ | + | $output .= |
− | "jmolCheckBrowser( | + | "jmolCheckBrowser(".$sep."popup".$sep.", ".$sep."/extensions/Jmol/browsercheck".$sep.", ".$sep."onClick".$sep.");". |
− | "jmolSetAppletColor( | + | "jmolSetAppletColor(".$sep.$this->mValColor.$sep.");"; |
if ($this->mValUploadedFileContents != "") { | if ($this->mValUploadedFileContents != "") { | ||
− | $title = Title::makeTitleSafe( NS_IMAGE, $this->mValUploadedFileContents ); | + | $title = Title::makeTitleSafe(NS_IMAGE, $this->mValUploadedFileContents); |
$article = new Article($title); | $article = new Article($title); | ||
if (!is_null($title) && $article->exists()) { | if (!is_null($title) && $article->exists()) { | ||
Line 231: | Line 342: | ||
} | } | ||
if (($this->mValUrlContents != "") && ($wgJmolAuthorizeUrl == true)) { | if (($this->mValUrlContents != "") && ($wgJmolAuthorizeUrl == true)) { | ||
− | $ | + | $output .= |
− | "jmolApplet(".$this->mValSize.", | + | "jmolApplet(".$this->mValSize.", ". |
− | " | + | $sep."load ".$this->mValUrlContents."; ".$this->mValScript.$sep; |
} else { | } else { | ||
− | $ | + | $output .= |
− | "jmolAppletInline(".$this->mValSize.", | + | "jmolAppletInline(".$this->mValSize.", ". |
− | + | $sep.$this->mValOnlineContents.$sep.", ". | |
− | + | $sep.$this->mValScript.$sep; | |
} | } | ||
if ($this->mValName != "") { | if ($this->mValName != "") { | ||
− | $ | + | $output .= ",".$sep.$this->mValName.$sep; |
} | } | ||
− | $ | + | $output .= |
− | "); | + | ");". |
− | "jmolBr(); | + | "jmolBr();"; |
− | |||
− | |||
− | + | return $output; | |
− | $ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | // Function called when an opening XML tag is found | ||
function startElement($parser, $name, $attrs) { | function startElement($parser, $name, $attrs) { | ||
$this->mDepth += 1; | $this->mDepth += 1; | ||
Line 277: | Line 380: | ||
} | } | ||
+ | // Function called when a closing XML tag is found | ||
function endElement($parser, $name) { | function endElement($parser, $name) { | ||
switch ($this->mDepth) { | switch ($this->mDepth) { | ||
Line 288: | Line 392: | ||
case "JMOLAPPLET": | case "JMOLAPPLET": | ||
$this->renderJmolApplet(); | $this->renderJmolApplet(); | ||
+ | break; | ||
+ | case "JMOLAPPLETBUTTON": | ||
+ | $this->renderJmolAppletButton(); | ||
break; | break; | ||
case "JMOLBUTTON": | case "JMOLBUTTON": | ||
Line 303: | Line 410: | ||
} | } | ||
+ | // Function called for the content of a XML tag | ||
function characterData($parser, $data) { | function characterData($parser, $data) { | ||
global $wgJmolAuthorizeChoosingSignedApplet; | global $wgJmolAuthorizeChoosingSignedApplet; | ||
Line 332: | Line 440: | ||
case "SIZE": | case "SIZE": | ||
$this->mValSize = $data; | $this->mValSize = $data; | ||
+ | break; | ||
+ | case "TARGET": | ||
+ | $this->mValTarget = $data; | ||
break; | break; | ||
case "TEXT": | case "TEXT": | ||
$this->mValText = $data; | $this->mValText = $data; | ||
+ | break; | ||
+ | case "TITLE": | ||
+ | $this->mValTitle = $data; | ||
break; | break; | ||
case "UPLOADEDFILECONTENTS": | case "UPLOADEDFILECONTENTS": | ||
Line 344: | Line 458: | ||
case "WIKIPAGECONTENTS": | case "WIKIPAGECONTENTS": | ||
$this->mValWikiPageContents = $data; | $this->mValWikiPageContents = $data; | ||
+ | break; | ||
+ | case "X": | ||
+ | $this->mValPositionX = $data; | ||
+ | break; | ||
+ | case "Y": | ||
+ | $this->mValPositionY = $data; | ||
break; | break; | ||
} | } | ||
Line 350: | Line 470: | ||
} | } | ||
+ | // Resets internal variables to their default values | ||
function resetValues() { | function resetValues() { | ||
global $wgJmolDefaultAppletSize; | global $wgJmolDefaultAppletSize; | ||
Line 359: | Line 480: | ||
$this->mValName = ""; | $this->mValName = ""; | ||
$this->mValOnlineContents = ""; | $this->mValOnlineContents = ""; | ||
+ | $this->mValPositionX = "100"; | ||
+ | $this->mValPositionY = "100"; | ||
$this->mValScript = ""; | $this->mValScript = ""; | ||
$this->mValSigned = $wgJmolUsingSignedAppletByDefault; | $this->mValSigned = $wgJmolUsingSignedAppletByDefault; | ||
$this->mValSize = $wgJmolDefaultAppletSize; | $this->mValSize = $wgJmolDefaultAppletSize; | ||
+ | $this->mValTarget = ""; | ||
$this->mValText = ""; | $this->mValText = ""; | ||
+ | $this->mValTitle = "Jmol"; | ||
$this->mValUploadedFileContents = ""; | $this->mValUploadedFileContents = ""; | ||
$this->mValUrlContents = ""; | $this->mValUrlContents = ""; | ||
Line 369: | Line 494: | ||
}; | }; | ||
− | / | + | // Enables to have a Release and Development versions running simultaneously |
if ($wfJmolReleaseVersion) { | if ($wfJmolReleaseVersion) { | ||
$wgExtensionFunctions[] = "wfJmolExtension"; | $wgExtensionFunctions[] = "wfJmolExtension"; |
Revision as of 21:33, 24 April 2006
Contents
Description
MediaWiki is an open source wiki engine licensed under the GNU General Public License. It is used by many websites, including this one.
The Jmol Mediawiki Extension enables the use of the Jmol applet inside of Mediawiki pages. This simple page demonstrates how to use the extension.
Note: The Jmol Mediawiki Extension is currently under development. It will go under several changes, different versions will probably be incompatible between each other
Wikis using the Jmol Extension
If you know a Wiki using the Jmol MediaWiki Extension, please add it in the following list:
- This wiki
- Folding@Home wiki
How to use the Jmol Extension
Once the Jmol Extension is installed in the Wiki, you can start adding Jmol applets and controls.
This following documentation is subject to change since the Jmol Extension is currently under development
Simple usage
Jmol applet in a MediaWiki page
To add a Jmol applet to a MediaWiki page, just add the following:
<jmol> <jmolApplet> <uploadedFileContents>file uploaded in the wiki containing the molecular data</uploadedFileContents> </jmolApplet> </jmol>
or
<jmol> <jmolApplet> <wikiPageContents>page of the wiki containing the molecular data</wikiPageContents> </jmolApplet> </jmol>
or
<jmol> <jmolApplet> <onlineContents>contents of the molecular file</onlineContents> </jmolApplet> </jmol>
or
<jmol> <jmolApplet> <urlContents>URL of the molecular file</urlContents> </jmolApplet> </jmol>
Buttons to control the Jmol applet
To add buttons to send scripts to the applet, just add the following:
<jmol> <jmolButton> <script>script to execute</script> <text>text of the button</text> </jmolButton> </jmol>
Applets and buttons can be combined in a single <jmol> tag.
Jmol applet in a popup window
To add a button that opens a new window with a Jmol applet, use the <JmolAppletButton> tag instead of the <JmolApplet> tag and also add the <text> tag in it. For example:
<jmol> <jmolAppletButton> <uploadedFileContents>file uploaded in the wiki containing the molecular data</uploadedFileContents> <text>text displayed in the button<text> </jmolAppletButton> </jmol>
Reference
The <jmol> tag can contain the following:
- <jmolApplet> : Jmol Applet.
- <signed> (true, false) : On the first Jmol applet to use the signed or unsigned version of the applet. This attribute can be disabled by the Wiki administrator with the $wgJmolAuthorizeChoosingSignedApplet setting in LocalSettings.php.
- <color> : To change the background color of the Jmol applet.
- <uploadedFileContents> : Name of an uploaded file in this wiki containing the molecular data to load in the Jmol applet. The Wiki needs to be configured to authorize the upload of molecular data files (using $wgFileExtensions in LocalSettings.php).
- <wikiPageContents> : Name of a page of this wiki containing the molecular data to load in the Jmol applet.
- <urlContents> : URL of the molecular file to load. This attribute can be disabled by the Wiki administrator with the $wgJmolAuthorizeUrl setting in LocalSettings.php.
- <onlineContents> : Molecular data to load in the Jmol applet.
- <size> : Size of the applet.
- <script> : Script to execute at startup.
- <name> : Name of the Jmol applet (useful if you want to use several Jmol applets in the same page).
- <jmolButton> : Button.
- <script> : Jmol script to execute when the button is clicked.
- <text> : Text of the button.
- <name> : Name of the button.
- <target> : Name of the Jmol applet linked with the button (useful only if you want to use several Jmol applets in the same page).
- <jmolAppletButton> : A button for opening a new window with a Jmol Applet. It can contains the same tags as the <jmolApplet> tag, and also the following tags :
- <text> : Text of the button.
- <title> : Title of the new window (doesn't work for the moment).
- <x> and <y> : Position of the new window.
Installation
Download Jmol and extract all the files in a temporary directory.
Create the directory Jmol in $mediawiki/extensions, and copy the following files in it:
- COPYRIGHT.txt
- Jmol.js
- JmolApplet_i18n.jar and JmolApplet0.jar to JmolApplet6.jar
- JmolAppletSigned_i18n.jar and JmolAppletSigned0.jar to JmolAppletSigned6.jar, if you want to be able to use the signed applet.
- LICENSE.txt
- README.txt
Add the following line to the end of LocalSettings.php:
require_once('extensions/Jmol/JmolExtension.php');
You can configure the Jmol extension with several settings added after the above line (default value in bold):
- $wgJmolAuthorizeUrl (true, false) : Authorize the use of <urlContents>.
- $wgJmolAuthorizeChoosingSignedApplet (true, false) : Authorize users to choose between the unsigned and the signed Jmol applet.
- $wgJmolDefaultAppletSize (400) : Size in pixels of the Jmol applet.
- $wgJmolForceNameSpace : Force the NameSpace where the applet will go looking for wiki pages containing molecular data (using <wikiPageContents>).
- $wgJmolUsingSignedAppletByDefault (true, false) : Choose if the signed Jmol applet will be used by default. Note: the signed Jmol applet is signed with a default certificat. If you want to use the signed Jmol applet in your wiki, I suggest resigning the Jmol applet with your own certificate.
Note: If you want to authorize users to upload files containing molecular data (for using the <uploadedFileContents> tag), you need to do the following:
- By default, MediaWiki authorizes the uploading of files whose name ends with a limited number of extensions. For example, if you want to authorize uploading *.cml files, add $wgFileExtensions[] = 'cml'; in LocalSettings.php.
- You can add an icon in the skins/common/images/icons/ directory for each extension (for example, fileicon-cml.png). In this wiki, we are using this image, which leads to the following result.
Copy the following code and paste it into extensions/Jmol/JmolMediaWiki.js:
/* * Copyright (C) 2006 Nicolas Vervelle, The Jmol Development Team * * Contact: nico@jmol.org, jmol-developers@lists.sf.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ function jmolWikiPopupWindow(windowTitle, windowSize, windowLeft, windowTop, windowCode) { var windowWidth = parseInt(windowSize) + 15; var windowHeight = parseInt(windowSize) + 15; var opt = "width=" + windowWidth + "," + "height=" + windowHeight + "," + "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1," + "left=" + windowLeft + ",top=" + windowTop; var s = "<html><head>\n" + "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/Jmol.js'></script>\n" + "<title>" + windowTitle + "</title>\n" + "</head><body>" + "<script language='Javascript' type='text/javascript'>\n" + windowCode + "\n</script>\n" + "</body></html>"; var w = open("", windowTitle, opt); w.document.open(); w.document.write(s); w.document.close(); }
Copy the following code and paste it into extensions/Jmol/JmolExtension.php:
<?php /* * Copyright (C) 2006 Nicolas Vervelle, The Jmol Development Team * * Contact: nico@jmol.org, jmol-developers@lists.sf.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ if (defined('MEDIAWIKI')) { require_once("$IP/includes/Title.php"); global $wgJmolAuthorizeUrl; global $wgJmolAuthorizeChoosingSignedApplet; global $wgJmolDefaultAppletSize; global $wgJmolForceNameSpace; global $wgJmolUsingSignedAppletByDefault; /* Global configuration parameters */ $wgJmolAuthorizeUrl = false; $wgJmolAuthorizeChoosingSignedApplet = false; $wgJmolDefaultAppletSize = "400"; $wgJmolForceNameSpace = ""; $wgJmolUsingSignedAppletByDefault = false; /* Class containing all the code for the Jmol Extension */ $wfJmolReleaseVersion = true; class JmolExtension { var $mOutput, $mDepth; var $mCurrentObject, $mCurrentTag; var $mValColor; var $mValName; var $mValOnlineContents; var $mValPositionX; var $mValPositionY; var $mValScript; var $mValSigned; var $mValSize; var $mValTarget; var $mValText; var $mValTitle; var $mValUploadedFileContents; var $mValUrlContents; var $mValWikiPageContents; function JmolExtension() { $this->mOutput = ""; $this->mDepth = 0; $this->resetValues(); } function renderJmol($input) { $this->mOutput = ""; $this->mDepth = 0; $xmlParser = xml_parser_create(); xml_set_object($xmlParser, &$this); xml_set_element_handler($xmlParser, "startElement", "endElement"); xml_set_character_data_handler($xmlParser, "characterData"); $input = "<jmol>$input<jmol>"; if (!xml_parse($xmlParser, $input)) { die(sprintf( "XML error: %s at line %d", xml_error_string(xml_get_error_code($xmlParser)), xml_get_current_line_number($xmlParser))); } xml_parser_free($xmlParser); return $this->mOutput; } // Renders a Jmol applet directly in the Wiki page function renderJmolApplet() { $this->mValOnlineContents = trim($this->mValOnlineContents); $this->mValOnlineContents = preg_replace("/\t/", " ", $this->mValOnlineContents); $this->mValOnlineContents = preg_replace("/\n/", "\\n'+\n'", $this->mValOnlineContents); $this->mOutput .= "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/Jmol.js'></script>\n"; $this->mOutput .= "<script language='Javascript' type='text/javascript'>\n". $this->renderInternalJmolApplet("'")."\n". "</script>\n"; } // Renders a button in the Wiki page that will open a new window containing a Jmol applet function renderJmolAppletButton() { $this->mOutput .= "<script language='Javascript' type='text/javascript' src='/extensions/Jmol/JmolMediaWiki.js'></script>\n"; $this->mOutput .= "<input type='button'"; if ($this->mValName != "") { $this->mOutput .= " name='".$this->mValName."' id='".$this->mValName."'"; } if ($this->mValText == "") { $this->mValText = $this->mValTitle; } if ($this->mValText != "") { $this->mOutput .= " value='".$this->mValText."'"; } $this->mOutput .= " onclick=\"jmolWikiPopupWindow('".$this->mValTitle."',". "'".$this->mValSize."',". "'".$this->mValPositionX."',". "'".$this->mValPositionY."',". "'".$this->renderInternalJmolApplet("\\'")."');return true\""; $this->mOutput .= "/>"; } // Renders a button to control a Jmol applet function renderJmolButton() { $this->mOutput .= "<script language='Javascript' type='text/javascript'>\n"; if ($this->mValTarget != "") { $this->mOutput .= "jmolSetTarget('".$this->mValTarget."');\n"; } $this->mOutput .= "jmolButton('".$this->mValScript."', '".$this->mValText."'"; if ($this->mValName != "") { $this->mOutput .= ",'".$this->mValName."'"; } $this->mOutput .= ");\n". "</script>\n"; } // Internal function to make a Jmol applet function renderInternalJmolApplet($sep) { global $wgJmolAuthorizeUrl, $wgJmolForceNameSpace; $output = ""; if ($this->mValSigned) { $output .= "jmolInitialize(".$sep."/extensions/Jmol".$sep.", true);"; } else { $output .= "jmolInitialize(".$sep."/extensions/Jmol".$sep.", false);"; } $output .= "jmolCheckBrowser(".$sep."popup".$sep.", ".$sep."/extensions/Jmol/browsercheck".$sep.", ".$sep."onClick".$sep.");". "jmolSetAppletColor(".$sep.$this->mValColor.$sep.");"; if ($this->mValUploadedFileContents != "") { $title = Title::makeTitleSafe(NS_IMAGE, $this->mValUploadedFileContents); $article = new Article($title); if (!is_null($title) && $article->exists()) { $file = new Image($title); $this->mValUrlContents = $file->getURL(); } } if ($this->mValWikiPageContents != "") { $this->mValUrlContents = "/index.php?title="; if ($wgJmolForceNameSpace != "") { $this->mValUrlContents .= $wgJmolForceNameSpace.":"; } $this->mValUrlContents .= $this->mValWikiPageContents."&action=raw"; } if (($this->mValUrlContents != "") && ($wgJmolAuthorizeUrl == true)) { $output .= "jmolApplet(".$this->mValSize.", ". $sep."load ".$this->mValUrlContents."; ".$this->mValScript.$sep; } else { $output .= "jmolAppletInline(".$this->mValSize.", ". $sep.$this->mValOnlineContents.$sep.", ". $sep.$this->mValScript.$sep; } if ($this->mValName != "") { $output .= ",".$sep.$this->mValName.$sep; } $output .= ");". "jmolBr();"; return $output; } // Function called when an opening XML tag is found function startElement($parser, $name, $attrs) { $this->mDepth += 1; switch ($this->mDepth) { case 1: // JMOL tag itself $this->resetValues(); break; case 2: // The interesting tags $this->resetValues(); $this->mCurrentObject = $name; break; case 3: // Details of the interesting tags; $this->mCurrentTag = $name; } } // Function called when a closing XML tag is found function endElement($parser, $name) { switch ($this->mDepth) { case 1: // JMOL tag itself $this->resetValues(); break; case 2: // The interesting tags switch ($this->mCurrentObject) { case "JMOLAPPLET": $this->renderJmolApplet(); break; case "JMOLAPPLETBUTTON": $this->renderJmolAppletButton(); break; case "JMOLBUTTON": $this->renderJmolButton(); break; } $this->resetValues(); break; case 3: // Details of the interesting tags $this->mCurrentTag = ""; break; } $this->mDepth -= 1; } // Function called for the content of a XML tag function characterData($parser, $data) { global $wgJmolAuthorizeChoosingSignedApplet; switch ($this->mDepth) { case 3: // Details of the interesting tags switch ($this->mCurrentTag) { case "COLOR": $this->mValColor = $data; break; case "NAME": $this->mValName = $data; break; case "ONLINECONTENTS": $data = trim($data); if ($data != "") { $this->mValOnlineContents .= "\n" . $data; } break; case "SCRIPT": $this->mValScript = $data; break; case "SIGNED": if ($wgJmolAuthorizeChoosingSignedApplet) { $this->mValSigned = $data; } break; case "SIZE": $this->mValSize = $data; break; case "TARGET": $this->mValTarget = $data; break; case "TEXT": $this->mValText = $data; break; case "TITLE": $this->mValTitle = $data; break; case "UPLOADEDFILECONTENTS": $this->mValUploadedFileContents = $data; break; case "URLCONTENTS": $this->mValUrlContents = $data; break; case "WIKIPAGECONTENTS": $this->mValWikiPageContents = $data; break; case "X": $this->mValPositionX = $data; break; case "Y": $this->mValPositionY = $data; break; } break; } } // Resets internal variables to their default values function resetValues() { global $wgJmolDefaultAppletSize; global $wgJmolUsingSignedAppletByDefault; $this->mCurrentObject = ""; $this->mCurrentTag = ""; $this->mValColor = "black"; $this->mValName = ""; $this->mValOnlineContents = ""; $this->mValPositionX = "100"; $this->mValPositionY = "100"; $this->mValScript = ""; $this->mValSigned = $wgJmolUsingSignedAppletByDefault; $this->mValSize = $wgJmolDefaultAppletSize; $this->mValTarget = ""; $this->mValText = ""; $this->mValTitle = "Jmol"; $this->mValUploadedFileContents = ""; $this->mValUrlContents = ""; $this->mValWikiPageContents = ""; } }; // Enables to have a Release and Development versions running simultaneously if ($wfJmolReleaseVersion) { $wgExtensionFunctions[] = "wfJmolExtension"; $wgJmolExtension = new JmolExtension; $wgExtensionCredits['other'][] = array( 'name' => 'Jmol Extension for MediaWiki', 'description' => 'adds the possibility to include Jmol applets in MediaWiki.', 'author' => 'Nicolas Vervelle, Jmol Development Team', 'url' => 'http://wiki.jmol.org/index.php/MediaWiki' ); function wfJmolExtension() { global $wgParser; $wgParser->setHook( "jmol", "wfRenderJmol" ); } function wfRenderJmol($input) { global $wgJmolExtension; return $wgJmolExtension->renderJmol($input); } } else { $wgExtensionFunctions[] = "wfJmolDevExtension"; $wgJmolDevExtension = new JmolDevExtension; $wgExtensionCredits['other'][] = array( 'name' => 'Jmol Development Extension for MediaWiki', 'description' => 'adds the possibility to include Jmol applets in MediaWiki.', 'author' => 'Nicolas Vervelle, Jmol Development Team', 'url' => 'http://wiki.jmol.org/index.php/MediaWiki' ); function wfJmolDevExtension() { global $wgParser; $wgParser->setHook( "jmolDev", "wfRenderJmolDev" ); } function wfRenderJmolDev($input) { global $wgJmolDevExtension; return $wgJmolDevExtension->renderJmol($input); } } } ?>
External links
- Wikipedia: Using Jmol to display molecular models
- Wikipedia: WikiProject Chemistry
Contributors
AngelHerraez, NicolasVervelle, Rzepa, Mevans86, Ngreeves, Pimpim, SklogWiki, Jacksmind, EricMartz