www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 935585bec73ce6edfe1b59c3132ed54a1c6d4532
parent 682fe27d7e4ee5598ec0332653badc3070b48cab
Author: Davide P. Cervone <dpvc@union.edu>
Date:   Tue, 17 Jan 2012 10:36:13 -0500

New ASCIIMath input jax based on David Lippman's contributed versions

Diffstat:
Aextensions/asciimath2jax.js | 16++++++++++++++++
Ajax/input/AsciiMath/config.js | 16++++++++++++++++
Ajax/input/AsciiMath/jax.js | 16++++++++++++++++
Aunpacked/extensions/asciimath2jax.js | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aunpacked/jax/input/AsciiMath/config.js | 41+++++++++++++++++++++++++++++++++++++++++
Aunpacked/jax/input/AsciiMath/jax.js | 1287+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 1604 insertions(+), 0 deletions(-)

diff --git a/extensions/asciimath2jax.js b/extensions/asciimath2jax.js @@ -0,0 +1,16 @@ +/* + * /MathJax/extensions/asciimath2jax.js + * + * Copyright (c) 2010 Design Science, Inc. + * + * Part of the MathJax library. + * See http://www.mathjax.org for details. + * + * Licensed under the Apache License, Version 2.0; + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +MathJax.Extension.asciimath2jax={version:"1.0",config:{delimiters:["`"],skipTags:["script","noscript","style","textarea","pre","code"],ignoreClass:"asciimath2jax_ignore",processClass:"asciimath2jax_process",preview:"AsciiMath"},PreProcess:function(a){if(!this.configured){this.config=MathJax.Hub.CombineConfig("asciimath2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}this.configured=true}if(typeof(a)==="string"){a=document.getElementById(a)}if(!a){a=document.body}if(this.createPatterns()){this.scanElement(a,a.nextSibling)}},createPatterns:function(){var d=[],c,a,b=this.config;this.match={};if(b.delimiters.length===0){return false}for(c=0,a=b.delimiters.length;c<a;c++){d.push(this.patternQuote(b.delimiters[c]));this.match[b.delimiters[c]]={mode:"",end:b.delimiters[c],pattern:this.endPattern(b.delimiters[c])}}this.start=new RegExp(d.sort(this.sortLength).join("|"),"g");this.skipTags=new RegExp("^("+b.skipTags.join("|")+")$","i");this.ignoreClass=new RegExp("(^| )("+b.ignoreClass+")( |$)");this.processClass=new RegExp("(^| )("+b.processClass+")( |$)");return true},patternQuote:function(a){return a.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,"\\$1")},endPattern:function(a){return new RegExp(this.patternQuote(a)+"|\\\\.","g")},sortLength:function(d,c){if(d.length!==c.length){return c.length-d.length}return(d==c?0:(d<c?-1:1))},scanElement:function(c,b,g){var a,e,d,f;while(c&&c!=b){if(c.nodeName.toLowerCase()==="#text"){if(!g){c=this.scanText(c)}}else{a=(typeof(c.className)==="undefined"?"":c.className);e=(typeof(c.tagName)==="undefined"?"":c.tagName);if(typeof(a)!=="string"){a=String(a)}f=this.processClass.exec(a);if(c.firstChild&&!a.match(/(^| )MathJax/)&&(f||!this.skipTags.exec(e))){d=(g||this.ignoreClass.exec(a))&&!f;this.scanElement(c.firstChild,b,d)}}if(c){c=c.nextSibling}}},scanText:function(b){if(b.nodeValue.replace(/\s+/,"")==""){return b}var a,c;this.search={start:true};this.pattern=this.start;while(b){this.pattern.lastIndex=0;while(b&&b.nodeName.toLowerCase()==="#text"&&(a=this.pattern.exec(b.nodeValue))){if(this.search.start){b=this.startMatch(a,b)}else{b=this.endMatch(a,b)}}if(this.search.matched){b=this.encloseMath(b)}if(b){do{c=b;b=b.nextSibling}while(b&&(b.nodeName.toLowerCase()==="br"||b.nodeName.toLowerCase()==="#comment"));if(!b||b.nodeName!=="#text"){return c}}}return b},startMatch:function(a,b){var c=this.match[a[0]];if(c!=null){this.search={end:c.end,mode:c.mode,open:b,olen:a[0].length,opos:this.pattern.lastIndex-a[0].length};this.switchPattern(c.pattern)}return b},endMatch:function(a,b){if(a[0]==this.search.end){this.search.close=b;this.search.cpos=this.pattern.lastIndex;this.search.clen=(this.search.isBeginEnd?0:a[0].length);this.search.matched=true;b=this.encloseMath(b);this.switchPattern(this.start)}return b},switchPattern:function(a){a.lastIndex=this.pattern.lastIndex;this.pattern=a;this.search.start=(a===this.start)},encloseMath:function(b){var a=this.search,f=a.close,e,c;if(a.cpos===f.length){f=f.nextSibling}else{f=f.splitText(a.cpos)}if(!f){e=f=MathJax.HTML.addText(a.close.parentNode,"")}a.close=f;c=(a.opos?a.open.splitText(a.opos):a.open);while(c.nextSibling&&c.nextSibling!==f){if(c.nextSibling.nodeValue!==null){if(c.nextSibling.nodeName==="#comment"){c.nodeValue+=c.nextSibling.nodeValue.replace(/^\[CDATA\[((.|\n|\r)*)\]\]$/,"$1")}else{c.nodeValue+=c.nextSibling.nodeValue}}else{if(this.msieNewlineBug){c.nodeValue+=(c.nextSibling.nodeName.toLowerCase()==="br"?"\n":" ")}else{c.nodeValue+=" "}}c.parentNode.removeChild(c.nextSibling)}var d=c.nodeValue.substr(a.olen,c.nodeValue.length-a.olen-a.clen);c.parentNode.removeChild(c);if(this.config.preview!=="none"){this.createPreview(a.mode,d)}c=this.createMathTag(a.mode,d);this.search={};this.pattern.lastIndex=0;if(e){e.parentNode.removeChild(e)}return c},insertNode:function(b){var a=this.search;a.close.parentNode.insertBefore(b,a.close)},createPreview:function(c,a){var b;if(this.config.preview==="AsciiMath"){b=[this.filterAM(a)]}else{if(this.config.preview instanceof Array){b=this.config.preview}}if(b){b=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},b);this.insertNode(b)}},createMathTag:function(c,a){var b=document.createElement("script");b.type="math/asciimath"+c;MathJax.HTML.setScript(b,a);this.insertNode(b);return b},filterAM:function(a){return a},msieNewlineBug:(MathJax.Hub.Browser.isMSIE&&(document.documentMode||0)<9)};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.asciimath2jax]);MathJax.Ajax.loadComplete("[MathJax]/extensions/asciimath2jax.js"); + diff --git a/jax/input/AsciiMath/config.js b/jax/input/AsciiMath/config.js @@ -0,0 +1,16 @@ +/* + * /MathJax/jax/input/AsciiMath/config.js + * + * Copyright (c) 2010 Design Science, Inc. + * + * Part of the MathJax library. + * See http://www.mathjax.org for details. + * + * Licensed under the Apache License, Version 2.0; + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +MathJax.InputJax.AsciiMath=MathJax.InputJax({id:"AsciiMath",version:"1.0",directory:MathJax.InputJax.directory+"/AsciiMath",extensionDir:MathJax.InputJax.extensionDir+"/AsciiMath",config:{displaystyle:true,decimal:"."}});MathJax.InputJax.AsciiMath.Register("math/asciimath");MathJax.InputJax.AsciiMath.loadComplete("config.js"); + diff --git a/jax/input/AsciiMath/jax.js b/jax/input/AsciiMath/jax.js @@ -0,0 +1,16 @@ +/* + * /MathJax/jax/input/AsciiMath/jax.js + * + * Copyright (c) 2010 Design Science, Inc. + * + * Part of the MathJax library. + * See http://www.mathjax.org for details. + * + * Licensed under the Apache License, Version 2.0; + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +(function(ae){var j;var Z=MathJax.Object.Subclass({firstChild:null,lastChild:null,Init:function(){this.childNodes=[]},appendChild:function(ag){if(ag.parent){ag.parent.removeChild(ag)}if(this.lastChild){this.lastChild.nextSibling=ag}if(!this.firstChild){this.firstChild=ag}this.childNodes.push(ag);ag.parent=this;this.lastChild=ag;return ag},removeChild:function(ai){for(var ah=0,ag=this.childNodes.length;ah<ag;ah++){if(this.childNodes[ah]===ai){break}}if(ah===ag){return}this.childNodes.splice(ah,1);if(ai===this.firstChild){this.firstChild=ai.nextSibling}if(ai===this.lastChild){if(!this.childNodes.length){this.lastChild=null}else{this.lastChild=this.childNodes[this.childNodes.length-1]}}if(ah){this.childNodes[ah-1].nextSibling=ai.nextSibling}ai.nextSibling=ai.parent=null;return ai},replaceChild:function(aj,ah){for(var ai=0,ag=this.childNodes.length;ai<ag;ai++){if(this.childNodes[ai]===ah){break}}if(ai){this.childNodes[ai-1].nextSibling=aj}else{this.firstChild=aj}if(ai>=ag-1){this.lastChild=aj}this.childNodes[ai]=aj;aj.nextSibling=ah.nextSibling;ah.nextSibling=ah.parent=null;return ah}});var D=function(){j=MathJax.ElementJax.mml;var ag=j.mbase.prototype.Init;j.mbase.Augment({firstChild:null,lastChild:null,nodeValue:"",nextSibling:null,Init:function(){var ah=ag.apply(this,arguments)||this;ah.childNodes=ah.data;ah.nodeName=ah.type;return ah},appendChild:function(ak){if(ak.parent){ak.parent.removeChild(ak)}var ai=arguments;if(ak.isa(Z)){ai=ak.childNodes}for(var aj=0,ah=ai.length;aj<ah;aj++){ak=ai[aj];if(this.lastChild){this.lastChild.nextSibling=ak}if(!this.firstChild){this.firstChild=ak}this.Append(ak);this.lastChild=ak;this.nodeValue+=ak.nodeValue}return ak},removeChild:function(aj){for(var ai=0,ah=this.childNodes.length;ai<ah;ai++){if(this.childNodes[ai]===aj){break}}if(ai===ah){return}this.childNodes.splice(ai,1);if(aj===this.firstChild){this.firstChild=aj.nextSibling}if(aj===this.lastChild){if(!this.childNodes.length){this.lastChild=null}else{this.lastChild=this.childNodes[this.childNodes.length-1]}}if(ai){this.childNodes[ai-1].nextSibling=aj.nextSibling}this.nodeValue="";for(ai=0,ah=this.childNodes.length;ai<ah;ai++){this.nodeValue+=this.childNodes[ai].nodeValue}aj.nextSibling=aj.parent=null;return aj},replaceChild:function(ak,ai){for(var aj=0,ah=this.childNodes.length;aj<ah;aj++){if(this.childNodes[aj]===ai){break}}if(aj){this.childNodes[aj-1].nextSibling=ak}else{this.firstChild=ak}if(aj>=ah-1){this.lastChild=ak}this.SetData(aj,ak);ak.nextSibling=ai.nextSibling;this.nodeValue="";for(aj=0,ah=this.childNodes.length;aj<ah;aj++){this.nodeValue+=this.childNodes[aj].nodeValue}ai.nextSibling=ai.parent=null;return ai},setAttribute:function(ah,ai){this[ah]=ai}})};var R={};var g={getElementById:true,createElementNS:function(ah,ag){return j[ag]()},createTextNode:function(ag){return j.chars(ag).With({nodeValue:ag})},createDocumentFragment:function(){return Z()}};var N={appName:"MathJax"};var H="red";var ab="serif";var s=true;var B=true;var f=".";var p=g.createElementNS==null;function U(ag){if(p){return g.createElement(ag)}else{return g.createElementNS("http://www.w3.org/1999/xhtml",ag)}}var I=[61237,8492,61238,61239,8496,8497,61240,8459,8464,61241,61242,8466,8499,61243,61244,61245,61246,8475,61247,61248,61249,61250,61251,61252,61253,61254];var M=[61277,61278,8493,61279,61280,61281,61282,8460,8465,61283,61284,61285,61286,61287,61288,61289,61290,8476,61291,61292,61293,61294,61295,61296,61297,8488];var C=[61324,61325,8450,61326,61327,61328,61329,8461,61330,61331,61332,61333,61334,8469,61335,8473,8474,8477,61336,61337,61338,61339,61340,61341,61342,8484];var d=0,G=1,W=2,l=3,b=4,k=5,a=6,O=7,Y=8,q=9,aa=10;var i={input:"sqrt",tag:"msqrt",output:"sqrt",tex:null,ttype:G},ad={input:"root",tag:"mroot",output:"root",tex:null,ttype:W},z={input:"frac",tag:"mfrac",output:"/",tex:null,ttype:W},P={input:"/",tag:"mfrac",output:"/",tex:null,ttype:l},n={input:"stackrel",tag:"mover",output:"stackrel",tex:null,ttype:W},r={input:"_",tag:"msub",output:"_",tex:null,ttype:l},h={input:"^",tag:"msup",output:"^",tex:null,ttype:l},af={input:"text",tag:"mtext",output:"text",tex:null,ttype:aa},w={input:"mbox",tag:"mtext",output:"mbox",tex:null,ttype:aa},o={input:'"',tag:"mtext",output:"mbox",tex:null,ttype:aa};var F=[{input:"alpha",tag:"mi",output:"\u03B1",tex:null,ttype:d},{input:"beta",tag:"mi",output:"\u03B2",tex:null,ttype:d},{input:"chi",tag:"mi",output:"\u03C7",tex:null,ttype:d},{input:"delta",tag:"mi",output:"\u03B4",tex:null,ttype:d},{input:"Delta",tag:"mo",output:"\u0394",tex:null,ttype:d},{input:"epsi",tag:"mi",output:"\u03B5",tex:"epsilon",ttype:d},{input:"varepsilon",tag:"mi",output:"\u025B",tex:null,ttype:d},{input:"eta",tag:"mi",output:"\u03B7",tex:null,ttype:d},{input:"gamma",tag:"mi",output:"\u03B3",tex:null,ttype:d},{input:"Gamma",tag:"mo",output:"\u0393",tex:null,ttype:d},{input:"iota",tag:"mi",output:"\u03B9",tex:null,ttype:d},{input:"kappa",tag:"mi",output:"\u03BA",tex:null,ttype:d},{input:"lambda",tag:"mi",output:"\u03BB",tex:null,ttype:d},{input:"Lambda",tag:"mo",output:"\u039B",tex:null,ttype:d},{input:"mu",tag:"mi",output:"\u03BC",tex:null,ttype:d},{input:"nu",tag:"mi",output:"\u03BD",tex:null,ttype:d},{input:"omega",tag:"mi",output:"\u03C9",tex:null,ttype:d},{input:"Omega",tag:"mo",output:"\u03A9",tex:null,ttype:d},{input:"phi",tag:"mi",output:"\u03C6",tex:null,ttype:d},{input:"varphi",tag:"mi",output:"\u03D5",tex:null,ttype:d},{input:"Phi",tag:"mo",output:"\u03A6",tex:null,ttype:d},{input:"pi",tag:"mi",output:"\u03C0",tex:null,ttype:d},{input:"Pi",tag:"mo",output:"\u03A0",tex:null,ttype:d},{input:"psi",tag:"mi",output:"\u03C8",tex:null,ttype:d},{input:"Psi",tag:"mi",output:"\u03A8",tex:null,ttype:d},{input:"rho",tag:"mi",output:"\u03C1",tex:null,ttype:d},{input:"sigma",tag:"mi",output:"\u03C3",tex:null,ttype:d},{input:"Sigma",tag:"mo",output:"\u03A3",tex:null,ttype:d},{input:"tau",tag:"mi",output:"\u03C4",tex:null,ttype:d},{input:"theta",tag:"mi",output:"\u03B8",tex:null,ttype:d},{input:"vartheta",tag:"mi",output:"\u03D1",tex:null,ttype:d},{input:"Theta",tag:"mo",output:"\u0398",tex:null,ttype:d},{input:"upsilon",tag:"mi",output:"\u03C5",tex:null,ttype:d},{input:"xi",tag:"mi",output:"\u03BE",tex:null,ttype:d},{input:"Xi",tag:"mo",output:"\u039E",tex:null,ttype:d},{input:"zeta",tag:"mi",output:"\u03B6",tex:null,ttype:d},{input:"*",tag:"mo",output:"\u22C5",tex:"cdot",ttype:d},{input:"**",tag:"mo",output:"\u22C6",tex:"star",ttype:d},{input:"//",tag:"mo",output:"/",tex:null,ttype:d},{input:"\\\\",tag:"mo",output:"\\",tex:"backslash",ttype:d},{input:"setminus",tag:"mo",output:"\\",tex:null,ttype:d},{input:"xx",tag:"mo",output:"\u00D7",tex:"times",ttype:d},{input:"-:",tag:"mo",output:"\u00F7",tex:"divide",ttype:d},{input:"@",tag:"mo",output:"\u2218",tex:"circ",ttype:d},{input:"o+",tag:"mo",output:"\u2295",tex:"oplus",ttype:d},{input:"ox",tag:"mo",output:"\u2297",tex:"otimes",ttype:d},{input:"o.",tag:"mo",output:"\u2299",tex:"odot",ttype:d},{input:"sum",tag:"mo",output:"\u2211",tex:null,ttype:O},{input:"prod",tag:"mo",output:"\u220F",tex:null,ttype:O},{input:"^^",tag:"mo",output:"\u2227",tex:"wedge",ttype:d},{input:"^^^",tag:"mo",output:"\u22C0",tex:"bigwedge",ttype:O},{input:"vv",tag:"mo",output:"\u2228",tex:"vee",ttype:d},{input:"vvv",tag:"mo",output:"\u22C1",tex:"bigvee",ttype:O},{input:"nn",tag:"mo",output:"\u2229",tex:"cap",ttype:d},{input:"nnn",tag:"mo",output:"\u22C2",tex:"bigcap",ttype:O},{input:"uu",tag:"mo",output:"\u222A",tex:"cup",ttype:d},{input:"uuu",tag:"mo",output:"\u22C3",tex:"bigcup",ttype:O},{input:"!=",tag:"mo",output:"\u2260",tex:"ne",ttype:d},{input:":=",tag:"mo",output:":=",tex:null,ttype:d},{input:"lt",tag:"mo",output:"<",tex:null,ttype:d},{input:"<=",tag:"mo",output:"\u2264",tex:"le",ttype:d},{input:"lt=",tag:"mo",output:"\u2264",tex:"leq",ttype:d},{input:">=",tag:"mo",output:"\u2265",tex:"ge",ttype:d},{input:"geq",tag:"mo",output:"\u2265",tex:null,ttype:d},{input:"-<",tag:"mo",output:"\u227A",tex:"prec",ttype:d},{input:"-lt",tag:"mo",output:"\u227A",tex:null,ttype:d},{input:">-",tag:"mo",output:"\u227B",tex:"succ",ttype:d},{input:"in",tag:"mo",output:"\u2208",tex:null,ttype:d},{input:"!in",tag:"mo",output:"\u2209",tex:"notin",ttype:d},{input:"sub",tag:"mo",output:"\u2282",tex:"subset",ttype:d},{input:"sup",tag:"mo",output:"\u2283",tex:"supset",ttype:d},{input:"sube",tag:"mo",output:"\u2286",tex:"subseteq",ttype:d},{input:"supe",tag:"mo",output:"\u2287",tex:"supseteq",ttype:d},{input:"-=",tag:"mo",output:"\u2261",tex:"equiv",ttype:d},{input:"~=",tag:"mo",output:"\u2245",tex:"cong",ttype:d},{input:"~~",tag:"mo",output:"\u2248",tex:"approx",ttype:d},{input:"prop",tag:"mo",output:"\u221D",tex:"propto",ttype:d},{input:"and",tag:"mtext",output:"and",tex:null,ttype:a},{input:"or",tag:"mtext",output:"or",tex:null,ttype:a},{input:"not",tag:"mo",output:"\u00AC",tex:"neg",ttype:d},{input:"=>",tag:"mo",output:"\u21D2",tex:"implies",ttype:d},{input:"if",tag:"mo",output:"if",tex:null,ttype:a},{input:"<=>",tag:"mo",output:"\u21D4",tex:"iff",ttype:d},{input:"AA",tag:"mo",output:"\u2200",tex:"forall",ttype:d},{input:"EE",tag:"mo",output:"\u2203",tex:"exists",ttype:d},{input:"_|_",tag:"mo",output:"\u22A5",tex:"bot",ttype:d},{input:"TT",tag:"mo",output:"\u22A4",tex:"top",ttype:d},{input:"|--",tag:"mo",output:"\u22A2",tex:"vdash",ttype:d},{input:"|==",tag:"mo",output:"\u22A8",tex:"models",ttype:d},{input:"(",tag:"mo",output:"(",tex:null,ttype:b},{input:")",tag:"mo",output:")",tex:null,ttype:k},{input:"[",tag:"mo",output:"[",tex:null,ttype:b},{input:"]",tag:"mo",output:"]",tex:null,ttype:k},{input:"{",tag:"mo",output:"{",tex:null,ttype:b},{input:"}",tag:"mo",output:"}",tex:null,ttype:k},{input:"|",tag:"mo",output:"|",tex:null,ttype:q},{input:"(:",tag:"mo",output:"\u2329",tex:"langle",ttype:b},{input:":)",tag:"mo",output:"\u232A",tex:"rangle",ttype:k},{input:"<<",tag:"mo",output:"\u2329",tex:null,ttype:b},{input:">>",tag:"mo",output:"\u232A",tex:null,ttype:k},{input:"{:",tag:"mo",output:"{:",tex:null,ttype:b,invisible:true},{input:":}",tag:"mo",output:":}",tex:null,ttype:k,invisible:true},{input:"int",tag:"mo",output:"\u222B",tex:null,ttype:d},{input:"dx",tag:"mi",output:"{:d x:}",tex:null,ttype:Y},{input:"dy",tag:"mi",output:"{:d y:}",tex:null,ttype:Y},{input:"dz",tag:"mi",output:"{:d z:}",tex:null,ttype:Y},{input:"dt",tag:"mi",output:"{:d t:}",tex:null,ttype:Y},{input:"oint",tag:"mo",output:"\u222E",tex:null,ttype:d},{input:"del",tag:"mo",output:"\u2202",tex:"partial",ttype:d},{input:"grad",tag:"mo",output:"\u2207",tex:"nabla",ttype:d},{input:"+-",tag:"mo",output:"\u00B1",tex:"pm",ttype:d},{input:"O/",tag:"mo",output:"\u2205",tex:"emptyset",ttype:d},{input:"oo",tag:"mo",output:"\u221E",tex:"infty",ttype:d},{input:"aleph",tag:"mo",output:"\u2135",tex:null,ttype:d},{input:"...",tag:"mo",output:"...",tex:"ldots",ttype:d},{input:":.",tag:"mo",output:"\u2234",tex:"therefore",ttype:d},{input:"/_",tag:"mo",output:"\u2220",tex:"angle",ttype:d},{input:"\\ ",tag:"mo",output:"\u00A0",tex:null,ttype:d},{input:"quad",tag:"mo",output:"\u00A0\u00A0",tex:null,ttype:d},{input:"qquad",tag:"mo",output:"\u00A0\u00A0\u00A0\u00A0",tex:null,ttype:d},{input:"cdots",tag:"mo",output:"\u22EF",tex:null,ttype:d},{input:"vdots",tag:"mo",output:"\u22EE",tex:null,ttype:d},{input:"ddots",tag:"mo",output:"\u22F1",tex:null,ttype:d},{input:"diamond",tag:"mo",output:"\u22C4",tex:null,ttype:d},{input:"square",tag:"mo",output:"\u25A1",tex:null,ttype:d},{input:"|__",tag:"mo",output:"\u230A",tex:"lfloor",ttype:d},{input:"__|",tag:"mo",output:"\u230B",tex:"rfloor",ttype:d},{input:"|~",tag:"mo",output:"\u2308",tex:"lceiling",ttype:d},{input:"~|",tag:"mo",output:"\u2309",tex:"rceiling",ttype:d},{input:"CC",tag:"mo",output:"\u2102",tex:null,ttype:d},{input:"NN",tag:"mo",output:"\u2115",tex:null,ttype:d},{input:"QQ",tag:"mo",output:"\u211A",tex:null,ttype:d},{input:"RR",tag:"mo",output:"\u211D",tex:null,ttype:d},{input:"ZZ",tag:"mo",output:"\u2124",tex:null,ttype:d},{input:"f",tag:"mi",output:"f",tex:null,ttype:G,func:true},{input:"g",tag:"mi",output:"g",tex:null,ttype:G,func:true},{input:"lim",tag:"mo",output:"lim",tex:null,ttype:O},{input:"Lim",tag:"mo",output:"Lim",tex:null,ttype:O},{input:"sin",tag:"mo",output:"sin",tex:null,ttype:G,func:true},{input:"cos",tag:"mo",output:"cos",tex:null,ttype:G,func:true},{input:"tan",tag:"mo",output:"tan",tex:null,ttype:G,func:true},{input:"sinh",tag:"mo",output:"sinh",tex:null,ttype:G,func:true},{input:"cosh",tag:"mo",output:"cosh",tex:null,ttype:G,func:true},{input:"tanh",tag:"mo",output:"tanh",tex:null,ttype:G,func:true},{input:"cot",tag:"mo",output:"cot",tex:null,ttype:G,func:true},{input:"sec",tag:"mo",output:"sec",tex:null,ttype:G,func:true},{input:"csc",tag:"mo",output:"csc",tex:null,ttype:G,func:true},{input:"log",tag:"mo",output:"log",tex:null,ttype:G,func:true},{input:"ln",tag:"mo",output:"ln",tex:null,ttype:G,func:true},{input:"det",tag:"mo",output:"det",tex:null,ttype:G,func:true},{input:"dim",tag:"mo",output:"dim",tex:null,ttype:d},{input:"mod",tag:"mo",output:"mod",tex:null,ttype:d},{input:"gcd",tag:"mo",output:"gcd",tex:null,ttype:G,func:true},{input:"lcm",tag:"mo",output:"lcm",tex:null,ttype:G,func:true},{input:"lub",tag:"mo",output:"lub",tex:null,ttype:d},{input:"glb",tag:"mo",output:"glb",tex:null,ttype:d},{input:"min",tag:"mo",output:"min",tex:null,ttype:O},{input:"max",tag:"mo",output:"max",tex:null,ttype:O},{input:"uarr",tag:"mo",output:"\u2191",tex:"uparrow",ttype:d},{input:"darr",tag:"mo",output:"\u2193",tex:"downarrow",ttype:d},{input:"rarr",tag:"mo",output:"\u2192",tex:"rightarrow",ttype:d},{input:"->",tag:"mo",output:"\u2192",tex:"to",ttype:d},{input:"|->",tag:"mo",output:"\u21A6",tex:"mapsto",ttype:d},{input:"larr",tag:"mo",output:"\u2190",tex:"leftarrow",ttype:d},{input:"harr",tag:"mo",output:"\u2194",tex:"leftrightarrow",ttype:d},{input:"rArr",tag:"mo",output:"\u21D2",tex:"Rightarrow",ttype:d},{input:"lArr",tag:"mo",output:"\u21D0",tex:"Leftarrow",ttype:d},{input:"hArr",tag:"mo",output:"\u21D4",tex:"Leftrightarrow",ttype:d},i,ad,z,P,n,r,h,{input:"hat",tag:"mover",output:"\u005E",tex:null,ttype:G,acc:true},{input:"bar",tag:"mover",output:"\u00AF",tex:"overline",ttype:G,acc:true},{input:"vec",tag:"mover",output:"\u2192",tex:null,ttype:G,acc:true},{input:"dot",tag:"mover",output:".",tex:null,ttype:G,acc:true},{input:"ddot",tag:"mover",output:"..",tex:null,ttype:G,acc:true},{input:"ul",tag:"munder",output:"\u0332",tex:"underline",ttype:G,acc:true},af,w,o,{input:"bb",tag:"mstyle",atname:"fontweight",atval:"bold",output:"bb",tex:null,ttype:G},{input:"mathbf",tag:"mstyle",atname:"fontweight",atval:"bold",output:"mathbf",tex:null,ttype:G},{input:"sf",tag:"mstyle",atname:"fontfamily",atval:"sans-serif",output:"sf",tex:null,ttype:G},{input:"mathsf",tag:"mstyle",atname:"fontfamily",atval:"sans-serif",output:"mathsf",tex:null,ttype:G},{input:"bbb",tag:"mstyle",atname:"mathvariant",atval:"double-struck",output:"bbb",tex:null,ttype:G,codes:C},{input:"mathbb",tag:"mstyle",atname:"mathvariant",atval:"double-struck",output:"mathbb",tex:null,ttype:G,codes:C},{input:"cc",tag:"mstyle",atname:"mathvariant",atval:"script",output:"cc",tex:null,ttype:G,codes:I},{input:"mathcal",tag:"mstyle",atname:"mathvariant",atval:"script",output:"mathcal",tex:null,ttype:G,codes:I},{input:"tt",tag:"mstyle",atname:"fontfamily",atval:"monospace",output:"tt",tex:null,ttype:G},{input:"mathtt",tag:"mstyle",atname:"fontfamily",atval:"monospace",output:"mathtt",tex:null,ttype:G},{input:"fr",tag:"mstyle",atname:"mathvariant",atval:"fraktur",output:"fr",tex:null,ttype:G,codes:M},{input:"mathfrak",tag:"mstyle",atname:"mathvariant",atval:"fraktur",output:"mathfrak",tex:null,ttype:G,codes:M}];function V(ah,ag){if(ah.input>ag.input){return 1}else{return -1}}var T=[];function u(){var ah=[],ag;for(ag=0;ag<F.length;ag++){if(F[ag].tex){ah[ah.length]={input:F[ag].tex,tag:F[ag].tag,output:F[ag].output,ttype:F[ag].ttype}}}F=F.concat(ah);F.sort(V);for(ag=0;ag<F.length;ag++){T[ag]=F[ag].input}}var X="http://www.w3.org/1998/Math/MathML";function Q(ag){if(p){return g.createElement("m:"+ag)}else{return g.createElementNS(X,ag)}}function L(ag,ai){if(p){var ah=g.createElement("m:"+ag)}else{ah=g.createElementNS(X,ag)}ah.appendChild(ai);return ah}function A(ag,ah){F=F.concat([{input:ag,tag:"mo",output:ah,tex:null,ttype:Y}])}function t(ai,aj){var ag;if(ai.charAt(aj)=="\\"&&ai.charAt(aj+1)!="\\"&&ai.charAt(aj+1)!=" "){ag=ai.slice(aj+1)}else{ag=ai.slice(aj)}for(var ah=0;ah<ag.length&&ag.charCodeAt(ah)<=32;ah=ah+1){}return ag.slice(ah)}function c(ah,ak,al){if(al==0){var aj,ag;al=-1;aj=ah.length;while(al+1<aj){ag=(al+aj)>>1;if(ah[ag]<ak){al=ag}else{aj=ag}}return aj}else{for(var ai=al;ai<ah.length&&ah[ai]<ak;ai++){}}return ai}function m(am){var ag=0;var ah=0;var aj;var ap;var ao;var ak="";var al=true;for(var ai=1;ai<=am.length&&al;ai++){ap=am.slice(0,ai);ah=ag;ag=c(T,ap,ah);if(ag<T.length&&am.slice(0,T[ag].length)==T[ag]){ak=T[ag];aj=ag;ai=ak.length}al=ag<T.length&&am.slice(0,T[ag].length)>=T[ag]}x=E;if(ak!=""){E=F[aj].ttype;return F[aj]}E=d;ag=1;ap=am.slice(0,1);var an=true;while("0"<=ap&&ap<="9"&&ag<=am.length){ap=am.slice(ag,ag+1);ag++}if(ap==f){ap=am.slice(ag,ag+1);if("0"<=ap&&ap<="9"){an=false;ag++;while("0"<=ap&&ap<="9"&&ag<=am.length){ap=am.slice(ag,ag+1);ag++}}}if((an&&ag>1)||ag>2){ap=am.slice(0,ag-1);ao="mn"}else{ag=2;ap=am.slice(0,1);ao=(("A">ap||ap>"Z")&&("a">ap||ap>"z")?"mo":"mi")}if(ap=="-"&&x==l){return{input:ap,tag:ao,output:ap,ttype:G,func:true}}return{input:ap,tag:ao,output:ap,ttype:d}}function S(ah){var ag;if(ah.nodeName=="mrow"){ag=ah.firstChild.firstChild.nodeValue;if(ag=="("||ag=="["||ag=="{"){ah.removeChild(ah.firstChild)}}if(ah.nodeName=="mrow"){ag=ah.lastChild.firstChild.nodeValue;if(ag==")"||ag=="]"||ag=="}"){ah.removeChild(ah.lastChild)}}}var J,x,E;function K(am){var ai,ah,ap,ak,ao,al=g.createDocumentFragment();am=t(am,0);ai=m(am);if(ai==null||ai.ttype==k&&J>0){return[null,am]}if(ai.ttype==Y){am=ai.output+t(am,ai.input.length);ai=m(am)}switch(ai.ttype){case O:case d:am=t(am,ai.input.length);return[L(ai.tag,g.createTextNode(ai.output)),am];case b:J++;am=t(am,ai.input.length);ap=v(am,true);J--;if(typeof ai.invisible=="boolean"&&ai.invisible){ah=L("mrow",ap[0])}else{ah=L("mo",g.createTextNode(ai.output));ah=L("mrow",ah);ah.appendChild(ap[0])}return[ah,ap[1]];case aa:if(ai!=o){am=t(am,ai.input.length)}if(am.charAt(0)=="{"){ak=am.indexOf("}")}else{if(am.charAt(0)=="("){ak=am.indexOf(")")}else{if(am.charAt(0)=="["){ak=am.indexOf("]")}else{if(ai==o){ak=am.slice(1).indexOf('"')+1}else{ak=0}}}}if(ak==-1){ak=am.length}ao=am.slice(1,ak);if(ao.charAt(0)==" "){ah=Q("mspace");ah.setAttribute("width","1ex");al.appendChild(ah)}al.appendChild(L(ai.tag,g.createTextNode(ao)));if(ao.charAt(ao.length-1)==" "){ah=Q("mspace");ah.setAttribute("width","1ex");al.appendChild(ah)}am=t(am,ak+1);return[L("mrow",al),am];case G:am=t(am,ai.input.length);ap=K(am);if(ap[0]==null){return[L(ai.tag,g.createTextNode(ai.output)),am]}if(typeof ai.func=="boolean"&&ai.func){ao=am.charAt(0);if(ao=="^"||ao=="_"||ao=="/"||ao=="|"||ao==","){return[L(ai.tag,g.createTextNode(ai.output)),am]}else{ah=L("mrow",L(ai.tag,g.createTextNode(ai.output)));ah.appendChild(ap[0]);return[ah,ap[1]]}}S(ap[0]);if(ai.input=="sqrt"){return[L(ai.tag,ap[0]),ap[1]]}else{if(typeof ai.acc=="boolean"&&ai.acc){ah=L(ai.tag,ap[0]);ah.appendChild(L("mo",g.createTextNode(ai.output)));return[ah,ap[1]]}else{if(!p&&typeof ai.codes!="undefined"){for(ak=0;ak<ap[0].childNodes.length;ak++){if(ap[0].childNodes[ak].nodeName=="mi"||ap[0].nodeName=="mi"){ao=(ap[0].nodeName=="mi"?ap[0].firstChild.nodeValue:ap[0].childNodes[ak].firstChild.nodeValue);var an=[];for(var aj=0;aj<ao.length;aj++){if(ao.charCodeAt(aj)>64&&ao.charCodeAt(aj)<91){an=an+String.fromCharCode(ai.codes[ao.charCodeAt(aj)-65])}else{an=an+ao.charAt(aj)}}if(ap[0].nodeName=="mi"){ap[0]=Q("mo").appendChild(g.createTextNode(an))}else{ap[0].replaceChild(Q("mo").appendChild(g.createTextNode(an)),ap[0].childNodes[ak])}}}}ah=L(ai.tag,ap[0]);ah.setAttribute(ai.atname,ai.atval);return[ah,ap[1]]}}case W:am=t(am,ai.input.length);ap=K(am);if(ap[0]==null){return[L("mo",g.createTextNode(ai.input)),am]}S(ap[0]);var ag=K(ap[1]);if(ag[0]==null){return[L("mo",g.createTextNode(ai.input)),am]}S(ag[0]);if(ai.input=="root"||ai.input=="stackrel"){al.appendChild(ag[0])}al.appendChild(ap[0]);if(ai.input=="frac"){al.appendChild(ag[0])}return[L(ai.tag,al),ag[1]];case l:am=t(am,ai.input.length);return[L("mo",g.createTextNode(ai.output)),am];case a:am=t(am,ai.input.length);ah=Q("mspace");ah.setAttribute("width","1ex");al.appendChild(ah);al.appendChild(L(ai.tag,g.createTextNode(ai.output)));ah=Q("mspace");ah.setAttribute("width","1ex");al.appendChild(ah);return[L("mrow",al),am];case q:J++;am=t(am,ai.input.length);ap=v(am,false);J--;ao="";if(ap[0].lastChild!=null){ao=ap[0].lastChild.firstChild.nodeValue}if(ao=="|"){ah=L("mo",g.createTextNode(ai.output));ah=L("mrow",ah);ah.appendChild(ap[0]);return[ah,ap[1]]}else{ah=L("mo",g.createTextNode(ai.output));ah=L("mrow",ah);return[ah,am]}default:am=t(am,ai.input.length);return[L(ai.tag,g.createTextNode(ai.output)),am]}}function y(am){var ak,an,al,aj,ag,ai;am=t(am,0);an=m(am);ag=K(am);aj=ag[0];am=ag[1];ak=m(am);if(ak.ttype==l&&ak.input!="/"){am=t(am,ak.input.length);ag=K(am);if(ag[0]==null){ag[0]=L("mo",g.createTextNode("\u25A1"))}else{S(ag[0])}am=ag[1];if(ak.input=="_"){al=m(am);ai=(an.ttype==O);if(al.input=="^"){am=t(am,al.input.length);var ah=K(am);S(ah[0]);am=ah[1];aj=L((ai?"munderover":"msubsup"),aj);aj.appendChild(ag[0]);aj.appendChild(ah[0]);aj=L("mrow",aj)}else{aj=L((ai?"munder":"msub"),aj);aj.appendChild(ag[0])}}else{aj=L(ak.tag,aj);aj.appendChild(ag[0])}}return[aj,am]}function v(ao,an){var at,ap,ak,aw,al=g.createDocumentFragment();do{ao=t(ao,0);ak=y(ao);ap=ak[0];ao=ak[1];at=m(ao);if(at.ttype==l&&at.input=="/"){ao=t(ao,at.input.length);ak=y(ao);if(ak[0]==null){ak[0]=L("mo",g.createTextNode("\u25A1"))}else{S(ak[0])}ao=ak[1];S(ap);ap=L(at.tag,ap);ap.appendChild(ak[0]);al.appendChild(ap);at=m(ao)}else{if(ap!=undefined){al.appendChild(ap)}}}while((at.ttype!=k&&(at.ttype!=q||an)||J==0)&&at!=null&&at.output!="");if(at.ttype==k||at.ttype==q){var ax=al.childNodes.length;if(ax>0&&al.childNodes[ax-1].nodeName=="mrow"&&ax>1&&al.childNodes[ax-2].nodeName=="mo"&&al.childNodes[ax-2].firstChild.nodeValue==","){var az=al.childNodes[ax-1].lastChild.firstChild.nodeValue;if(az==")"||az=="]"){var ah=al.childNodes[ax-1].firstChild.firstChild.nodeValue;if(ah=="("&&az==")"&&at.output!="}"||ah=="["&&az=="]"){var ai=[];var au=true;var aq=al.childNodes.length;for(aw=0;au&&aw<aq;aw=aw+2){ai[aw]=[];ap=al.childNodes[aw];if(au){au=ap.nodeName=="mrow"&&(aw==aq-1||ap.nextSibling.nodeName=="mo"&&ap.nextSibling.firstChild.nodeValue==",")&&ap.firstChild.firstChild.nodeValue==ah&&ap.lastChild.firstChild.nodeValue==az}if(au){for(var av=0;av<ap.childNodes.length;av++){if(ap.childNodes[av].firstChild.nodeValue==","){ai[aw][ai[aw].length]=av}}}if(au&&aw>1){au=ai[aw].length==ai[aw-2].length}}if(au){var aj,ag,am,ar,ay=g.createDocumentFragment();for(aw=0;aw<aq;aw=aw+2){aj=g.createDocumentFragment();ag=g.createDocumentFragment();ap=al.firstChild;am=ap.childNodes.length;ar=0;ap.removeChild(ap.firstChild);for(av=1;av<am-1;av++){if(typeof ai[aw][ar]!="undefined"&&av==ai[aw][ar]){ap.removeChild(ap.firstChild);aj.appendChild(L("mtd",ag));ar++}else{ag.appendChild(ap.firstChild)}}aj.appendChild(L("mtd",ag));if(al.childNodes.length>2){al.removeChild(al.firstChild);al.removeChild(al.firstChild)}ay.appendChild(L("mtr",aj))}ap=L("mtable",ay);if(typeof at.invisible=="boolean"&&at.invisible){ap.setAttribute("columnalign","left")}al.replaceChild(ap,al.firstChild)}}}}ao=t(ao,at.input.length);if(typeof at.invisible!="boolean"||!at.invisible){ap=L("mo",g.createTextNode(at.output));al.appendChild(ap)}}return[al,ao]}function e(ai){var ah=Q("mstyle");if(H!=""){ah.setAttribute("mathcolor",H)}if(s){ah.setAttribute("displaystyle","true")}if(ab!=""){ah.setAttribute("fontfamily",ab)}J=0;ah.appendChild(v(ai.replace(/^\s+/g,""),false)[0]);ah=L("math",ah);if(B){ah.setAttribute("title",ai.replace(/\s+/g," "))}if(ab!=""&&(p||ab!="serif")){var ag=U("font");ag.setAttribute("face",ab);ag.appendChild(ah);return ag}return ah}B=false;ab="";H="";(function(){for(var ah=0,ag=F.length;ah<ag;ah++){if(F[ah].codes){delete F[ah].codes}if(F[ah].func){F[ah].tag="mi"}}})();F.push({input:"gt",tag:"mo",output:">",tex:null,ttype:d},{input:"gt=",tag:"mo",output:"\u2265",tex:"geq",ttype:d},{input:"-<=",tag:"mo",output:"\u2AAF",tex:"preceq",ttype:d},{input:">-=",tag:"mo",output:"\u2AB0",tex:"succeq",ttype:d},{input:"'",tag:"mo",output:"\u2032",tex:"prime",ttype:d},{input:"arcsin",tag:"mi",output:"arcsin",tex:null,ttype:G,func:true},{input:"arccos",tag:"mi",output:"arccos",tex:null,ttype:G,func:true},{input:"arctan",tag:"mi",output:"arctan",tex:null,ttype:G,func:true},{input:"coth",tag:"mi",output:"coth",tex:null,ttype:G,func:true},{input:"sech",tag:"mi",output:"sech",tex:null,ttype:G,func:true},{input:"csch",tag:"mi",output:"csch",tex:null,ttype:G,func:true},{input:"abs",tag:"mi",output:"abs",tex:null,ttype:G,func:true},{input:"exp",tag:"mi",output:"exp",tex:null,ttype:G,func:true},{input:"tilde",tag:"mover",output:"~",tex:null,ttype:G,acc:true});ae.Augment({AM:{Init:function(){s=ae.config.displaystyle;decimal=ae.config.decimal;D();u()},Augment:function(ag){for(var ah in ag){if(ag.hasOwnProperty(ah)){switch(ah){case"displaystyle":s=ag[ah];break;case"decimal":decimal=ag[ah];break;case"parseMath":e=ag[ah];break;case"parseExpr":v=ag[ah];break;case"parseIexpr":y=ag[ah];break;case"parseSexpr":K=ag[ah];break;case"removeBrackets":S=ag[ah];break;case"getSymbol":m=ag[ah];break;case"position":c=ag[ah];break;case"removeCharsAndBlanks":t=ag[ah];break;case"createMmlNode":L=ag[ah];break;case"createElementMathML":Q=ag[ah];break;case"createElementXHTML":U=ag[ah];break;case"initSymbols":u=ag[ah];break;case"compareNames":comareNames=ag[ah];break}this[ah]=ag[ah]}}},parseMath:e,parseExpr:v,parseIexpr:y,parseSexr:K,removeBrackets:S,getSymbol:m,position:c,removeCharsAndBlanks:t,createMmlNode:L,createElementMathML:Q,createElementXHTML:U,initSymbols:u,compareNames:V,createDocumentFragment:Z,document:g,define:A,symbols:F,names:T,TOKEN:{CONST:d,UNARY:G,BINARY:W,INFIX:l,LEFTBRACKET:b,RIGHTBRACKET:k,SPACE:a,UNDEROVER:O,DEFINITION:Y,LEFTRIGHT:q,TEXT:aa}}});var ac=[R,N];ac=null})(MathJax.InputJax.AsciiMath);(function(b){var a;b.Augment({sourceMenuTitle:"AsciiMath input",prefilterHooks:MathJax.Callback.Hooks(true),postfilterHooks:MathJax.Callback.Hooks(true),Translate:function(c){var d,f=c.innerHTML.replace(/^\s+/,"").replace(/\s+$/,"");var g={math:f,script:c};this.prefilterHooks.Execute(g);f=g.math;try{d=this.AM.parseMath(f)}catch(e){if(!e.asciimathError){throw e}d=this.formatError(e,f)}g.math=a(d);this.postfilterHooks.Execute(g);return g.math},formatError:function(f,e,c){var d=f.message.replace(/\n.*/,"");MathJax.Hub.signal.Post(["AsciiMath Jax - parse error",d,e,c]);return a.merror(d)},Error:function(c){throw MathJax.Hub.Insert(Error(c),{asciimathError:true})},Startup:function(){a=MathJax.ElementJax.mml;this.AM.Init()}});b.loadComplete("jax.js")})(MathJax.InputJax.AsciiMath); + diff --git a/unpacked/extensions/asciimath2jax.js b/unpacked/extensions/asciimath2jax.js @@ -0,0 +1,228 @@ +/************************************************************* + * + * MathJax/extensions/asciimath2jax.js + * + * Implements the AsciiMath to Jax preprocessor that locates AsciiMath + * code within the text of a document and replaces it with SCRIPT tags for + * processing by MathJax. + * + * Modified by David Lippman, based on tex2jax.js. + * Additional work by Davide P. Cervone. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2012 Design Science, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +MathJax.Extension.asciimath2jax = { + version: "1.0", + config: { + delimiters: ['`'], // The delimiter(s) for asciimath code + + skipTags: ["script","noscript","style","textarea","pre","code"], + // The names of the tags whose contents will not be + // scanned for math delimiters + + ignoreClass: "asciimath2jax_ignore", // the class name of elements whose contents should + // NOT be processed by asciimath2jax. Note that this + // is a regular expression, so be sure to quote any + // regexp special characters + + processClass: "asciimath2jax_process", // the class name of elements whose contents SHOULD + // be processed when they appear inside ones that + // are ignored. Note that this is a regular expression, + // so be sure to quote any regexp special characters + + preview: "AsciiMath" // set to "none" to not insert MathJax_Preview spans + // or set to an array specifying an HTML snippet + // to use the same preview for every equation. + + }, + + PreProcess: function (element) { + if (!this.configured) { + this.config = MathJax.Hub.CombineConfig("asciimath2jax",this.config); + if (this.config.Augment) {MathJax.Hub.Insert(this,this.config.Augment)} + this.configured = true; + } + if (typeof(element) === "string") {element = document.getElementById(element)} + if (!element) {element = document.body} + if (this.createPatterns()) {this.scanElement(element,element.nextSibling)} + }, + + createPatterns: function () { + var starts = [], i, m, config = this.config; this.match = {}; + if (config.delimiters.length === 0) {return false} + for (i = 0, m = config.delimiters.length; i < m; i++) { + starts.push(this.patternQuote(config.delimiters[i])); + this.match[config.delimiters[i]] = { + mode: "", + end: config.delimiters[i], + pattern: this.endPattern(config.delimiters[i]) + }; + } + this.start = new RegExp(starts.sort(this.sortLength).join("|"),"g"); + this.skipTags = new RegExp("^("+config.skipTags.join("|")+")$","i"); + this.ignoreClass = new RegExp("(^| )("+config.ignoreClass+")( |$)"); + this.processClass = new RegExp("(^| )("+config.processClass+")( |$)"); + return true; + }, + + patternQuote: function (s) {return s.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,'\\$1')}, + + endPattern: function (end) { + return new RegExp(this.patternQuote(end)+"|\\\\.","g"); + }, + + sortLength: function (a,b) { + if (a.length !== b.length) {return b.length - a.length} + return (a == b ? 0 : (a < b ? -1 : 1)); + }, + + scanElement: function (element,stop,ignore) { + var cname, tname, ignoreChild, process; + while (element && element != stop) { + if (element.nodeName.toLowerCase() === '#text') { + if (!ignore) {element = this.scanText(element)} + } else { + cname = (typeof(element.className) === "undefined" ? "" : element.className); + tname = (typeof(element.tagName) === "undefined" ? "" : element.tagName); + if (typeof(cname) !== "string") {cname = String(cname)} // jsxgraph uses non-string class names! + process = this.processClass.exec(cname); + if (element.firstChild && !cname.match(/(^| )MathJax/) && + (process || !this.skipTags.exec(tname))) { + ignoreChild = (ignore || this.ignoreClass.exec(cname)) && !process; + this.scanElement(element.firstChild,stop,ignoreChild); + } + } + if (element) {element = element.nextSibling} + } + }, + + scanText: function (element) { + if (element.nodeValue.replace(/\s+/,'') == '') {return element} + var match, prev; + this.search = {start: true}; + this.pattern = this.start; + while (element) { + this.pattern.lastIndex = 0; + while (element && element.nodeName.toLowerCase() === '#text' && + (match = this.pattern.exec(element.nodeValue))) { + if (this.search.start) {element = this.startMatch(match,element)} + else {element = this.endMatch(match,element)} + } + if (this.search.matched) {element = this.encloseMath(element)} + if (element) { + do {prev = element; element = element.nextSibling} + while (element && (element.nodeName.toLowerCase() === 'br' || + element.nodeName.toLowerCase() === '#comment')); + if (!element || element.nodeName !== '#text') {return prev} + } + } + return element; + }, + + startMatch: function (match,element) { + var delim = this.match[match[0]]; + if (delim != null) { + this.search = { + end: delim.end, mode: delim.mode, + open: element, olen: match[0].length, + opos: this.pattern.lastIndex - match[0].length + }; + this.switchPattern(delim.pattern); + } + return element; + }, + + endMatch: function (match,element) { + if (match[0] == this.search.end) { + this.search.close = element; + this.search.cpos = this.pattern.lastIndex; + this.search.clen = (this.search.isBeginEnd ? 0 : match[0].length); + this.search.matched = true; + element = this.encloseMath(element); + this.switchPattern(this.start); + } + return element; + }, + + switchPattern: function (pattern) { + pattern.lastIndex = this.pattern.lastIndex; + this.pattern = pattern; + this.search.start = (pattern === this.start); + }, + + encloseMath: function (element) { + var search = this.search, close = search.close, CLOSE, math; + if (search.cpos === close.length) {close = close.nextSibling} + else {close = close.splitText(search.cpos)} + if (!close) {CLOSE = close = MathJax.HTML.addText(search.close.parentNode,"")} + search.close = close; + math = (search.opos ? search.open.splitText(search.opos) : search.open); + while (math.nextSibling && math.nextSibling !== close) { + if (math.nextSibling.nodeValue !== null) { + if (math.nextSibling.nodeName === "#comment") { + math.nodeValue += math.nextSibling.nodeValue.replace(/^\[CDATA\[((.|\n|\r)*)\]\]$/,"$1"); + } else { + math.nodeValue += math.nextSibling.nodeValue; + } + } else if (this.msieNewlineBug) { + math.nodeValue += (math.nextSibling.nodeName.toLowerCase() === "br" ? "\n" : " "); + } else { + math.nodeValue += " "; + } + math.parentNode.removeChild(math.nextSibling); + } + var TeX = math.nodeValue.substr(search.olen,math.nodeValue.length-search.olen-search.clen); + math.parentNode.removeChild(math); + if (this.config.preview !== "none") {this.createPreview(search.mode,TeX)} + math = this.createMathTag(search.mode,TeX); + this.search = {}; this.pattern.lastIndex = 0; + if (CLOSE) {CLOSE.parentNode.removeChild(CLOSE)} + return math; + }, + + insertNode: function (node) { + var search = this.search; + search.close.parentNode.insertBefore(node,search.close); + }, + + createPreview: function (mode,asciimath) { + var preview; + if (this.config.preview === "AsciiMath") {preview = [this.filterAM(asciimath)]} + else if (this.config.preview instanceof Array) {preview = this.config.preview} + if (preview) { + preview = MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},preview); + this.insertNode(preview); + } + }, + + createMathTag: function (mode,asciimath) { + var script = document.createElement("script"); + script.type = "math/asciimath" + mode; + MathJax.HTML.setScript(script,asciimath); + this.insertNode(script); + return script; + }, + + filterAM: function (asciimath) {return asciimath}, + + msieNewlineBug: (MathJax.Hub.Browser.isMSIE && (document.documentMode||0) < 9) + +}; + +MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.asciimath2jax]); +MathJax.Ajax.loadComplete("[MathJax]/extensions/asciimath2jax.js"); diff --git a/unpacked/jax/input/AsciiMath/config.js b/unpacked/jax/input/AsciiMath/config.js @@ -0,0 +1,41 @@ +/************************************************************* + * + * MathJax/jax/input/AsciiMath/config.js + * + * Initializes the AsciiMath InputJax (the main definition is in + * MathJax/jax/input/AsciiMath/jax.js, which is loaded when needed). + * + * Originally adapted for MathJax by David Lippman. + * Additional work done by Davide P. Cervone. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2012 Design Science, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +MathJax.InputJax.AsciiMath = MathJax.InputJax({ + id: "AsciiMath", + version: "1.0", + directory: MathJax.InputJax.directory + "/AsciiMath", + extensionDir: MathJax.InputJax.extensionDir + "/AsciiMath", + + config: { + displaystyle: true, // put limits above and below operators + decimal: "." // can change to "," but watch out for "(1,2)" + } +}); +MathJax.InputJax.AsciiMath.Register("math/asciimath"); + +MathJax.InputJax.AsciiMath.loadComplete("config.js"); diff --git a/unpacked/jax/input/AsciiMath/jax.js b/unpacked/jax/input/AsciiMath/jax.js @@ -0,0 +1,1287 @@ +/************************************************************* + * + * MathJax/jax/input/AsciiMath/jax.js + * + * An Input Jax for AsciiMath notation + * (see http://www1.chapman.edu/~jipsen/mathml/asciimath.html). + * + * Originally adapted for MathJax by David Lippman. + * Additional work done by Davide P. Cervone. + * + * A portion of this file is taken from + * ASCIIMathML.js Version 1.4.7 Aug 30, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen + * and is used by permission of Peter Jipsen, who has agreed to allow us to + * release it under the Apache2 license (see below). That portion is indicated + * via comments. + * + * The remainder falls under the copyright that follows. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2012 Design Science, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function (ASCIIMATH) { + + var MML; // Filled in later + + // + // Make a documentFragment work-alike that uses MML objects + // rather than DOM objects. + // + var DOCFRAG = MathJax.Object.Subclass({ + firstChild: null, + lastChild: null, + Init: function () { + this.childNodes = []; + }, + appendChild: function (node) { + if (node.parent) {node.parent.removeChild(node)} + if (this.lastChild) {this.lastChild.nextSibling = node} + if (!this.firstChild) {this.firstChild = node} + this.childNodes.push(node); node.parent = this; + this.lastChild = node; + return node; + }, + removeChild: function (node) { + for (var i = 0, m = this.childNodes.length; i < m; i++) + {if (this.childNodes[i] === node) break} + if (i === m) return; + this.childNodes.splice(i,1); + if (node === this.firstChild) {this.firstChild = node.nextSibling} + if (node === this.lastChild) { + if (!this.childNodes.length) {this.lastChild = null} + else {this.lastChild = this.childNodes[this.childNodes.length-1]} + } + if (i) {this.childNodes[i-1].nextSibling = node.nextSibling} + node.nextSibling = node.parent = null; + return node; + }, + replaceChild: function (node,old) { + for (var i = 0, m = this.childNodes.length; i < m; i++) + {if (this.childNodes[i] === old) break} + if (i) {this.childNodes[i-1].nextSibling = node} else {this.firstChild = node} + if (i >= m-1) {this.lastChild = node} + this.childNodes[i] = node; node.nextSibling = old.nextSibling; + old.nextSibling = old.parent = null; + return old; + } + }); + + var INITASCIIMATH = function () { + MML = MathJax.ElementJax.mml; + var MBASEINIT = MML.mbase.prototype.Init; + + // + // Make MML elements looks like DOM elements (add the + // methods that AsciiMath needs) + // + MML.mbase.Augment({ + firstChild: null, + lastChild: null, + nodeValue: "", + nextSibling: null, + Init: function () { + var obj = MBASEINIT.apply(this,arguments) || this; + obj.childNodes = obj.data; + obj.nodeName = obj.type; + return obj; + }, + appendChild: function (node) { + if (node.parent) {node.parent.removeChild(node)} + var nodes = arguments; if (node.isa(DOCFRAG)) {nodes = node.childNodes} + for (var i = 0, m = nodes.length; i < m; i++) { + node = nodes[i]; + if (this.lastChild) {this.lastChild.nextSibling = node} + if (!this.firstChild) {this.firstChild = node} + this.Append(node); + this.lastChild = node; + this.nodeValue += node.nodeValue; + } + return node; + }, + removeChild: function (node) { + for (var i = 0, m = this.childNodes.length; i < m; i++) + {if (this.childNodes[i] === node) break} + if (i === m) return; + this.childNodes.splice(i,1); + if (node === this.firstChild) {this.firstChild = node.nextSibling} + if (node === this.lastChild) { + if (!this.childNodes.length) {this.lastChild = null} + else {this.lastChild = this.childNodes[this.childNodes.length-1]} + } + if (i) {this.childNodes[i-1].nextSibling = node.nextSibling} + this.nodeValue = ""; + for (i = 0, m = this.childNodes.length; i < m; i++) + {this.nodeValue += this.childNodes[i].nodeValue} + node.nextSibling = node.parent = null; + return node; + }, + replaceChild: function (node,old) { + for (var i = 0, m = this.childNodes.length; i < m; i++) + {if (this.childNodes[i] === old) break} + // FIXME: make this work with DOCFRAG's? + if (i) {this.childNodes[i-1].nextSibling = node} else {this.firstChild = node} + if (i >= m-1) {this.lastChild = node} + this.SetData(i,node); node.nextSibling = old.nextSibling; + this.nodeValue = ""; + for (i = 0, m = this.childNodes.length; i < m; i++) + {this.nodeValue += this.childNodes[i].nodeValue} + old.nextSibling = old.parent = null; + return old; + }, + setAttribute: function (name,value) {this[name] = value} + }); + }; + + // + // Set up to isolate ASCIIMathML.js + // + + var window = {}; // hide the true window + + // + // Hide the true document, and add functions that + // use and produce MML objects instead of DOM objects + // + var document = { + getElementById: true, + createElementNS: function (ns,type) {return MML[type]()}, + createTextNode: function (text) {return MML.chars(text).With({nodeValue:text})}, + createDocumentFragment: function () {return DOCFRAG()} + }; + + var navigator = {appName: "MathJax"}; // hide the true navigator object + + +/****************************************************************** + * + * The following section is ASCIIMathML.js Version 1.4.7 + * (c) Peter Jipsen, used with permission. + * + * Some sections are commented out to save space in the + * minified version (but that is not strictly necessary). + * A few items are commented out and marked with DPVC comments + * in order to keep the minifier from complaining about the + * coding practices in ASCIIMathML.js + * + ******************************************************************/ + +/* +ASCIIMathML.js +============== +This file contains JavaScript functions to convert ASCII math notation +to Presentation MathML. The conversion is done while the (X)HTML page +loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet +Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/). +Just add the next line to your (X)HTML page with this file in the same folder: +<script type="text/javascript" src="ASCIIMathML.js"></script> +This is a convenient and inexpensive solution for authoring MathML. + +Version 1.4.7 Aug 30, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen +Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js +For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt +If you use it on a webpage, please send the URL to jipsen@chapman.edu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program 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 +General Public License (at http://www.gnu.org/copyleft/gpl.html) +for more details. +*/ + +//var checkForMathML = true; // check if browser can display MathML +//var notifyIfNoMathML = true; // display note if no MathML capability +//var alertIfNoMathML = true; // show alert box if no MathML capability +var mathcolor = "red"; // change it to "" (to inherit) or any other color +var mathfontfamily = "serif"; // change to "" to inherit (works in IE) + // or another family (e.g. "arial") +var displaystyle = true; // puts limits above and below large operators +var showasciiformulaonhover = true; // helps students learn ASCIIMath +var decimalsign = "."; // change to "," if you like, beware of `(1,2)`! +//var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters +//var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$"; +//var doubleblankmathdelimiter = false; // if true, x+1 is equal to `x+1` + // for IE this works only in <!-- --> +//var separatetokens;// has been removed (email me if this is a problem) +var isIE = document.createElementNS==null; + +/* + * if (document.getElementById==null) + * alert("This webpage requires a recent browser such as\ + * \nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer") + */ + +// all further global variables start with "AM" + +function AMcreateElementXHTML(t) { + if (isIE) return document.createElement(t); + else return document.createElementNS("http://www.w3.org/1999/xhtml",t); +} + +/* + * function AMnoMathMLNote() { + * var nd = AMcreateElementXHTML("h3"); + * nd.setAttribute("align","center") + * nd.appendChild(AMcreateElementXHTML("p")); + * nd.appendChild(document.createTextNode("To view the ")); + * var an = AMcreateElementXHTML("a"); + * an.appendChild(document.createTextNode("ASCIIMathML")); + * an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html"); + * nd.appendChild(an); + * nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+")); + * an = AMcreateElementXHTML("a"); + * an.appendChild(document.createTextNode("MathPlayer")); + * an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm"); + * nd.appendChild(an); + * nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox")); + * nd.appendChild(AMcreateElementXHTML("p")); + * return nd; + * } + * + * function AMisMathMLavailable() { + * if (navigator.appName.slice(0,8)=="Netscape") + * if (navigator.appVersion.slice(0,1)>="5") return null; + * else return AMnoMathMLNote(); + * else if (navigator.appName.slice(0,9)=="Microsoft") + * try { + * var ActiveX = new ActiveXObject("MathPlayer.Factory.1"); + * return null; + * } catch (e) { + * return AMnoMathMLNote(); + * } + * else return AMnoMathMLNote(); + * } + */ + +// character lists for Mozilla/Netscape fonts +var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46]; +var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128]; +var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124]; + +var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4, + RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8, + LEFTRIGHT = 9, TEXT = 10; // token types + +var AMsqrt = {input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY}, + AMroot = {input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY}, + AMfrac = {input:"frac", tag:"mfrac", output:"/", tex:null, ttype:BINARY}, + AMdiv = {input:"/", tag:"mfrac", output:"/", tex:null, ttype:INFIX}, + AMover = {input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY}, + AMsub = {input:"_", tag:"msub", output:"_", tex:null, ttype:INFIX}, + AMsup = {input:"^", tag:"msup", output:"^", tex:null, ttype:INFIX}, + AMtext = {input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT}, + AMmbox = {input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT}, + AMquote = {input:"\"", tag:"mtext", output:"mbox", tex:null, ttype:TEXT}; + +var AMsymbols = [ +//some greek symbols +{input:"alpha", tag:"mi", output:"\u03B1", tex:null, ttype:CONST}, +{input:"beta", tag:"mi", output:"\u03B2", tex:null, ttype:CONST}, +{input:"chi", tag:"mi", output:"\u03C7", tex:null, ttype:CONST}, +{input:"delta", tag:"mi", output:"\u03B4", tex:null, ttype:CONST}, +{input:"Delta", tag:"mo", output:"\u0394", tex:null, ttype:CONST}, +{input:"epsi", tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST}, +{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST}, +{input:"eta", tag:"mi", output:"\u03B7", tex:null, ttype:CONST}, +{input:"gamma", tag:"mi", output:"\u03B3", tex:null, ttype:CONST}, +{input:"Gamma", tag:"mo", output:"\u0393", tex:null, ttype:CONST}, +{input:"iota", tag:"mi", output:"\u03B9", tex:null, ttype:CONST}, +{input:"kappa", tag:"mi", output:"\u03BA", tex:null, ttype:CONST}, +{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST}, +{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST}, +{input:"mu", tag:"mi", output:"\u03BC", tex:null, ttype:CONST}, +{input:"nu", tag:"mi", output:"\u03BD", tex:null, ttype:CONST}, +{input:"omega", tag:"mi", output:"\u03C9", tex:null, ttype:CONST}, +{input:"Omega", tag:"mo", output:"\u03A9", tex:null, ttype:CONST}, +{input:"phi", tag:"mi", output:"\u03C6", tex:null, ttype:CONST}, +{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST}, +{input:"Phi", tag:"mo", output:"\u03A6", tex:null, ttype:CONST}, +{input:"pi", tag:"mi", output:"\u03C0", tex:null, ttype:CONST}, +{input:"Pi", tag:"mo", output:"\u03A0", tex:null, ttype:CONST}, +{input:"psi", tag:"mi", output:"\u03C8", tex:null, ttype:CONST}, +{input:"Psi", tag:"mi", output:"\u03A8", tex:null, ttype:CONST}, +{input:"rho", tag:"mi", output:"\u03C1", tex:null, ttype:CONST}, +{input:"sigma", tag:"mi", output:"\u03C3", tex:null, ttype:CONST}, +{input:"Sigma", tag:"mo", output:"\u03A3", tex:null, ttype:CONST}, +{input:"tau", tag:"mi", output:"\u03C4", tex:null, ttype:CONST}, +{input:"theta", tag:"mi", output:"\u03B8", tex:null, ttype:CONST}, +{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST}, +{input:"Theta", tag:"mo", output:"\u0398", tex:null, ttype:CONST}, +{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST}, +{input:"xi", tag:"mi", output:"\u03BE", tex:null, ttype:CONST}, +{input:"Xi", tag:"mo", output:"\u039E", tex:null, ttype:CONST}, +{input:"zeta", tag:"mi", output:"\u03B6", tex:null, ttype:CONST}, + +//binary operation symbols +{input:"*", tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST}, +{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST}, +{input:"//", tag:"mo", output:"/", tex:null, ttype:CONST}, +{input:"\\\\", tag:"mo", output:"\\", tex:"backslash", ttype:CONST}, +{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST}, +{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST}, +{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST}, +{input:"@", tag:"mo", output:"\u2218", tex:"circ", ttype:CONST}, +{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST}, +{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST}, +{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST}, +{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER}, +{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER}, +{input:"^^", tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST}, +{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER}, +{input:"vv", tag:"mo", output:"\u2228", tex:"vee", ttype:CONST}, +{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER}, +{input:"nn", tag:"mo", output:"\u2229", tex:"cap", ttype:CONST}, +{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER}, +{input:"uu", tag:"mo", output:"\u222A", tex:"cup", ttype:CONST}, +{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER}, + +//binary relation symbols +{input:"!=", tag:"mo", output:"\u2260", tex:"ne", ttype:CONST}, +{input:":=", tag:"mo", output:":=", tex:null, ttype:CONST}, +{input:"lt", tag:"mo", output:"<", tex:null, ttype:CONST}, +{input:"<=", tag:"mo", output:"\u2264", tex:"le", ttype:CONST}, +{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST}, +{input:">=", tag:"mo", output:"\u2265", tex:"ge", ttype:CONST}, +{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST}, +{input:"-<", tag:"mo", output:"\u227A", tex:"prec", ttype:CONST}, +{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST}, +{input:">-", tag:"mo", output:"\u227B", tex:"succ", ttype:CONST}, +{input:"in", tag:"mo", output:"\u2208", tex:null, ttype:CONST}, +{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST}, +{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST}, +{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST}, +{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST}, +{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST}, +{input:"-=", tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST}, +{input:"~=", tag:"mo", output:"\u2245", tex:"cong", ttype:CONST}, +{input:"~~", tag:"mo", output:"\u2248", tex:"approx", ttype:CONST}, +{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST}, + +//logical symbols +{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE}, +{input:"or", tag:"mtext", output:"or", tex:null, ttype:SPACE}, +{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST}, +{input:"=>", tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST}, +{input:"if", tag:"mo", output:"if", tex:null, ttype:SPACE}, +{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST}, +{input:"AA", tag:"mo", output:"\u2200", tex:"forall", ttype:CONST}, +{input:"EE", tag:"mo", output:"\u2203", tex:"exists", ttype:CONST}, +{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST}, +{input:"TT", tag:"mo", output:"\u22A4", tex:"top", ttype:CONST}, +{input:"|--", tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST}, +{input:"|==", tag:"mo", output:"\u22A8", tex:"models", ttype:CONST}, + +//grouping brackets +{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET}, +{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET}, +{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET}, +{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET}, +{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET}, +{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET}, +{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT}, +//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT}, +{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET}, +{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET}, +{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET}, +{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET}, +{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true}, +{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true}, + +//miscellaneous symbols +{input:"int", tag:"mo", output:"\u222B", tex:null, ttype:CONST}, +{input:"dx", tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION}, +{input:"dy", tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION}, +{input:"dz", tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION}, +{input:"dt", tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION}, +{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST}, +{input:"del", tag:"mo", output:"\u2202", tex:"partial", ttype:CONST}, +{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST}, +{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST}, +{input:"O/", tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST}, +{input:"oo", tag:"mo", output:"\u221E", tex:"infty", ttype:CONST}, +{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST}, +{input:"...", tag:"mo", output:"...", tex:"ldots", ttype:CONST}, +{input:":.", tag:"mo", output:"\u2234", tex:"therefore", ttype:CONST}, +{input:"/_", tag:"mo", output:"\u2220", tex:"angle", ttype:CONST}, +{input:"\\ ", tag:"mo", output:"\u00A0", tex:null, ttype:CONST}, +{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST}, +{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST}, +{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST}, +{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST}, +{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST}, +{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST}, +{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST}, +{input:"|__", tag:"mo", output:"\u230A", tex:"lfloor", ttype:CONST}, +{input:"__|", tag:"mo", output:"\u230B", tex:"rfloor", ttype:CONST}, +{input:"|~", tag:"mo", output:"\u2308", tex:"lceiling", ttype:CONST}, +{input:"~|", tag:"mo", output:"\u2309", tex:"rceiling", ttype:CONST}, +{input:"CC", tag:"mo", output:"\u2102", tex:null, ttype:CONST}, +{input:"NN", tag:"mo", output:"\u2115", tex:null, ttype:CONST}, +{input:"QQ", tag:"mo", output:"\u211A", tex:null, ttype:CONST}, +{input:"RR", tag:"mo", output:"\u211D", tex:null, ttype:CONST}, +{input:"ZZ", tag:"mo", output:"\u2124", tex:null, ttype:CONST}, +{input:"f", tag:"mi", output:"f", tex:null, ttype:UNARY, func:true}, +{input:"g", tag:"mi", output:"g", tex:null, ttype:UNARY, func:true}, + +//standard functions +{input:"lim", tag:"mo", output:"lim", tex:null, ttype:UNDEROVER}, +{input:"Lim", tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER}, +{input:"sin", tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true}, +{input:"cos", tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true}, +{input:"tan", tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true}, +{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true}, +{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true}, +{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true}, +{input:"cot", tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true}, +{input:"sec", tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true}, +{input:"csc", tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true}, +{input:"log", tag:"mo", output:"log", tex:null, ttype:UNARY, func:true}, +{input:"ln", tag:"mo", output:"ln", tex:null, ttype:UNARY, func:true}, +{input:"det", tag:"mo", output:"det", tex:null, ttype:UNARY, func:true}, +{input:"dim", tag:"mo", output:"dim", tex:null, ttype:CONST}, +{input:"mod", tag:"mo", output:"mod", tex:null, ttype:CONST}, +{input:"gcd", tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true}, +{input:"lcm", tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true}, +{input:"lub", tag:"mo", output:"lub", tex:null, ttype:CONST}, +{input:"glb", tag:"mo", output:"glb", tex:null, ttype:CONST}, +{input:"min", tag:"mo", output:"min", tex:null, ttype:UNDEROVER}, +{input:"max", tag:"mo", output:"max", tex:null, ttype:UNDEROVER}, + +//arrows +{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST}, +{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST}, +{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST}, +{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST}, +{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST}, +{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST}, +{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST}, +{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST}, +{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST}, +{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST}, + +//commands with argument +AMsqrt, AMroot, AMfrac, AMdiv, AMover, AMsub, AMsup, +{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true}, +{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true}, +{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true}, +{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true}, +{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true}, +{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true}, +AMtext, AMmbox, AMquote, +{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY}, +{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY}, +{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY}, +{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY}, +{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb}, +{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb}, +{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal}, +{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal}, +{input:"tt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY}, +{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY}, +{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk}, +{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk} +]; + +function compareNames(s1,s2) { + if (s1.input > s2.input) return 1 + else return -1; +} + +var AMnames = []; //list of input symbols + +function AMinitSymbols() { + var texsymbols = [], i; + for (i=0; i<AMsymbols.length; i++) + if (AMsymbols[i].tex) + texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, + tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype}; + AMsymbols = AMsymbols.concat(texsymbols); + AMsymbols.sort(compareNames); + for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input; +} + +var AMmathml = "http://www.w3.org/1998/Math/MathML"; + +function AMcreateElementMathML(t) { + if (isIE) return document.createElement("m:"+t); + else return document.createElementNS(AMmathml,t); +} + +function AMcreateMmlNode(t,frag) { +// var node = AMcreateElementMathML(name); + if (isIE) var node = document.createElement("m:"+t); + else /*var*//*DPVC*/ node = document.createElementNS(AMmathml,t); + node.appendChild(frag); + return node; +} + +function newcommand(oldstr,newstr) { + AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr, + tex:null, ttype:DEFINITION}]); +} + +function AMremoveCharsAndBlanks(str,n) { +//remove n characters and any following blanks + var st; + if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ") + st = str.slice(n+1); + else st = str.slice(n); + for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1); + return st.slice(i); +} + +function AMposition(arr, str, n) { +// return position >=n where str appears or would be inserted +// assumes arr is sorted + if (n==0) { + var h,m; + n = -1; + h = arr.length; + while (n+1<h) { + m = (n+h) >> 1; + if (arr[m]<str) n = m; else h = m; + } + return h; + } else + for (var i=n; i<arr.length && arr[i]<str; i++); + return i; // i=arr.length || arr[i]>=str +} + +function AMgetSymbol(str) { +//return maximal initial substring of str that appears in names +//return null if there is none + var k = 0; //new pos + var j = 0; //old pos + var mk; //match pos + var st; + var tagst; + var match = ""; + var more = true; + for (var i=1; i<=str.length && more; i++) { + st = str.slice(0,i); //initial substring of length i + j = k; + k = AMposition(AMnames, st, j); + if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){ + match = AMnames[k]; + mk = k; + i = match.length; + } + more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k]; + } + AMpreviousSymbol=AMcurrentSymbol; + if (match!=""){ + AMcurrentSymbol=AMsymbols[mk].ttype; + return AMsymbols[mk]; + } +// if str[0] is a digit or - return maxsubstring of digits.digits + AMcurrentSymbol=CONST; + k = 1; + st = str.slice(0,1); + var integ = true; + while ("0"<=st && st<="9" && k<=str.length) { + st = str.slice(k,k+1); + k++; + } + if (st == decimalsign) { + st = str.slice(k,k+1); + if ("0"<=st && st<="9") { + integ = false; + k++; + while ("0"<=st && st<="9" && k<=str.length) { + st = str.slice(k,k+1); + k++; + } + } + } + if ((integ && k>1) || k>2) { + st = str.slice(0,k-1); + tagst = "mn"; + } else { + k = 2; + st = str.slice(0,1); //take 1 character + tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi"); + } + if (st=="-" && AMpreviousSymbol==INFIX) + return {input:st, tag:tagst, output:st, ttype:UNARY, func:true}; + return {input:st, tag:tagst, output:st, ttype:CONST}; +} + +function AMremoveBrackets(node) { + var st; + if (node.nodeName=="mrow") { + st = node.firstChild.firstChild.nodeValue; + if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild); + } + if (node.nodeName=="mrow") { + st = node.lastChild.firstChild.nodeValue; + if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild); + } +} + +/*Parsing ASCII math expressions with the following grammar +v ::= [A-Za-z] | greek letters | numbers | other constant symbols +u ::= sqrt | text | bb | other unary symbols for font commands +b ::= frac | root | stackrel binary symbols +l ::= ( | [ | { | (: | {: left brackets +r ::= ) | ] | } | :) | :} right brackets +S ::= v | lEr | uS | bSS Simple expression +I ::= S_S | S^S | S_S^S | S Intermediate expression +E ::= IE | I/I Expression +Each terminal symbol is translated into a corresponding mathml node.*/ + +var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol; + +function AMparseSexpr(str) { //parses str and returns [node,tailstr] + var symbol, node, result, i, st,// rightvert = false, + newFrag = document.createDocumentFragment(); + str = AMremoveCharsAndBlanks(str,0); + symbol = AMgetSymbol(str); //either a token or a bracket or empty + if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) { + return [null,str]; + } + if (symbol.ttype == DEFINITION) { + str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length); + symbol = AMgetSymbol(str); + } + switch (symbol.ttype) { + case UNDEROVER: + case CONST: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode(symbol.tag, //its a constant + document.createTextNode(symbol.output)),str]; + case LEFTBRACKET: //read (expr+) + AMnestingDepth++; + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseExpr(str,true); + AMnestingDepth--; + if (typeof symbol.invisible == "boolean" && symbol.invisible) + node = AMcreateMmlNode("mrow",result[0]); + else { + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + node.appendChild(result[0]); + } + return [node,result[1]]; + case TEXT: + if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length); + if (str.charAt(0)=="{") i=str.indexOf("}"); + else if (str.charAt(0)=="(") i=str.indexOf(")"); + else if (str.charAt(0)=="[") i=str.indexOf("]"); + else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1; + else i = 0; + if (i==-1) i = str.length; + st = str.slice(1,i); + if (st.charAt(0) == " ") { + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + } + newFrag.appendChild( + AMcreateMmlNode(symbol.tag,document.createTextNode(st))); + if (st.charAt(st.length-1) == " ") { + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + } + str = AMremoveCharsAndBlanks(str,i+1); + return [AMcreateMmlNode("mrow",newFrag),str]; + case UNARY: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseSexpr(str); + if (result[0]==null) return [AMcreateMmlNode(symbol.tag, + document.createTextNode(symbol.output)),str]; + if (typeof symbol.func == "boolean" && symbol.func) { // functions hack + st = str.charAt(0); + if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") { + return [AMcreateMmlNode(symbol.tag, + document.createTextNode(symbol.output)),str]; + } else { + node = AMcreateMmlNode("mrow", + AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output))); + node.appendChild(result[0]); + return [node,result[1]]; + } + } + AMremoveBrackets(result[0]); + if (symbol.input == "sqrt") { // sqrt + return [AMcreateMmlNode(symbol.tag,result[0]),result[1]]; + } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent + node = AMcreateMmlNode(symbol.tag,result[0]); + node.appendChild(AMcreateMmlNode("mo",document.createTextNode(symbol.output))); + return [node,result[1]]; + } else { // font change command + if (!isIE && typeof symbol.codes != "undefined") { + for (i=0; i<result[0].childNodes.length; i++) + if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") { + st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue: + result[0].childNodes[i].firstChild.nodeValue); + var newst = []; + for (var j=0; j<st.length; j++) + if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst + + String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]); + else newst = newst + st.charAt(j); + if (result[0].nodeName=="mi") + result[0]=AMcreateElementMathML("mo"). + appendChild(document.createTextNode(newst)); + else result[0].replaceChild(AMcreateElementMathML("mo"). + appendChild(document.createTextNode(newst)),result[0].childNodes[i]); + } + } + node = AMcreateMmlNode(symbol.tag,result[0]); + node.setAttribute(symbol.atname,symbol.atval); + return [node,result[1]]; + } + case BINARY: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseSexpr(str); + if (result[0]==null) return [AMcreateMmlNode("mo", + document.createTextNode(symbol.input)),str]; + AMremoveBrackets(result[0]); + var result2 = AMparseSexpr(result[1]); + if (result2[0]==null) return [AMcreateMmlNode("mo", + document.createTextNode(symbol.input)),str]; + AMremoveBrackets(result2[0]); + if (symbol.input=="root" || symbol.input=="stackrel") + newFrag.appendChild(result2[0]); + newFrag.appendChild(result[0]); + if (symbol.input=="frac") newFrag.appendChild(result2[0]); + return [AMcreateMmlNode(symbol.tag,newFrag),result2[1]]; + case INFIX: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),str]; + case SPACE: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + newFrag.appendChild( + AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output))); + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + return [AMcreateMmlNode("mrow",newFrag),str]; + case LEFTRIGHT: +// if (rightvert) return [null,str]; else rightvert = true; + AMnestingDepth++; + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseExpr(str,false); + AMnestingDepth--; + /*var*//*DPVC*/ st = ""; + if (result[0].lastChild!=null) + st = result[0].lastChild.firstChild.nodeValue; +//alert(result[0].lastChild+"***"+st); + if (st == "|") { // its an absolute value subterm + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + node.appendChild(result[0]); + return [node,result[1]]; + } else { // the "|" is a \mid + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + return [node,str]; + } + default: +//alert("default"); + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode(symbol.tag, //its a constant + document.createTextNode(symbol.output)),str]; + } +} + +function AMparseIexpr(str) { + var symbol, sym1, sym2, node, result, underover; + str = AMremoveCharsAndBlanks(str,0); + sym1 = AMgetSymbol(str); + result = AMparseSexpr(str); + node = result[0]; + str = result[1]; + symbol = AMgetSymbol(str); + if (symbol.ttype == INFIX && symbol.input != "/") { + str = AMremoveCharsAndBlanks(str,symbol.input.length); +// if (symbol.input == "/") result = AMparseIexpr(str); else ... + result = AMparseSexpr(str); + if (result[0] == null) // show box in place of missing argument + result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1")); + else AMremoveBrackets(result[0]); + str = result[1]; +// if (symbol.input == "/") AMremoveBrackets(node); + if (symbol.input == "_") { + sym2 = AMgetSymbol(str); + underover = (sym1.ttype == UNDEROVER); + if (sym2.input == "^") { + str = AMremoveCharsAndBlanks(str,sym2.input.length); + var res2 = AMparseSexpr(str); + AMremoveBrackets(res2[0]); + str = res2[1]; + node = AMcreateMmlNode((underover?"munderover":"msubsup"),node); + node.appendChild(result[0]); + node.appendChild(res2[0]); + node = AMcreateMmlNode("mrow",node); // so sum does not stretch + } else { + node = AMcreateMmlNode((underover?"munder":"msub"),node); + node.appendChild(result[0]); + } + } else { + node = AMcreateMmlNode(symbol.tag,node); + node.appendChild(result[0]); + } + } + return [node,str]; +} + +function AMparseExpr(str,rightbracket) { + var symbol, node, result, i, /*nodeList = [],*//*DPVC*/ + newFrag = document.createDocumentFragment(); + do { + str = AMremoveCharsAndBlanks(str,0); + result = AMparseIexpr(str); + node = result[0]; + str = result[1]; + symbol = AMgetSymbol(str); + if (symbol.ttype == INFIX && symbol.input == "/") { + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseIexpr(str); + if (result[0] == null) // show box in place of missing argument + result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1")); + else AMremoveBrackets(result[0]); + str = result[1]; + AMremoveBrackets(node); + node = AMcreateMmlNode(symbol.tag,node); + node.appendChild(result[0]); + newFrag.appendChild(node); + symbol = AMgetSymbol(str); + } + else if (node!=undefined) newFrag.appendChild(node); + } while ((symbol.ttype != RIGHTBRACKET && + (symbol.ttype != LEFTRIGHT || rightbracket) + || AMnestingDepth == 0) && symbol!=null && symbol.output!=""); + if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) { +// if (AMnestingDepth > 0) AMnestingDepth--; + var len = newFrag.childNodes.length; + if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 && + newFrag.childNodes[len-2].nodeName == "mo" && + newFrag.childNodes[len-2].firstChild.nodeValue == ",") { //matrix + var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue; + if (right==")" || right=="]") { + var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue; + if (left=="(" && right==")" && symbol.output != "}" || + left=="[" && right=="]") { + var pos = []; // positions of commas + var matrix = true; + var m = newFrag.childNodes.length; + for (i=0; matrix && i<m; i=i+2) { + pos[i] = []; + node = newFrag.childNodes[i]; + if (matrix) matrix = node.nodeName=="mrow" && + (i==m-1 || node.nextSibling.nodeName=="mo" && + node.nextSibling.firstChild.nodeValue==",")&& + node.firstChild.firstChild.nodeValue==left && + node.lastChild.firstChild.nodeValue==right; + if (matrix) + for (var j=0; j<node.childNodes.length; j++) + if (node.childNodes[j].firstChild.nodeValue==",") + pos[i][pos[i].length]=j; + if (matrix && i>1) matrix = pos[i].length == pos[i-2].length; + } + if (matrix) { + var row, frag, n, k, table = document.createDocumentFragment(); + for (i=0; i<m; i=i+2) { + row = document.createDocumentFragment(); + frag = document.createDocumentFragment(); + node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow> + n = node.childNodes.length; + k = 0; + node.removeChild(node.firstChild); //remove ( + for (j=1; j<n-1; j++) { + if (typeof pos[i][k] != "undefined" && j==pos[i][k]){ + node.removeChild(node.firstChild); //remove , + row.appendChild(AMcreateMmlNode("mtd",frag)); + k++; + } else frag.appendChild(node.firstChild); + } + row.appendChild(AMcreateMmlNode("mtd",frag)); + if (newFrag.childNodes.length>2) { + newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow> + newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo> + } + table.appendChild(AMcreateMmlNode("mtr",row)); + } + node = AMcreateMmlNode("mtable",table); + if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left"); + newFrag.replaceChild(node,newFrag.firstChild); + } + } + } + } + str = AMremoveCharsAndBlanks(str,symbol.input.length); + if (typeof symbol.invisible != "boolean" || !symbol.invisible) { + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + newFrag.appendChild(node); + } + } + return [newFrag,str]; +} + +function AMparseMath(str) { + var /*result,*//*DPVC*/ node = AMcreateElementMathML("mstyle"); + if (mathcolor != "") node.setAttribute("mathcolor",mathcolor); + if (displaystyle) node.setAttribute("displaystyle","true"); + if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily); + AMnestingDepth = 0; + node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false)[0]); + node = AMcreateMmlNode("math",node); + if (showasciiformulaonhover) //fixed by djhsu so newline + node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko + if (mathfontfamily != "" && (isIE || mathfontfamily != "serif")) { + var fnode = AMcreateElementXHTML("font"); + fnode.setAttribute("face",mathfontfamily); + fnode.appendChild(node); + return fnode; + } + return node; +} + +/* + * function AMstrarr2docFrag(arr, linebreaks) { + * var newFrag=document.createDocumentFragment(); + * var expr = false; + * for (var i=0; i<arr.length; i++) { + * if (expr) newFrag.appendChild(AMparseMath(arr[i])); + * else { + * var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]); + * newFrag.appendChild(AMcreateElementXHTML("span"). + * appendChild(document.createTextNode(arri[0]))); + * for (var j=1; j<arri.length; j++) { + * newFrag.appendChild(AMcreateElementXHTML("p")); + * newFrag.appendChild(AMcreateElementXHTML("span"). + * appendChild(document.createTextNode(arri[j]))); + * } + * } + * expr = !expr; + * } + * return newFrag; + * } + * + * function AMprocessNodeR(n, linebreaks) { + * var mtch, str, arr, frg, i; + * if (n.childNodes.length == 0) { + * if ((n.nodeType!=8 || linebreaks) && + * n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" && + * n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" && + * n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") { + * str = n.nodeValue; + * if (!(str == null)) { + * str = str.replace(/\r\n\r\n/g,"\n\n"); + * if (doubleblankmathdelimiter) { + * str = str.replace(/\x20\x20\./g," "+AMdelimiter1+"."); + * str = str.replace(/\x20\x20,/g," "+AMdelimiter1+","); + * str = str.replace(/\x20\x20/g," "+AMdelimiter1+" "); + * } + * str = str.replace(/\x20+/g," "); + * str = str.replace(/\s*\r\n/g," "); + * mtch = false; + * str = str.replace(new RegExp(AMescape2, "g"), + * function(st){mtch=true;return "AMescape2"}); + * str = str.replace(new RegExp(AMescape1, "g"), + * function(st){mtch=true;return "AMescape1"}); + * str = str.replace(new RegExp(AMdelimiter2regexp, "g"),AMdelimiter1); + * arr = str.split(AMdelimiter1); + * for (i=0; i<arr.length; i++) + * arr[i]=arr[i].replace(/AMescape2/g,AMdelimiter2). + * replace(/AMescape1/g,AMdelimiter1); + * if (arr.length>1 || mtch) { + * if (checkForMathML) { + * checkForMathML = false; + * var nd = AMisMathMLavailable(); + * AMnoMathML = nd != null; + * if (AMnoMathML && notifyIfNoMathML) + * if (alertIfNoMathML) + * alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\ + * or Firefox/Mozilla/Netscape"); + * else AMbody.insertBefore(nd,AMbody.childNodes[0]); + * } + * if (!AMnoMathML) { + * frg = AMstrarr2docFrag(arr,n.nodeType==8); + * var len = frg.childNodes.length; + * n.parentNode.replaceChild(frg,n); + * return len-1; + * } else return 0; + * } + * } + * } else return 0; + * } else if (n.nodeName!="math") { + * for (i=0; i<n.childNodes.length; i++) + * i += AMprocessNodeR(n.childNodes[i], linebreaks); + * } + * return 0; + * } + * + * function AMprocessNode(n, linebreaks, spanclassAM) { + * var frag,st; + * if (spanclassAM!=null) { + * frag = document.getElementsByTagName("span") + * for (var i=0;i<frag.length;i++) + * if (frag[i].className == "AM") + * AMprocessNodeR(frag[i],linebreaks); + * } else { + * try { + * st = n.innerHTML; + * } catch(err) {} + * if (st==null || + * st.indexOf(AMdelimiter1)!=-1 || st.indexOf(AMdelimiter2)!=-1) + * AMprocessNodeR(n,linebreaks); + * } + * if (isIE) { //needed to match size and font of formula to surrounding text + * frag = document.getElementsByTagName('math'); + * for (var i=0;i<frag.length;i++) frag[i].update() + * } + * } + * + * var AMbody; + * var AMnoMathML = false, AMtranslated = false; + * + * function translate(spanclassAM) { + * if (!AMtranslated) { // run this only once + * AMtranslated = true; + * AMinitSymbols(); + * AMbody = document.getElementsByTagName("body")[0]; + * AMprocessNode(AMbody, false, spanclassAM); + * } + * } + * + * if (isIE) { // avoid adding MathPlayer info explicitly to each webpage + * document.write("<object id=\"mathplayer\"\ + * classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>"); + * document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>"); + * } + * + * // GO1.1 Generic onload by Brothercake + * // http://www.brothercake.com/ + * //onload function (replaces the onload="translate()" in the <body> tag) + * function generic() + * { + * translate(); + * }; + * //setup onload function + * if(typeof window.addEventListener != 'undefined') + * { + * //.. gecko, safari, konqueror and standard + * window.addEventListener('load', generic, false); + * } + * else if(typeof document.addEventListener != 'undefined') + * { + * //.. opera 7 + * document.addEventListener('load', generic, false); + * } + * else if(typeof window.attachEvent != 'undefined') + * { + * //.. win/ie + * window.attachEvent('onload', generic); + * } + * //** remove this condition to degrade older browsers + * else + * { + * //.. mac/ie5 and anything else that gets this far + * //if there's an existing onload function + * if(typeof window.onload == 'function') + * { + * //store it + * var existing = onload; + * //add new onload handler + * window.onload = function() + * { + * //call existing onload function + * existing(); + * //call generic onload function + * generic(); + * }; + * } + * else + * { + * //setup onload function + * window.onload = generic; + * } + * } + */ + +/****************************************************************** + * + * The previous section is ASCIIMathML.js Version 1.4.7 + * (c) Peter Jipsen, used with permission. + * + ******************************************************************/ + +showasciiformulaonhover = false; +mathfontfamily = ""; +mathcolor = ""; + +// +// Remove remapping of mathvariants to plane1 (MathJax handles that) +// Change functions to mi rather than mo (to get spacing right) +// +(function () { + for (var i = 0, m = AMsymbols.length; i < m; i++) { + if (AMsymbols[i].codes) {delete AMsymbols[i].codes} + if (AMsymbols[i].func) {AMsymbols[i].tag = "mi"} + } +})(); + +// +// Add some missing symbols +// +AMsymbols.push( + {input:"gt", tag:"mo", output:">", tex:null, ttype:CONST}, + {input:"gt=", tag:"mo", output:"\u2265", tex:"geq", ttype:CONST}, + {input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST}, + {input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST}, + {input:"'", tag:"mo", output:"\u2032", tex:"prime", ttype:CONST}, + {input:"arcsin", tag:"mi", output:"arcsin", tex:null, ttype:UNARY, func:true}, + {input:"arccos", tag:"mi", output:"arccos", tex:null, ttype:UNARY, func:true}, + {input:"arctan", tag:"mi", output:"arctan", tex:null, ttype:UNARY, func:true}, + {input:"coth", tag:"mi", output:"coth", tex:null, ttype:UNARY, func:true}, + {input:"sech", tag:"mi", output:"sech", tex:null, ttype:UNARY, func:true}, + {input:"csch", tag:"mi", output:"csch", tex:null, ttype:UNARY, func:true}, + {input:"abs", tag:"mi", output:"abs", tex:null, ttype:UNARY, func:true}, + {input:"exp", tag:"mi", output:"exp", tex:null, ttype:UNARY, func:true}, + {input:"tilde", tag:"mover", output:"~", tex:null, ttype:UNARY, acc:true} +) + +// +// Access to AsciiMath functions and values +// +ASCIIMATH.Augment({ + AM: { + Init: function () { + displaystyle = ASCIIMATH.config.displaystyle; + decimal = ASCIIMATH.config.decimal; + INITASCIIMATH(); + AMinitSymbols(); + }, + Augment: function (def) { + for (var id in def) {if (def.hasOwnProperty(id)) { + switch (id) { + case "displaystyle": displaystyle = def[id]; break; + case "decimal": decimal = def[id]; break; + case "parseMath": AMparseMath = def[id]; break; + case "parseExpr": AMparseExpr = def[id]; break; + case "parseIexpr": AMparseIexpr = def[id]; break; + case "parseSexpr": AMparseSexpr = def[id]; break; + case "removeBrackets": AMremoveBrackets = def[id]; break; + case "getSymbol": AMgetSymbol = def[id]; break; + case "position": AMposition = def[id]; break; + case "removeCharsAndBlanks": AMremoveCharsAndBlanks = def[id]; break; + case "createMmlNode": AMcreateMmlNode = def[id]; break; + case "createElementMathML": AMcreateElementMathML = def[id]; break; + case "createElementXHTML": AMcreateElementXHTML = def[id]; break; + case "initSymbols": AMinitSymbols = def[id]; break; + case "compareNames": comareNames = def[id]; break; + }; + this[id] = def[id]; + }}; + }, + parseMath: AMparseMath, + parseExpr: AMparseExpr, + parseIexpr: AMparseIexpr, + parseSexr: AMparseSexpr, + removeBrackets: AMremoveBrackets, + getSymbol: AMgetSymbol, + position: AMposition, + removeCharsAndBlanks: AMremoveCharsAndBlanks, + createMmlNode: AMcreateMmlNode, + createElementMathML: AMcreateElementMathML, + createElementXHTML: AMcreateElementXHTML, + initSymbols: AMinitSymbols, + compareNames: compareNames, + + createDocumentFragment: DOCFRAG, + document: document, + + define: newcommand, + symbols: AMsymbols, + names: AMnames, + + TOKEN: { + CONST:CONST, UNARY:UNARY, BINARY:BINARY, INFIX:INFIX, + LEFTBRACKET:LEFTBRACKET, RIGHTBRACKET:RIGHTBRACKET, SPACE:SPACE, + UNDEROVER:UNDEROVER, DEFINITION:DEFINITION, LEFTRIGHT:LEFTRIGHT, TEXT:TEXT + } + } +}); + +// +// Make minimizer think these have been used +var junk = [ + window, navigator //, +// checkForMathML, notifyIfNoMathML, alertIfNoMathML, AMdelimiter1, AMescape1, +// AMdelimiter2, AMescape2, AMdelimiter2regexp, doubleblankmathdelimiter +]; +junk = null; + +})(MathJax.InputJax.AsciiMath); + + +/************************************************************************/ + +(function (ASCIIMATH) { + var MML; + + ASCIIMATH.Augment({ + sourceMenuTitle: "AsciiMath input", + + prefilterHooks: MathJax.Callback.Hooks(true), // hooks to run before processing AsciiMath + postfilterHooks: MathJax.Callback.Hooks(true), // hooks to run after processing AsciiMath + + Translate: function (script) { + var mml, math = script.innerHTML.replace(/^\s+/,"").replace(/\s+$/,""); + var data = {math:math, script:script}; + this.prefilterHooks.Execute(data); math = data.math; + try { + mml = this.AM.parseMath(math); + } catch(err) { + if (!err.asciimathError) {throw err} + mml = this.formatError(err,math); + } + data.math = MML(mml); this.postfilterHooks.Execute(data); + return data.math; + }, + formatError: function (err,math,script) { + var message = err.message.replace(/\n.*/,""); + MathJax.Hub.signal.Post(["AsciiMath Jax - parse error",message,math,script]); + return MML.merror(message); + }, + Error: function (message) { + throw MathJax.Hub.Insert(Error(message),{asciimathError: true}); + }, + // + // Initialize the MML variable and AsciiMath itself + // + Startup: function () { + MML = MathJax.ElementJax.mml; + this.AM.Init(); + } + }); + + ASCIIMATH.loadComplete("jax.js"); + +})(MathJax.InputJax.AsciiMath); + + +