home *** CD-ROM | disk | FTP | other *** search
/ Freelog 121 / FreelogMagazineJuilletAout2014-No121.iso / Bureautique / calibre / calibre-1.35.0.msi / file_604 < prev    next >
Text File  |  2013-05-28  |  8KB  |  206 lines

  1. /*************************************************************
  2.  *
  3.  *  MathJax/extensions/mml2jax.js
  4.  *  
  5.  *  Implements the MathML to Jax preprocessor that locates <math> nodes
  6.  *  within the text of a document and replaces them with SCRIPT tags
  7.  *  for processing by MathJax.
  8.  *
  9.  *  ---------------------------------------------------------------------
  10.  *  
  11.  *  Copyright (c) 2010-2012 Design Science, Inc.
  12.  * 
  13.  *  Licensed under the Apache License, Version 2.0 (the "License");
  14.  *  you may not use this file except in compliance with the License.
  15.  *  You may obtain a copy of the License at
  16.  * 
  17.  *      http://www.apache.org/licenses/LICENSE-2.0
  18.  * 
  19.  *  Unless required by applicable law or agreed to in writing, software
  20.  *  distributed under the License is distributed on an "AS IS" BASIS,
  21.  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22.  *  See the License for the specific language governing permissions and
  23.  *  limitations under the License.
  24.  */
  25.  
  26. MathJax.Extension.mml2jax = {
  27.   version: "2.0",
  28.   config: {
  29.     preview: "alttext"      // Use the <math> element's alttext as the 
  30.                             //   preview.  Set to "none" for no preview,
  31.                             //   or set to an array specifying an HTML snippet
  32.                             //   to use a fixed preview for all math
  33.  
  34.   },
  35.   MMLnamespace: "http://www.w3.org/1998/Math/MathML",
  36.   
  37.   PreProcess: function (element) {
  38.     if (!this.configured) {
  39.       this.config = MathJax.Hub.CombineConfig("mml2jax",this.config);
  40.       if (this.config.Augment) {MathJax.Hub.Insert(this,this.config.Augment)}
  41.       this.InitBrowser();
  42.       this.configured = true;
  43.     }
  44.     if (typeof(element) === "string") {element = document.getElementById(element)}
  45.     if (!element) {element = document.body}
  46.     //
  47.     //  Handle all math tags with no namespaces
  48.     //
  49.     this.ProcessMathArray(element.getElementsByTagName("math"));
  50.     //
  51.     //  Handle math with namespaces in XHTML
  52.     //
  53.     if (element.getElementsByTagNameNS)
  54.       {this.ProcessMathArray(element.getElementsByTagNameNS(this.MMLnamespace,"math"))}
  55.     //
  56.     //  Handle math with namespaces in HTML
  57.     //
  58.     var i, m;
  59.     if (document.namespaces) {
  60.       //
  61.       // IE namespaces are listed in document.namespaces
  62.       //
  63.       for (i = 0, m = document.namespaces.length; i < m; i++) {
  64.         var ns = document.namespaces[i];
  65.         if (ns.urn === this.MMLnamespace)
  66.           {this.ProcessMathArray(element.getElementsByTagName(ns.name+":math"))}
  67.       }
  68.     } else {
  69.       //
  70.       //  Everybody else
  71.       //  
  72.       var html = document.getElementsByTagName("html")[0];
  73.       if (html) {
  74.         for (i = 0, m = html.attributes.length; i < m; i++) {
  75.           var attr = html.attributes[i];
  76.           if (attr.nodeName.substr(0,6) === "xmlns:" && attr.nodeValue === this.MMLnamespace)
  77.             {this.ProcessMathArray(element.getElementsByTagName(attr.nodeName.substr(6)+":math"))}
  78.         }
  79.       }
  80.     }
  81.   },
  82.   
  83.   ProcessMathArray: function (math) {
  84.     var i;
  85.     if (math.length) {
  86.       if (this.MathTagBug) {
  87.         for (i = math.length-1; i >= 0; i--) {
  88.           if (math[i].nodeName === "MATH") {this.ProcessMathFlattened(math[i])}
  89.                                       else {this.ProcessMath(math[i])}
  90.         }
  91.       } else {
  92.         for (i = math.length-1; i >= 0; i--) {this.ProcessMath(math[i])}
  93.       }
  94.     }
  95.   },
  96.   
  97.   ProcessMath: function (math) {
  98.     var parent = math.parentNode;
  99.     var script = document.createElement("script");
  100.     script.type = "math/mml";
  101.     parent.insertBefore(script,math);
  102.     if (this.AttributeBug) {
  103.       var html = this.OuterHTML(math);
  104.       if (this.CleanupHTML) {
  105.         html = html.replace(/<\?import .*?>/i,"").replace(/<\?xml:namespace .*?\/>/i,"");
  106.         html = html.replace(/ /g," ");
  107.       }
  108.       MathJax.HTML.setScript(script,html); parent.removeChild(math);
  109.     } else {
  110.       var span = MathJax.HTML.Element("span"); span.appendChild(math);
  111.       MathJax.HTML.setScript(script,span.innerHTML);
  112.     }
  113.     if (this.config.preview !== "none") {this.createPreview(math,script)}
  114.   },
  115.   
  116.   ProcessMathFlattened: function (math) {
  117.     var parent = math.parentNode;
  118.     var script = document.createElement("script");
  119.     script.type = "math/mml";
  120.     parent.insertBefore(script,math);
  121.     var mml = "", node, MATH = math;
  122.     while (math && math.nodeName !== "/MATH") {
  123.       node = math; math = math.nextSibling;
  124.       mml += this.NodeHTML(node);
  125.       node.parentNode.removeChild(node);
  126.     }
  127.     if (math && math.nodeName === "/MATH") {math.parentNode.removeChild(math)}
  128.     script.text = mml + "</math>";
  129.     if (this.config.preview !== "none") {this.createPreview(MATH,script)}
  130.   },
  131.   
  132.   NodeHTML: function (node) {
  133.     var html, i, m;
  134.     if (node.nodeName === "#text") {
  135.       html = this.quoteHTML(node.nodeValue);
  136.     } else if (node.nodeName === "#comment") {
  137.       html = "<!--" + node.nodeValue + "-->"
  138.     } else {
  139.       // In IE, outerHTML doesn't properly quote attributes, so quote them by hand
  140.       // In Opera, HTML special characters aren't quoted in attributes, so quote them
  141.       html = "<"+node.nodeName.toLowerCase();
  142.       for (i = 0, m = node.attributes.length; i < m; i++) {
  143.         var attribute = node.attributes[i];
  144.         if (attribute.specified) {
  145.           // Opera 11.5 beta turns xmlns into xmlns:xmlns, so put it back (*** check after 11.5 is out ***)
  146.           html += " "+attribute.nodeName.toLowerCase().replace(/xmlns:xmlns/,"xmlns")+"=";
  147.           var value = attribute.nodeValue; // IE < 8 doesn't properly set style by setAttributes
  148.           if (value == null && attribute.nodeName === "style" && node.style) {value = node.style.cssText}
  149.           html += '"'+this.quoteHTML(value)+'"';
  150.         }
  151.       }
  152.       html += ">";
  153.       // Handle internal HTML (possibly due to <semantics> annotation or missing </math>)
  154.       if (node.outerHTML != null && node.outerHTML.match(/(.<\/[A-Z]+>|\/>)$/)) {
  155.         for (i = 0, m = node.childNodes.length; i < m; i++)
  156.           {html += this.OuterHTML(node.childNodes[i])}
  157.         html += "</"+node.nodeName.toLowerCase()+">";
  158.       }
  159.     }
  160.     return html;
  161.   },
  162.   OuterHTML: function (node) {
  163.     if (node.nodeName.charAt(0) === "#") {return this.NodeHTML(node)}
  164.     if (!this.AttributeBug) {return node.outerHTML}
  165.     var html = this.NodeHTML(node);
  166.     for (var i = 0, m = node.childNodes.length; i < m; i++)
  167.       {html += this.OuterHTML(node.childNodes[i]);}
  168.     html += "</"+node.nodeName.toLowerCase()+">";
  169.     return html;
  170.   },
  171.   quoteHTML: function (string) {
  172.     if (string == null) {string = ""}
  173.     return string.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");
  174.   },
  175.   
  176.   createPreview: function (math,script) {
  177.     var preview;
  178.     if (this.config.preview === "alttext") {
  179.       var text = math.getAttribute("alttext");
  180.       if (text != null) {preview = [this.filterPreview(text)]}
  181.     } else if (this.config.preview instanceof Array) {preview = this.config.preview}
  182.     if (preview) {
  183.       preview = MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},preview);
  184.       script.parentNode.insertBefore(preview,script);
  185.     }
  186.   },
  187.   
  188.   filterPreview: function (text) {return text},
  189.   
  190.   InitBrowser: function () {
  191.     var test = MathJax.HTML.Element("span",{id:"<", className: "mathjax", innerHTML: "<math><mi>x</mi><mspace /></math>"});
  192.     var html = test.outerHTML || "";
  193.     this.AttributeBug = html !== "" && !(
  194.       html.match(/id="<"/) &&           // "<" should convert to "<"
  195.       html.match(/class="mathjax"/) &&     // IE leaves out quotes
  196.       html.match(/<\/math>/)               // Opera 9 drops tags after self-closing tags
  197.     );
  198.     this.MathTagBug = test.childNodes.length > 1;    // IE < 9 flattens unknown tags
  199.     this.CleanupHTML = MathJax.Hub.Browser.isMSIE;   // remove namespace and other added tags
  200.   }
  201.  
  202. };
  203.  
  204. MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.mml2jax]);
  205. MathJax.Ajax.loadComplete("[MathJax]/extensions/mml2jax.js");
  206.