www

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

commit 86a6c173cf0c12111fef09efe49a14aed47ca1e9
parent e6a1aed03a919aa98fa6893f5206abc28177453a
Author: Christian Perfect <christianperfect@gmail.com>
Date:   Fri,  2 May 2014 14:52:35 +0100

Content-MathML extension: update CToP.js

from mathjax/ctop

Diffstat:
Munpacked/extensions/MathML/content-mathml.js | 3028+++++++++++++++++++++++++++++++++++++++++--------------------------------------
1 file changed, 1577 insertions(+), 1451 deletions(-)

diff --git a/unpacked/extensions/MathML/content-mathml.js b/unpacked/extensions/MathML/content-mathml.js @@ -53,1457 +53,1583 @@ MathJax.Extension["MathML/content-mathml"] = (function() { */ var CToP = { - version: "2.4", - - /* Transform the given <math> elements from Content MathML to Presentation MathML and replace the original elements - */ - transform: function(elements){ - for (var i = 0; i< elements.length;i++){ - var mathNode = CToP.transformElement(elements[i]); - elements[i].parentNode.replaceChild(mathNode,elements[i]); - } - }, - - /* Transform a Content MathML element into Presentation MathML, and return the new element - */ - transformElement: function(element) { - var mathNode = element.cloneNode(false); - for(var j=0;j<element.childNodes.length; j++ ) { - CToP.applyTransform(mathNode,element.childNodes[j],0); - } - return mathNode; - }, - - /* Create an element with given name, belonging to the MathML namespace - */ - createElement: function(name) { - return document.createElementNS("http://www.w3.org/1998/Math/MathML",name); - }, - - /* Get node's children - */ - children: function(node) { - var children=[]; - for(var j=0;j<node.childNodes.length; j++ ) { - if(node.childNodes[j].nodeType==document.ELEMENT_NODE) { - children.push(node.childNodes[j]); - } - } - return children; - }, - - /* Classify node's children as argumentss, variable bindings, or qualifiers - */ - classifyChildren: function(contentMMLNode) { - var args = [], bvars = [], qualifiers = []; - for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { - if(contentMMLNode.childNodes[j].nodeType==document.ELEMENT_NODE) { - var childNode = contentMMLNode.childNodes[j], name = childNode.localName; - if(name=='bvar'){ - bvars.push(childNode); - } else if(name=='condition'|| - name=='degree'|| - name=='momentabout'|| - name=='logbase'|| - name=='lowlimit'|| - name=='uplimit'|| - (name=='interval' && args.length<2)|| - name=='domainofapplication') { - qualifiers.push(childNode); - } else { - args.push(childNode); - } - } - } - return { - args:args, - bvars:bvars, - qualifiers:qualifiers - }; - }, - - /* Add an element with given name and text content - */ - appendToken: function(parentNode,name,textContent) { - var element = CToP.createElement(name); - element.textContent = textContent; - parentNode.appendChild(element); - return element; - }, - - /* Transform a Content MathML node to Presentation MathML node(s), and attach it to the parent - */ - applyTransform: function(parentNode,contentMMLNode,precedence) { - if (contentMMLNode.nodeType==document.ELEMENT_NODE) { - if(CToP.tokens[contentMMLNode.localName]) { - CToP.tokens[contentMMLNode.localName](parentNode,contentMMLNode,precedence); - } else if (contentMMLNode.childNodes.length==0) { - CToP.appendToken(parentNode,'mi',contentMMLNode.localName); - } else { - var clonedChild = contentMMLNode.cloneNode(false); - parentNode.appendChild(clonedChild); - for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { - CToP.applyTransform(clonedChild,contentMMLNode.childNodes[j],precedence); - } - } - } else if (contentMMLNode.nodeType==document.TEXT_NODE) { - parentNode.appendChild(contentMMLNode.cloneNode(false)); - } - }, - - /* Transform an identifier symbol - */ - identifier: function(textContent) { - return function(parentNode,contentMMLNode,precedence) { - CToP.appendToken(parentNode,'mi',textContent); - } - }, - - /* Make an mfenced environment - */ - mfenced: function(children,open,close) { - var mf = CToP.createElement('mfenced'); - mf.setAttribute('open',open); - mf.setAttribute('close',close); - for(var j=0;j<children.length; j++ ) { - CToP.applyTransform(mf,children[j],0); - } - return mf; - }, - - /* Transform a set or set-like notation - */ - set: function(open,close) { - var bindSet = CToP.bind('',',','|'); - return function(parentNode,contentMMLNode) { - var children = CToP.classifyChildren(contentMMLNode); - - var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; - if(bvars.length) { - var firstArg=children.args[0]; - args = args.slice(1); - var mfenced = CToP.createElement('mfenced'); - mfenced.setAttribute('open',open); - mfenced.setAttribute('close',close); - bindSet(mfenced,contentMMLNode,firstArg,args,bvars,qualifiers,0); - parentNode.appendChild(mfenced); - } else { - parentNode.appendChild(CToP.mfenced(args,open,close)); - } - } - }, - - /* Transform a content token to a presentation token - * - * (function factory) - * @param {string} name - name of the corresponding presentation MML tag - */ - token: function(name) { - return function(parentNode,contentMMLNode) { - if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) { - CToP.appendToken(parentNode,name,contentMMLNode.textContent); - } else { - var mrow = CToP.createElement('mrow'); - for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { - if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) { - CToP.appendToken(parentNode,name,contentMMLNode.childNodes[j].textContent); - }else{ - CToP.applyTransform(mrow,contentMMLNode.childNodes[j],0); - } - } - if(mrow.childNodes.length) { - parentNode.appendChild(mrow); - } - } - } - }, - - /* Transform a binary operation - * - * (function factory) - */ - binary: function(name,tokenPrecedence) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var needsBrackets = tokenPrecedence<precedence || (tokenPrecedence==precedence && name=="-"); - if(needsBrackets) { - CToP.appendToken(mrow,'mo','('); - } - if(args.length>1){ - CToP.applyTransform(mrow,args[0],tokenPrecedence); - } - CToP.appendToken(mrow,'mo',name); - if(args.length>0){ - var z = args[(args.length==1)?0:1]; - CToP.applyTransform(mrow,z,tokenPrecedence); - } - if(needsBrackets) { - CToP.appendToken(mrow,'mo',')'); - } - parentNode.appendChild(mrow); - } - }, - - /* Transform an infix operator - * - * (function factory) - */ - infix: function(name,tokenPrecedence) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var needsBrackets = precedence>tokenPrecedence; - if(needsBrackets) { - CToP.appendToken(mrow,'mo','('); - } - for(var j=0;j<args.length; j++ ) { - if(j>0) { - CToP.appendToken(mrow,'mo',name); - } - CToP.applyTransform(mrow,args[j],tokenPrecedence); - } - if(needsBrackets) { - CToP.appendToken(mrow,'mo',')'); - } - parentNode.appendChild(mrow); - } - }, - - /* Transform an iterated operation, e.g. summation - * - * (function factory - */ - iteration: function(name,limitSymbol) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var mo = CToP.createElement('mo'); - mo.textContent = name; - var munderover = CToP.createElement('munderover'); - munderover.appendChild(mo); - var mrow1 = CToP.createElement('mrow'); - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='lowlimit'|| - qualifiers[i].localName=='condition'|| - qualifiers[i].localName=='domainofapplication') - { - if(qualifiers[i].localName=='lowlimit'){ - for(var j=0; j<bvars.length;j++){ - var bvar = bvars[j]; - var children = CToP.children(bvar); - if(children.length){ - CToP.applyTransform(mrow1,children[0],0); - } - } - if(bvars.length){ - CToP.appendToken(mrow1,"mo",limitSymbol); - } - } - var children = CToP.children(qualifiers[i]); - for(j=0;j<children.length;j++){ - CToP.applyTransform(mrow1,children[j],0); - } - } else { - var children = CToP.children(qualifiers[i]); - if (qualifiers[i].localName=='interval' && children.length==2) { - for(var j=0; j<bvars.length;j++){ - var bvar = b[j]; - var children = CToP.children(bvar); - if(children.length){ - CToP.applyTransform(mrow1,children[0],0); - } - } - if(bvars.length){ - CToP.appendToken(mrow1,"mo","="); - } - CToP.applyTransform(mrow1,CToP.children(qualifiers[i])[0],0); - } - } - } - munderover.appendChild(mrow1); - var mjrow = CToP.createElement('mrow'); - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='uplimit' ||qualifiers[i].localName=='interval' ) - { - var children = CToP.children(qualifiers[i]); - for(j=0;j<children.length;j++){ - CToP.applyTransform(mjrow,children[j],0); - } - } - } - munderover.appendChild(mjrow); - mrow.appendChild(munderover); - - for(var i=0; i<args.length;i++){ - CToP.applyTransform(mrow,args[i],precedence); - } - - parentNode.appendChild(mrow); - } - }, - - /* Transform something which binds a variable, e.g. forall or lambda - * - * (function factory) - */ - bind: function(name,argSeparator,conditionSeparator) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - if(name) { - CToP.appendToken(mrow,'mo',name); - } - for(var j=0; j<bvars.length;j++){ - var bvar = bvars[j]; - if(j>0) { - CToP.appendToken(mrow,'mo',','); - } - var children = CToP.children(bvar); - if(children.length){ - CToP.applyTransform(mrow,children[0],0); - } - } - - var conditions_mrow = CToP.createElement('mrow'); - var conditions = false, children; - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='condition') { - conditions = true; - children = CToP.children(qualifiers[i]); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(conditions_mrow,children[j],0); - } - } - } - if(conditions){ - CToP.appendToken(mrow,'mo',conditionSeparator); - } - mrow.appendChild(conditions_mrow); - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName!='condition') { - CToP.appendToken(mrow,'mo','\u2208'); - children = CToP.children(qualifiers[i]); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(mrow,children[j],0); - } - } - } - if(args.length && (bvars.length||children.length)) { - CToP.appendToken(mrow,'mo',argSeparator); - } - for(var i=0; i<args.length;i++){ - CToP.applyTransform(mrow,args[i],0); - } - parentNode.appendChild(mrow); - } - }, - - /** Transform a function application - * - * i.e. something which ends up looking like `f(x,y,z)`, where `f` is a string - * - * (function factory) - */ - fn: function(name) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - if(firstArg.childNodes.length){ - CToP.applyTransform(mrow,firstArg,1); - } else { - CToP.appendToken(mrow,'mi',name); - } - CToP.appendToken(mrow,'mo','\u2061'); - mrow.appendChild(CToP.mfenced(args,'(',')')); - parentNode.appendChild(mrow); - } - }, - - /** Transform a min/max operation - * - * (function factory) - */ - minmax: function(name) { - return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mi',name); - var mrow2 = CToP.createElement('mrow'); - CToP.appendToken(mrow2,'mo','{'); - for(var i=0;i<args.length;i++) { - if(i>0) { - CToP.appendToken(mrow2,'mo',','); - } - CToP.applyTransform(mrow2,args[i],0); - } - if(qualifiers.length) { - CToP.appendToken(mrow2,'mo','|'); - for(var i=0;i<qualifiers.length;i++) { - CToP.applyTransform(mrow2,qualifiers[i],0); - } - } - CToP.appendToken(mrow2,'mo','}'); - mrow.appendChild(mrow2); - parentNode.appendChild(mrow); - } - } - } - - /* mathvariant to use with corresponding <ci> type attribute */ - CToP.cistyles = { - "vector": 'bold-italic', - "matrix": 'bold-upright' - } - - /* Functions to transform variable/atom tokens - */ - CToP.tokens = { - "ci": function(parentNode,contentMMLNode,precedence) { - if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) { - var mi = CToP.appendToken(parentNode,'mi',contentMMLNode.textContent); - var type = contentMMLNode.getAttribute('type'); - if(type in CToP.cistyles) { - mi.setAttribute('mathvariant',CToP.cistyles[type]); - } - } else { - CToP.token('mi')(parentNode,contentMMLNode,precedence); - } - }, - "cs": CToP.token('ms'), - - "csymbol": function(parentNode,contentMMLNode,precedence) { - var cd = contentMMLNode.getAttribute('cd'); - if(cd && CToP.contentDictionaries[cd]) { - CToP.contentDictionaries[cd](parentNode,contentMMLNode,precedence); - } else if(CToP.symbols[name]){ - CToP.appendToken(parentNode,'mi',CToP.symbols[name]); - } else { - CToP.tokens['ci'](parentNode,contentMMLNode); - } - }, - "fn": function(parentNode,contentMMLNode,precedence) { - CToP.applyTransform(parentNode,CToP.children(contentMMLNode)[0],precedence); - }, - - "naturalnumbers": CToP.identifier('\u2115'), - "integers": CToP.identifier('\u2124'), - "reals": CToP.identifier('\u211D'), - "rationals": CToP.identifier('\u211A'), - "complexes": CToP.identifier('\u2102'), - "primes": CToP.identifier('\u2119'), - "exponentiale": CToP.identifier('e'), - "imaginaryi": CToP.identifier('i'), - "notanumber": CToP.identifier('NaN'), - "eulergamma": CToP.identifier('\u03B3'), - "gamma": CToP.identifier('\u0263'), - "pi": CToP.identifier('\u03C0'), - "infinity": CToP.identifier('\u221E'), - "emptyset": CToP.identifier('\u2205'), - "true": CToP.identifier('true'), - "false": CToP.identifier('false'), - 'set': CToP.set('{','}'), - 'list': CToP.set('(',')') - } - - CToP.tokens['interval'] = function(parentNode,contentMMLNode,precedence) { - var closure = contentMMLNode.getAttribute('closure'); - - var open, close; - switch(closure) { - case 'open': - open = '('; - close = ')'; - break; - case 'open-closed': - open = '('; - close = ']'; - break; - case 'closed-open': - open = '['; - close = ')'; - break; - case 'closed': - default: - open = '['; - close = ']'; - } - - parentNode.appendChild(CToP.mfenced(CToP.children(contentMMLNode),open,close)); - } - CToP.tokens['apply'] = CToP.tokens['reln'] = CToP.tokens['bind'] = function(parentNode,contentMMLNode,precedence) { - var children = CToP.classifyChildren(contentMMLNode); - - var firstArg=children.args[0]; - var args = children.args.slice(1), bvars = children.bvars, qualifiers = children.qualifiers; - - if(firstArg) { - var name = firstArg.localName; - name = (name=="csymbol") ? firstArg.textContent.toLowerCase() : name; - if(CToP.applyTokens[name]) { - CToP.applyTokens[name](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } else { - CToP.fn(name)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } else { - parentNode.appendChild(CToP.createElement('mrow')); - } - } - - CToP.tokens['cn'] = function(parentNode,contentMMLNode,precedence) { - var type = contentMMLNode.getAttribute("type"); - var base = contentMMLNode.getAttribute("base"); - if(type || base) { - if(base) { - type = 'based-integer'; - } - switch(type) { - case 'integer': - case 'real': - case 'double': - case 'constant': - CToP.token('mn')(parentNode,contentMMLNode); - break; - case 'hexdouble': - CToP.appendToken(parentNode,'mn','0x'+contentMMLNode.textContent); - break; - default: - var apply = CToP.createElement('apply'); - var mrow = CToP.createElement('mrow'); - var c = CToP.createElement(type); - apply.appendChild(c); - if(base) { - CToP.appendToken(apply,'mn',base); - } - for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { - if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) { - CToP.appendToken(mrow,'cn',contentMMLNode.childNodes[j].textContent); - }else if (contentMMLNode.childNodes[j].localName=='sep'){ - apply.appendChild(mrow); - mrow = CToP.createElement('mrow'); - } else { - mrow.appendChild(contentMMLNode.childNodes[j].cloneNode(true)); - } - } - apply.appendChild(mrow); - CToP.applyTransform(parentNode,apply,0); - } - } else { - CToP.token('mn')(parentNode,contentMMLNode); - } - } - - CToP.tokens['vector'] = function(parentNode,contentMMLNode,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','('); - - var mtable = CToP.createElement('mtable'); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++) { - var mtr = CToP.createElement('mtr'); - var mtd = CToP.createElement('mtd'); - CToP.applyTransform(mtd,children[i],0); - mtr.appendChild(mtd); - mtable.appendChild(mtr); - } - - mrow.appendChild(mtable); - CToP.appendToken(mrow,'mo',')'); - parentNode.appendChild(mrow); - } - - CToP.tokens['piecewise'] = function(parentNode,contentMMLNode,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','{'); - var mtable = CToP.createElement('mtable'); - mrow.appendChild(mtable); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++){ - CToP.applyTransform(mtable,children[i],0); - } - parentNode.appendChild(mrow); - } - - CToP.tokens['piece'] = function(parentNode,contentMMLNode,precedence) { - var mtr = CToP.createElement('mtr'); - var children = CToP.children(contentMMLNode); - for(i=0;i<children.length;i++){ - var mtd = CToP.createElement('mtd'); - mtr.appendChild(mtd); - CToP.applyTransform(mtd,children[i],0); - if(i==0){ - var mtd = CToP.createElement('mtd'); - CToP.appendToken(mtd,"mtext","\u00A0if\u00A0"); - mtr.appendChild(mtd); - } - } - parentNode.appendChild(mtr); - } - - CToP.tokens['otherwise'] = function(parentNode,contentMMLNode,precedence) { - var mtr = CToP.createElement('mtr'); - var children = CToP.children(contentMMLNode); - if(children.length){ - var mtd = CToP.createElement('mtd'); - mtr.appendChild(mtd); - CToP.applyTransform(mtd,children[0],0); - var mtd = CToP.createElement('mtd'); - mtd.setAttribute('columnspan','2'); - CToP.appendToken(mtd,"mtext","\u00A0otherwise"); - mtr.appendChild(mtd); - } - parentNode.appendChild(mtr); - } - - CToP.tokens['matrix'] = function(parentNode,contentMMLNode,precedence) { - var children = CToP.classifyChildren(contentMMLNode); - var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; - - if(bvars.length || qualifiers.length) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,"mo","["); - var msub = CToP.createElement('msub'); - CToP.appendToken(msub,'mi','m'); - var mrow2 = CToP.createElement('mrow'); - for(var i=0;i<bvars.length;i++){ - if(i!=0){ - CToP.appendToken(mrow2,'mo',','); - } - CToP.applyTransform(mrow2,bvars[i].childNodes[0],0); - } - msub.appendChild(mrow2); - mrow.appendChild(msub); - var msub2 = msub.cloneNode(true); - CToP.appendToken(mrow,'mo','|'); - mrow.appendChild(msub2); - CToP.appendToken(mrow,'mo','='); - for(var i=0;i<args.length;i++){ - if(i!=0){ - CToP.appendToken(mrow,'mo',','); - } - CToP.applyTransform(mrow,args[i],0); - } - CToP.appendToken(mrow,'mo',';'); - for(var i=0;i<qualifiers.length;i++){ - if(i!=0){ - CToP.appendToken(mrow,'mo',','); - } - CToP.applyTransform(mrow,qualifiers[i],0); - } - CToP.appendToken(mrow,'mo',']'); - parentNode.appendChild(mrow); - } else { - var mfenced = CToP.createElement('mfenced'); - var mtable = CToP.createElement('mtable'); - for(var i=0;i<args.length;i++){ - CToP.applyTransform(mtable,args[i],0); - } - mfenced.appendChild(mtable); - parentNode.appendChild(mfenced); - } - } - - CToP.tokens['matrixrow'] = function(parentNode,contentMMLNode,precedence) { - var mtr = CToP.createElement('mtr'); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++){ - var mtd = CToP.createElement('mtd'); - CToP.applyTransform(mtd,children[i],0); - mtr.appendChild(mtd); - } - parentNode.appendChild(mtr); - } - - CToP.tokens['condition'] = function(parentNode,contentMMLNode,precedence) { - var mrow = CToP.createElement('mrow'); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++){ - CToP.applyTransform(mrow,children[i],0); - } - parentNode.appendChild(mrow); - } - CToP.tokens['lambda'] = function(parentNode,contentMMLNode,precedence) { - var firstArg = CToP.createElement('lambda'); - var children = CToP.classifyChildren(contentMMLNode); - var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; - - if(bvars.length){ - CToP.applyTokens["lambda"](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } else { - var mrow=CToP.createElement('mrow'); - for(var i=0;i<args.length;i++){ - CToP.applyTransform(mrow,args[i],0); - } - if(qualifiers.length){ - var msub = CToP.createElement('msub'); - CToP.appendToken(msub,'mo','|'); - var mrow2 = CToP.createElement('mrow'); - for(var i=0;i<qualifiers.length;i++){ - var children = CToP.children(qualifiers[i]); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(mrow2,children[j],0); - } - } - msub.appendChild(mrow2); - mrow.appendChild(msub); - } - parentNode.appendChild(mrow); - } - } - CToP.tokens["ident"] = function(parentNode,contentMMLNode,precedence) { - CToP.appendToken(parentNode,"mi","id") - } - - CToP.tokens["domainofapplication"] = function(parentNode,contentMMLNode,precedence) { - var merror = CToP.createElement('merror'); - CToP.appendToken(merror,'mtext','unexpected domainofapplication'); - parentNode.appendChild(merror); - } - - CToP.tokens["share"] = function(parentNode,contentMMLNode,precedence) { - var mi = CToP.createElement('mi'); - mi.setAttribute('href',contentMMLNode.getAttribute('href')); - mi.textContent = "share" + contentMMLNode.getAttribute('href'); - parentNode.appendChild(mi); - } - - CToP.tokens["cerror"] = function(parentNode,contentMMLNode,precedence) { - var merror = CToP.createElement('merror'); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++){ - CToP.applyTransform(merror,children[i],0); - } - parentNode.appendChild(merror); - } - - CToP.tokens["semantics"] = function(parentNode,contentMMLNode,precedence) { - var mrow = CToP.createElement('mrow'); - var children = CToP.children(contentMMLNode); - if(children.length){ - var z = children[0]; - for(var i=0;i<children.length;i++){ - if(children[i].localName=='annotation-xml' && children[i].getAttribute('encoding')=='MathML-Presentation'){ - z = children[i]; - break; - } - } - CToP.applyTransform(mrow,z,0); - } - parentNode.appendChild(mrow); - } - - CToP.tokens["annotation-xml"] = function(parentNode,contentMMLNode,precedence) { - var mrow = CToP.createElement('mrow'); - var children = CToP.children(contentMMLNode); - for(var i=0;i<children.length;i++){ - CToP.applyTransform(mrow,children[i],0); - } - parentNode.appendChild(mrow); - } - - - /* Symbol names to translate to characters - */ - CToP.symbols = { - "gamma": '\u03B3' - } - CToP.contentDictionaries = { - "setname1": function(parentNode,contentMMLNode,precedence) { - var sets = { - "C": '\u2102', - "N": '\u2115', - "P": '\u2119', - "Q": '\u211A', - "R": '\u211D', - "Z": '\u2124' - } - var name = contentMMLNode.textContent; - CToP.appendToken(parentNode,'mi',sets[name]); - }, - "aritherror": function(parentNode,contentMMLNode,precedence) { - var name = contentMMLNode.textContent; - CToP.appendToken(parentNode,'mi',name+':'); - } - } - - /* Functions to transform function/operation application tokens - */ - CToP.applyTokens = { - "rem": CToP.binary('mod',3), - "divide": CToP.binary('/',3), - "remainder": CToP.binary('mod',3), - "implies": CToP.binary('\u21D2',3), - "factorof": CToP.binary('|',3), - "in": CToP.binary('\u2208',3), - "notin": CToP.binary('\u2209',3), - "notsubset": CToP.binary('\u2288',2), - "notprsubset": CToP.binary('\u2284',2), - "setdiff": CToP.binary('\u2216',2), - "eq": CToP.infix('=',1), - "compose": CToP.infix('\u2218',0), - "left_compose": CToP.infix('\u2218',1), - "xor": CToP.infix('xor',3), - "neq": CToP.infix('\u2260',1), - "gt": CToP.infix('>',1), - "lt": CToP.infix('<',1), - "geq": CToP.infix('\u2265',1), - "leq": CToP.infix('\u2264',1), - "equivalent": CToP.infix('\u2261',1), - "approx": CToP.infix('\u2248',1), - "subset": CToP.infix('\u2286',2), - "prsubset": CToP.infix('\u2282',2), - "cartesianproduct": CToP.infix('\u00D7',2), - "cartesian_product": CToP.infix('\u00D7',2), - "vectorproduct": CToP.infix('\u00D7',2), - "scalarproduct": CToP.infix('.',2), - "outerproduct": CToP.infix('\u2297',2), - "sum": CToP.iteration('\u2211','='), - "product": CToP.iteration('\u220F','='), - "forall": CToP.bind('\u2200',',',','), - "exists": CToP.bind('\u2203','\u007c',','), - "lambda": CToP.bind('\u03BB','.',','), - "limit": CToP.iteration('lim','\u2192'), - "sdev": CToP.fn('\u03c3'), - "determinant": CToP.fn('det'), - "max": CToP.minmax('max'), - "min": CToP.minmax('min'), - "real": CToP.fn('\u211b'), - "imaginary": CToP.fn('\u2111'), - "set": CToP.set('{','}'), - "list": CToP.set('(',')') - } - CToP.applyTokens['exp'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mi','e'); - CToP.applyTransform(msup,args[0],0); - parentNode.appendChild(msup); - } - - CToP.applyTokens['union'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(bvars.length) { - CToP.iteration('\u22C3','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } else { - CToP.infix('\u222A',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - CToP.applyTokens['intersect'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(bvars.length) { - CToP.iteration('\u22C2','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } else { - CToP.infix('\u2229',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - - CToP.applyTokens['floor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u230a'); - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','\u230b'); - parentNode.appendChild(mrow); - } - CToP.applyTokens['conjugate'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mover = CToP.createElement('mover'); - CToP.applyTransform(mover,args[0],0); - CToP.appendToken(mover,'mo','\u00af'); - parentNode.appendChild(mover); - } - CToP.applyTokens['abs'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','|'); - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','|'); - parentNode.appendChild(mrow); - } - CToP.applyTokens['and'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(bvars.length || qualifiers.length) { - CToP.iteration('\u22c0','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); - } else { - CToP.infix('\u2227',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - CToP.applyTokens['or'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(bvars.length || qualifiers.length) { - CToP.iteration('\u22c1','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); - } else { - CToP.infix('\u2228',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - CToP.applyTokens['xor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(bvars.length || qualifiers.length) { - CToP.iteration('xor','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); - } else { - CToP.infix('xor',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - CToP.applyTokens['card'] = CToP.applyTokens['size'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','|'); - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','|'); - parentNode.appendChild(mrow); - } - CToP.applyTokens['mean'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(args.length==1) { - var mover = CToP.createElement('mover'); - CToP.applyTransform(mover,args[0],0); - CToP.appendToken(mover,'mo','\u00af'); - parentNode.appendChild(mover); - } else { - parentNode.appendChild(CToP.mfenced(args,'\u27e8','\u27e9')); - } - } - CToP.applyTokens['moment'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var degree,momentabout; - - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='degree') { - degree = qualifiers[i]; - } else if(qualifiers[i].localName=='momentabout') { - momentabout = qualifiers[i]; - } - } - - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u27e8'); - var argrow = CToP.createElement('mrow'); - if(args.length>1) { - argrow.appendChild(CToP.mfenced(args,'(',')')); - } else { - CToP.applyTransform(argrow,args[0],0); - } - if(degree) { - var msup = CToP.createElement('msup'); - msup.appendChild(argrow); - var children = CToP.children(degree); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(msup,children[j],0); - } - mrow.appendChild(msup); - } else { - mrow.appendChild(argrow); - } - CToP.appendToken(mrow,'mo','\u27e9'); - - if(momentabout) { - var msub = CToP.createElement('msub'); - msub.appendChild(mrow); - var children = CToP.children(momentabout); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(msub,children[j],0); - } - parentNode.appendChild(msub); - } else { - parentNode.appendChild(mrow); - } - } - - CToP.applyTokens['variance'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mo','\u03c3'); - CToP.appendToken(msup,'mn','2'); - mrow.appendChild(msup); - CToP.appendToken(mrow,'mo','\u2061'); - mrow.appendChild(CToP.mfenced(args,'(',')')); - parentNode.appendChild(mrow); - } - CToP.applyTokens['grad'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u2207'); - CToP.appendToken(mrow,'mo','\u2061'); - mrow.appendChild(CToP.mfenced(args,'(',')')); - parentNode.appendChild(mrow); - }; - CToP.applyTokens['laplacian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mo','\u2207'); - CToP.appendToken(msup,'mn','2'); - mrow.appendChild(msup); - CToP.appendToken(mrow,'mo','\u2061'); - mrow.appendChild(CToP.mfenced(args,'(',')')); - parentNode.appendChild(mrow); - }; - CToP.applyTokens['curl'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u2207'); - CToP.appendToken(mrow,'mo','\u00d7'); - var needsBrackets = args[0].localName == 'apply'; - if(needsBrackets) { - mrow.appendChild(CToP.mfenced(args,'(', ')')); - } - else { - CToP.applyTransform(mrow,args[0],precedence); - } - parentNode.appendChild(mrow); - }; - CToP.applyTokens['divergence'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u2207'); - CToP.appendToken(mrow,'mo','\u22c5'); - var needsBrackets = args[0].localName == 'apply'; - if(needsBrackets) { - mrow.appendChild(CToP.mfenced(args,'(', ')')); - } - else { - CToP.applyTransform(mrow,args[0],precedence); - } - parentNode.appendChild(mrow); - }; - CToP.applyTokens['not'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u00ac'); - var needsBrackets = args[0].localName=='apply' || args[0].localName=='bind'; - if(needsBrackets) { - CToP.appendToken(mrow,'mo','('); - } - CToP.applyTransform(mrow,args[0],precedence); - if(needsBrackets) { - CToP.appendToken(mrow,'mo',')'); - } - parentNode.appendChild(mrow) - } - CToP.applyTokens['divide'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mfrac = CToP.createElement('mfrac'); - CToP.applyTransform(mfrac,args[0],0); - CToP.applyTransform(mfrac,args[1],0); - parentNode.appendChild(mfrac); - } - CToP.applyTokens['tendsto'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var type; - if(firstArg.localName=='tendsto') { - type = firstArg.getAttribute('type'); - } else { - type = args[0].textContent; - args = args.slice(1); - } - var name = (type=='above')? '\u2198' : - (type=='below') ? '\u2197' : '\u2192' ; - CToP.binary(name,2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - CToP.applyTokens['minus'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - if(args.length==1) { - CToP.binary('-',5)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } else { - CToP.binary('-',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); - } - } - CToP.applyTokens['complex-cartesian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','+'); - CToP.applyTransform(mrow,args[1],0); - CToP.appendToken(mrow,'mo','\u2062'); - CToP.appendToken(mrow,'mi','i'); - parentNode.appendChild(mrow); - } - - CToP.applyTokens['complex-polar'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','\u2062'); - var msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mi','e'); - var exponent = CToP.createElement('mrow'); - CToP.applyTransform(exponent,args[1],0); - CToP.appendToken(exponent,'mo','\u2062'); - CToP.appendToken(exponent,'mi','i'); - msup.appendChild(exponent); - mrow.appendChild(msup); - parentNode.appendChild(mrow); - } - - CToP.applyTokens['integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - CToP.applyTransform(parentNode,args[0],0); - } - - CToP.applyTokens['based-integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msub = CToP.createElement('msub'); - CToP.applyTransform(msub,args[1],0); - CToP.applyTransform(msub,args[0],0); - parentNode.appendChild(msub); - } - - CToP.applyTokens['rational'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mfrac = CToP.createElement('mfrac'); - CToP.applyTransform(mfrac,args[0],0); - CToP.applyTransform(mfrac,args[1],0); - parentNode.appendChild(mfrac); - } - - CToP.applyTokens['times'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var needsBrackets = precedence>3; - if(needsBrackets) { - CToP.appendToken(mrow,'mo','('); - } - for(var j=0;j<args.length; j++ ) { - if(j>0) { - CToP.appendToken(mrow,'mo',(args[j].localName=='cn') ? "\u00D7" :"\u2062"); - } - CToP.applyTransform(mrow,args[j],3); - } - if(needsBrackets) { - CToP.appendToken(mrow,'mo',')'); - } - parentNode.appendChild(mrow); - } - - CToP.applyTokens["plus"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var needsBrackets = precedence>2; - if(needsBrackets) { - CToP.appendToken(mrow,'mo','('); - } - for(var j=0;j<args.length; j++ ) { - var arg = args[j]; - var children = CToP.children(arg); - if(j>0) { - var n; - if(arg.localName=='cn' && !(children.length) && (n=Number(arg.textContent)) <0) { - CToP.appendToken(mrow,'mo','\u2212'); - CToP.appendToken(mrow,'mn', -n); - } else if(arg.localName=='apply' && children.length==2 && children[0].localName=='minus') { - CToP.appendToken(mrow,'mo','\u2212'); - CToP.applyTransform(mrow,children[1],2); - } else if(arg.localName=='apply' && children.length>2 && children[0].localName=='times' && children[1].localName=='cn' && ( n=Number(children[1].textContent) < 0)) { - CToP.appendToken(mrow,'mo','\u2212'); - children[1].textContent=-n;// fix me: modifying document - CToP.applyTransform(mrow,arg,2); - } else{ - CToP.appendToken(mrow,'mo','+'); - CToP.applyTransform(mrow,arg,2); - } - } else { - CToP.applyTransform(mrow,arg,2); - } - } - if(needsBrackets) { - CToP.appendToken(mrow,'mo',')'); - } - parentNode.appendChild(mrow); - } - - CToP.applyTokens['transpose'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msup = CToP.createElement('msup'); - CToP.applyTransform(msup,args[0],precedence); - CToP.appendToken(msup,'mi','T'); - parentNode.appendChild(msup); - } - - CToP.applyTokens['power'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msup = CToP.createElement('msup'); - CToP.applyTransform(msup,args[0],3); - CToP.applyTransform(msup,args[1],precedence); - parentNode.appendChild(msup); - } - - CToP.applyTokens['selector'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msub = CToP.createElement('msub'); - var mrow = args ? args[0]: CToP.createElement('mrow'); - CToP.applyTransform(msub,mrow,0); - var mrow2 = CToP.createElement('mrow'); - for(var i=1;i<args.length;i++){ - if(i!=1){ - CToP.appendToken(mrow2,'mo',','); - } - CToP.applyTransform(mrow2,args[i],0); - } - msub.appendChild(mrow2); - parentNode.appendChild(msub); - } - - CToP.applyTokens["log"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var mi = CToP.createElement('mi'); - mi.textContent = 'log'; - if(qualifiers.length && qualifiers[0].localName=='logbase'){ - var msub = CToP.createElement('msub'); - msub.appendChild(mi); - CToP.applyTransform(msub,CToP.children(qualifiers[0])[0],0); - mrow.appendChild(msub); - } else { - mrow.appendChild(mi); - } - CToP.applyTransform(mrow,args[0],7); - parentNode.appendChild(mrow); - } - - CToP.applyTokens["int"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - var mo = CToP.createElement('mo'); - mo.textContent='\u222B'; - var msubsup = CToP.createElement('msubsup'); - msubsup.appendChild(mo); - var mrow1 = CToP.createElement('mrow'); - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='lowlimit'|| - qualifiers[i].localName=='condition'|| - qualifiers[i].localName=='domainofapplication') - { - var children = CToP.children(qualifiers[i]); - for(var j=0;j<children.length;j++){ - CToP.applyTransform(mrow1,children[j],0); - } - } else { - var children = CToP.children(qualifiers[i]); - if (qualifiers[i].localName=='interval' && children.length==2) { - CToP.applyTransform(mrow1,children[0],0); - } - } - } - msubsup.appendChild(mrow1); - var mrow2 = CToP.createElement('mrow'); - for(var i=0; i<qualifiers.length;i++){ - if(qualifiers[i].localName=='uplimit'){ - var children = CToP.children(qualifiers[i]); - for(j=0;j<children.length;j++){ - CToP.applyTransform(mrow2,children[j],0); - } - break; - } else if(qualifiers[i].localName=='interval' ){ - var children = CToP.children(qualifiers[i]); - CToP.applyTransform(mrow2,children[children.length-1],0); - break; - } - } - msubsup.appendChild(mrow2); - mrow.appendChild(msubsup); - for(var i=0; i<args.length;i++){ - CToP.applyTransform(mrow,args[i],0); - } - for(var i=0; i<bvars.length;i++){ - var bvar = bvars[i]; - var children = CToP.children(bvar); - if(children.length){ - var mrow3 = CToP.createElement("mrow"); - CToP.appendToken(mrow3,'mi','d'); - CToP.applyTransform(mrow3,children[0],0); - mrow.appendChild(mrow3); - } - } - parentNode.appendChild(mrow); - } - - CToP.applyTokens["inverse"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var msup = CToP.createElement('msup'); - var arg = (args.length) ? args[0] : CToP.createElement('mrow'); - CToP.applyTransform(msup,arg,precedence); - var mfenced = CToP.createElement('mfenced'); - CToP.appendToken(mfenced,'mn','-1'); - msup.appendChild(mfenced); - parentNode.appendChild(msup); - } - - CToP.applyTokens["quotient"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.appendToken(mrow,'mo','\u230A'); - if(args.length) { - CToP.applyTransform(mrow,args[0],0); - CToP.appendToken(mrow,'mo','/'); - if(args.length>1){ - CToP.applyTransform(mrow,args[1],0); - } - } - CToP.appendToken(mrow,'mo','\u230B'); - parentNode.appendChild(mrow); - } - - CToP.applyTokens["factorial"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mrow = CToP.createElement('mrow'); - CToP.applyTransform(mrow,args[0],4); - CToP.appendToken(mrow,'mo','!'); - parentNode.appendChild(mrow); - } - - CToP.applyTokens["root"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var mr; - if(firstArg.localName=='root' && (qualifiers.length==0 || (qualifiers[0].localName=='degree' && qualifiers[0].textContent=='2'))){ - mr = CToP.createElement('msqrt'); - for(var i=0;i<args.length;i++){ - CToP.applyTransform(mr,args[i],0); - } - } else { - mr = CToP.createElement('mroot'); - CToP.applyTransform(mr,args[0],0); - var arg = (firstArg.localName=='root') ? qualifiers[0].childNodes[0] : args[1]; - CToP.applyTransform(mr,arg,0); - } - parentNode.appendChild(mr); - } - - CToP.applyTokens["diff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var m; - var mrow1 = CToP.createElement('mrow'); - if(bvars.length){ - m = CToP.createElement('mfrac'); - var msup, bvar; - var mi = CToP.createElement('mi'); - mi.textContent = 'd'; - var children = CToP.children(bvars[0]); - for(var j=0;j<children.length;j++){ - if(children[j].localName=='degree'){ - var childNode = CToP.children(children[j])[0]; - if(childNode.textContent!='1'){ - msup = CToP.createElement('msup'); - msup.appendChild(mi); - CToP.applyTransform(msup,childNode,0); - } - } else { - bvar = CToP.children(bvars[0])[j]; - } - } - mrow1.appendChild(msup || mi); - if(args.length){ - CToP.applyTransform(mrow1,args[0],0); - } - m.appendChild(mrow1); - mrow1 = CToP.createElement('mrow'); - CToP.appendToken(mrow1,'mi','d'); - if(msup){ - var msup2 = msup.cloneNode(true); - msup2.replaceChild(bvar,msup2.childNodes[0]); // fix me - mrow1.appendChild(msup2); - //CToP.applyTransform(bv,0); - } else { - CToP.applyTransform(mrow1,bvar,0); - } - m.appendChild(mrow1); - } else { - m = CToP.createElement('msup'); - m.appendChild(mrow1); - CToP.applyTransform(mrow1,args[0],0); - CToP.appendToken(m,'mo','\u2032'); - } - parentNode.appendChild(m); - } - - CToP.applyTokens["partialdiff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { - var m, mi, msup, mrow, mo, z; - - if(bvars.length==0 && args.length==2 && args[0].localName=='list'){ - if(args[1].localName=='lambda') { - m = CToP.createElement('mfrac'); - msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mo','\u2202'); - var degree = CToP.children(args[0]).length; - CToP.appendToken(msup,'mn',degree); - mrow = CToP.createElement('mrow'); - mrow.appendChild(msup); - var children = CToP.children(args[1]); - z = children[children.length - 1]; - CToP.applyTransform(mrow,z,0); - m.appendChild(mrow); - mrow = CToP.createElement('mrow'); - var bvarNames = []; - var lambdaChildren = CToP.children(args[1]); // names of bound variables - var lambdaSequence = CToP.children(args[0]); // indices of bound variable names, in order - for(var i=0;i<lambdaChildren.length;i++){ - if(lambdaChildren[i].localName=='bvar'){ - bvarNames.push(CToP.children(lambdaChildren[i])[0]); - } - } - var lastN = null, degree = 0; - function addDiff(n,degree) { - CToP.appendToken(mrow,'mo','\u2202'); - var bvar = bvarNames[n]; - if(degree>1) { - var msup = CToP.createElement('msup'); - CToP.applyTransform(msup,bvar,0); - CToP.appendToken(msup,'mn',degree); - mrow.appendChild(msup); - } else { - CToP.applyTransform(mrow,bvar,0); - } - } - for(var i=0;i<lambdaSequence.length;i++){ - var n = Number(lambdaSequence[i].textContent)-1; - if(lastN!==null && n!=lastN) { - addDiff(lastN,degree); - degree = 0; - } - lastN = n; - degree += 1; - } - if(lastN) { - addDiff(lastN,degree); - } - m.appendChild(mrow); - parentNode.appendChild(m); - } else { - m = CToP.createElement('mrow'); - var msub = CToP.createElement('msub'); - CToP.appendToken(msub,'mi','D'); - var bvar = CToP.children(args[0]); - msub.appendChild(CToP.mfenced(bvar,'','')); - m.appendChild(msub); - CToP.applyTransform(m,args[1],0); - parentNode.appendChild(m); - } - } else { - m = CToP.createElement('mfrac'); - msup = CToP.createElement('msup'); - CToP.appendToken(msup,'mo','\u2202'); - mrow = CToP.createElement('mrow'); - if(qualifiers.length && qualifiers[0].localName=='degree' && CToP.children(qualifiers[0]).length){ - var qualifier = CToP.children(qualifiers[0])[0]; - CToP.applyTransform(mrow,qualifier,0); - } else { - var degree = 0; - var hadFirst = false; - for(var i=0;i<bvars.length;i++){ - var children = CToP.children(bvars[i]); - if(children.length==2){ - for(j=0;j<2;j++){ - if(children[j].localName=='degree') { - if(/^\s*\d+\s*$/.test(children[j].textContent)){ - degree += Number(children[j].textContent); - } else { - if(hadFirst){ - CToP.appendToken(mrow,'mo','+'); - } - } - hadFirst = true; - var degreeNode = CToP.children(children[j])[0]; - CToP.applyTransform(mrow,degreeNode,0); - } - } - } else { - degree++; - } - } - if(degree>0){ - if(hadFirst){ - CToP.appendToken(mrow,'mo','+'); - } - CToP.appendToken(mrow,'mn',degree); - } - } - msup.appendChild(mrow); - mrow = CToP.createElement('mrow'); - mrow.appendChild(msup); - if(args.length){ - CToP.applyTransform(mrow,args[0],0); - } - m.appendChild(mrow); - mrow = CToP.createElement('mrow'); - for(var i=0;i<bvars.length;i++){ - CToP.appendToken(mrow,'mo','\u2202'); - var children = CToP.children(bvars[i]); - if(children.length==2){ - for(j=0;j<2;j++){ - if(children[j].localName=='degree'){ - msup = CToP.createElement('msup'); - CToP.applyTransform(msup,children[1-j],0); - var degreeNode = CToP.children(children[j])[0]; - CToP.applyTransform(msup,degreeNode,0); - mrow.appendChild(msup); - } - } - } else if(children.length==1) { - CToP.applyTransform(mrow,children[0],0); - } - } - m.appendChild(mrow); - parentNode.appendChild(m); - } - } - return CToP; - })(); + version: '2.4', + settings: { + // render `a+(-b)` as `a-b`? + collapsePlusMinus: true, + + /* mathvariant to use with corresponding <ci> type attribute */ + cistyles: { + "vector": 'bold-italic', + "matrix": 'bold-upright' + }, + + /* Symbol names to translate to characters + */ + symbols: { + "gamma": '\u03B3' + } + + }, + + /* Transform the given <math> elements from Content MathML to Presentation MathML and replace the original elements + */ + transformElements: function(elements){ + for (var i = 0; i< elements.length;i++){ + var mathNode = CToP.transformElement(elements[i]); + elements[i].parentNode.replaceChild(mathNode,elements[i]); + } + }, + + /* Transform a Content MathML element into Presentation MathML, and return the new element + */ + transformElement: function(element) { + var mathNode = element.cloneNode(false); + for(var j=0;j<element.childNodes.length; j++ ) { + CToP.applyTransform(mathNode,element.childNodes[j],0); + } + return mathNode; + }, + + /* Create an element with given name, belonging to the MathML namespace + */ + createElement: function(name) { + return document.createElementNS("http://www.w3.org/1998/Math/MathML",name); + }, + + /* Get node's children + */ + getChildren: function(node) { + var children=[]; + for(var j=0;j<node.childNodes.length; j++ ) { + if(node.childNodes[j].nodeType==document.ELEMENT_NODE) { + children.push(node.childNodes[j]); + } + } + return children; + }, + + /* Classify node's children as argumentss, variable bindings, or qualifiers + */ + classifyChildren: function(contentMMLNode) { + var args = [], bvars = [], qualifiers = []; + for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { + if(contentMMLNode.childNodes[j].nodeType==document.ELEMENT_NODE) { + var childNode = contentMMLNode.childNodes[j], name = childNode.localName; + if(name=='bvar'){ + bvars.push(childNode); + } else if(name=='condition'|| + name=='degree'|| + name=='momentabout'|| + name=='logbase'|| + name=='lowlimit'|| + name=='uplimit'|| + (name=='interval' && args.length<2)|| + name=='domainofapplication') { + qualifiers.push(childNode); + } else { + args.push(childNode); + } + } + } + return { + args:args, + bvars:bvars, + qualifiers:qualifiers + }; + }, + + /* Add an element with given name and text content + */ + appendToken: function(parentNode,name,textContent) { + var element = CToP.createElement(name); + element.textContent = textContent; + parentNode.appendChild(element); + return element; + }, + + /* Transform a Content MathML node to Presentation MathML node(s), and attach it to the parent + */ + applyTransform: function(parentNode,contentMMLNode,precedence) { + if(!contentMMLNode) { + var merror = CToP.createElement('merror'); + CToP.appendToken(merror,'mtext','Missing child node'); + parentNode.appendChild(merror); + return; + } + if (contentMMLNode.nodeType==document.ELEMENT_NODE) { + if(CToP.tokens[contentMMLNode.localName]) { + CToP.tokens[contentMMLNode.localName](parentNode,contentMMLNode,precedence); + } else if (contentMMLNode.childNodes.length==0) { + CToP.appendToken(parentNode,'mi',contentMMLNode.localName); + } else { + var clonedChild = contentMMLNode.cloneNode(false); + parentNode.appendChild(clonedChild); + for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { + CToP.applyTransform(clonedChild,contentMMLNode.childNodes[j],precedence); + } + } + } else if (contentMMLNode.nodeType==document.TEXT_NODE) { + parentNode.appendChild(contentMMLNode.cloneNode(false)); + } + }, + + /* Make an mfenced environment + */ + createmfenced: function(children,open,close) { + var mf = CToP.createElement('mfenced'); + mf.setAttribute('open',open); + mf.setAttribute('close',close); + for(var j=0;j<children.length; j++ ) { + CToP.applyTransform(mf,children[j],0); + } + return mf; + }, + + transforms: { + + /* Transform an identifier symbol + */ + identifier: function(textContent) { + return function(parentNode,contentMMLNode,precedence) { + CToP.appendToken(parentNode,'mi',textContent); + } + }, + + /* Transform a set or set-like notation + */ + set: function(open,close) { + var bindSet = CToP.transforms.bind('',',','|'); + return function(parentNode,contentMMLNode) { + var children = CToP.classifyChildren(contentMMLNode); + + var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; + if(bvars.length) { + var firstArg=children.args[0]; + args = args.slice(1); + var mfenced = CToP.createElement('mfenced'); + mfenced.setAttribute('open',open); + mfenced.setAttribute('close',close); + bindSet(mfenced,contentMMLNode,firstArg,args,bvars,qualifiers,0); + parentNode.appendChild(mfenced); + } else { + parentNode.appendChild(CToP.createmfenced(args,open,close)); + } + } + }, + + /* Transform a content token to a presentation token + * + * (function factory) + * @param {string} name - name of the corresponding presentation MML tag + */ + token: function(name) { + return function(parentNode,contentMMLNode) { + if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) { + CToP.appendToken(parentNode,name,contentMMLNode.textContent); + } else { + var mrow = CToP.createElement('mrow'); + for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { + if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) { + CToP.appendToken(parentNode,name,contentMMLNode.childNodes[j].textContent); + }else{ + CToP.applyTransform(mrow,contentMMLNode.childNodes[j],0); + } + } + if(mrow.childNodes.length) { + parentNode.appendChild(mrow); + } + } + } + }, + + /* Transform a binary operation + * + * (function factory) + */ + binary: function(name,tokenPrecedence) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var needsBrackets = tokenPrecedence<precedence || (tokenPrecedence==precedence && name=="-"); + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + if(args.length>1){ + CToP.applyTransform(mrow,args[0],tokenPrecedence); + } + CToP.appendToken(mrow,'mo',name); + if(args.length>0){ + var z = args[(args.length==1)?0:1]; + CToP.applyTransform(mrow,z,tokenPrecedence); + } + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); + } + }, + + /* Transform an infix operator + * + * (function factory) + */ + infix: function(name,tokenPrecedence) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var needsBrackets = precedence>tokenPrecedence; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + for(var j=0;j<args.length; j++ ) { + if(j>0) { + CToP.appendToken(mrow,'mo',name); + } + CToP.applyTransform(mrow,args[j],tokenPrecedence); + } + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); + } + }, + + /* Transform an iterated operation, e.g. summation + * + * (function factory + */ + iteration: function(name,limitSymbol) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var mo = CToP.createElement('mo'); + mo.textContent = name; + var munderover = CToP.createElement('munderover'); + munderover.appendChild(mo); + var mrow1 = CToP.createElement('mrow'); + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='lowlimit'|| + qualifiers[i].localName=='condition'|| + qualifiers[i].localName=='domainofapplication') + { + if(qualifiers[i].localName=='lowlimit'){ + for(var j=0; j<bvars.length;j++){ + var bvar = bvars[j]; + var children = CToP.getChildren(bvar); + if(children.length){ + CToP.applyTransform(mrow1,children[0],0); + } + } + if(bvars.length){ + CToP.appendToken(mrow1,"mo",limitSymbol); + } + } + var children = CToP.getChildren(qualifiers[i]); + for(j=0;j<children.length;j++){ + CToP.applyTransform(mrow1,children[j],0); + } + } else { + var children = CToP.getChildren(qualifiers[i]); + if (qualifiers[i].localName=='interval' && children.length==2) { + for(var j=0; j<bvars.length;j++){ + var bvar = b[j]; + var children = CToP.getChildren(bvar); + if(children.length){ + CToP.applyTransform(mrow1,children[0],0); + } + } + if(bvars.length){ + CToP.appendToken(mrow1,"mo","="); + } + CToP.applyTransform(mrow1,CToP.getChildren(qualifiers[i])[0],0); + } + } + } + munderover.appendChild(mrow1); + var mjrow = CToP.createElement('mrow'); + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='uplimit' ||qualifiers[i].localName=='interval' ) + { + var children = CToP.getChildren(qualifiers[i]); + for(j=0;j<children.length;j++){ + CToP.applyTransform(mjrow,children[j],0); + } + } + } + munderover.appendChild(mjrow); + mrow.appendChild(munderover); + + for(var i=0; i<args.length;i++){ + CToP.applyTransform(mrow,args[i],precedence); + } + + parentNode.appendChild(mrow); + } + }, + + /* Transform something which binds a variable, e.g. forall or lambda + * + * (function factory) + */ + bind: function(name,argSeparator,conditionSeparator) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + if(name) { + CToP.appendToken(mrow,'mo',name); + } + for(var j=0; j<bvars.length;j++){ + var bvar = bvars[j]; + if(j>0) { + CToP.appendToken(mrow,'mo',','); + } + var children = CToP.getChildren(bvar); + if(children.length){ + CToP.applyTransform(mrow,children[0],0); + } + } + + var conditions_mrow = CToP.createElement('mrow'); + var conditions = false, children; + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='condition') { + conditions = true; + children = CToP.getChildren(qualifiers[i]); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(conditions_mrow,children[j],0); + } + } + } + if(conditions){ + CToP.appendToken(mrow,'mo',conditionSeparator); + } + mrow.appendChild(conditions_mrow); + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName!='condition') { + CToP.appendToken(mrow,'mo','\u2208'); + children = CToP.getChildren(qualifiers[i]); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(mrow,children[j],0); + } + } + } + if(args.length && (bvars.length||children.length)) { + CToP.appendToken(mrow,'mo',argSeparator); + } + for(var i=0; i<args.length;i++){ + CToP.applyTransform(mrow,args[i],0); + } + parentNode.appendChild(mrow); + } + }, + + /** Transform a function application + * + * i.e. something which ends up looking like `f(x,y,z)`, where `f` is a string + * + * (function factory) + */ + fn: function(name) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + if(firstArg.childNodes.length){ + CToP.applyTransform(mrow,firstArg,1); + } else { + CToP.appendToken(mrow,'mi',name); + } + CToP.appendToken(mrow,'mo','\u2061'); + mrow.appendChild(CToP.createmfenced(args,'(',')')); + parentNode.appendChild(mrow); + } + }, + + /** Transform a min/max operation + * + * (function factory) + */ + minmax: function(name) { + return function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mi',name); + var mrow2 = CToP.createElement('mrow'); + CToP.appendToken(mrow2,'mo','{'); + for(var i=0;i<args.length;i++) { + if(i>0) { + CToP.appendToken(mrow2,'mo',','); + } + CToP.applyTransform(mrow2,args[i],0); + } + if(qualifiers.length) { + CToP.appendToken(mrow2,'mo','|'); + for(var i=0;i<qualifiers.length;i++) { + CToP.applyTransform(mrow2,qualifiers[i],0); + } + } + CToP.appendToken(mrow2,'mo','}'); + mrow.appendChild(mrow2); + parentNode.appendChild(mrow); + } + } + } +} + +/* Functions to transform variable/atom tokens + */ +CToP.tokens = { + "ci": function(parentNode,contentMMLNode,precedence) { + if(contentMMLNode.childNodes.length==1 && contentMMLNode.childNodes[0].nodeType==document.TEXT_NODE) { + var mi = CToP.appendToken(parentNode,'mi',contentMMLNode.textContent); + var type = contentMMLNode.getAttribute('type'); + if(type in CToP.settings.cistyles) { + mi.setAttribute('mathvariant',CToP.settings.cistyles[type]); + } + } else { + CToP.transforms.token('mi')(parentNode,contentMMLNode,precedence); + } + }, + "cs": CToP.transforms.token('ms'), + + "csymbol": function(parentNode,contentMMLNode,precedence) { + var cd = contentMMLNode.getAttribute('cd'); + if(cd && CToP.contentDictionaries[cd]) { + CToP.contentDictionaries[cd](parentNode,contentMMLNode,precedence); + } else if(CToP.settings.symbols[name]){ + CToP.appendToken(parentNode,'mi',CToP.settings.symbols[name]); + } else { + CToP.tokens['ci'](parentNode,contentMMLNode); + } + }, + "fn": function(parentNode,contentMMLNode,precedence) { + CToP.applyTransform(parentNode,CToP.getChildren(contentMMLNode)[0],precedence); + }, + + "naturalnumbers": CToP.transforms.identifier('\u2115'), + "integers": CToP.transforms.identifier('\u2124'), + "reals": CToP.transforms.identifier('\u211D'), + "rationals": CToP.transforms.identifier('\u211A'), + "complexes": CToP.transforms.identifier('\u2102'), + "primes": CToP.transforms.identifier('\u2119'), + "exponentiale": CToP.transforms.identifier('e'), + "imaginaryi": CToP.transforms.identifier('i'), + "notanumber": CToP.transforms.identifier('NaN'), + "eulergamma": CToP.transforms.identifier('\u03B3'), + "gamma": CToP.transforms.identifier('\u0263'), + "pi": CToP.transforms.identifier('\u03C0'), + "infinity": CToP.transforms.identifier('\u221E'), + "emptyset": CToP.transforms.identifier('\u2205'), + "true": CToP.transforms.identifier('true'), + "false": CToP.transforms.identifier('false'), + 'set': CToP.transforms.set('{','}'), + 'list': CToP.transforms.set('(',')') +} + +CToP.tokens['interval'] = function(parentNode,contentMMLNode,precedence) { + var closure = contentMMLNode.getAttribute('closure'); + + var open, close; + switch(closure) { + case 'open': + open = '('; + close = ')'; + break; + case 'open-closed': + open = '('; + close = ']'; + break; + case 'closed-open': + open = '['; + close = ')'; + break; + case 'closed': + default: + open = '['; + close = ']'; + } + + parentNode.appendChild(CToP.createmfenced(CToP.getChildren(contentMMLNode),open,close)); +} +CToP.tokens['apply'] = CToP.tokens['reln'] = CToP.tokens['bind'] = function(parentNode,contentMMLNode,precedence) { + var children = CToP.classifyChildren(contentMMLNode); + + var firstArg=children.args[0]; + var args = children.args.slice(1), bvars = children.bvars, qualifiers = children.qualifiers; + + if(firstArg) { + var name = firstArg.localName; + name = (name=="csymbol") ? firstArg.textContent.toLowerCase() : name; + if(CToP.applyTokens[name]) { + CToP.applyTokens[name](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } else { + CToP.transforms.fn(name)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } + } else { + parentNode.appendChild(CToP.createElement('mrow')); + } +} + +CToP.tokens['cn'] = function(parentNode,contentMMLNode,precedence) { + var type = contentMMLNode.getAttribute("type"); + var base = contentMMLNode.getAttribute("base"); + if(type || base) { + if(base) { + type = 'based-integer'; + } + switch(type) { + case 'integer': + case 'real': + case 'double': + case 'constant': + CToP.transforms.token('mn')(parentNode,contentMMLNode); + break; + case 'hexdouble': + CToP.appendToken(parentNode,'mn','0x'+contentMMLNode.textContent); + break; + default: + var apply = CToP.createElement('apply'); + var mrow = CToP.createElement('mrow'); + var c = CToP.createElement(type); + apply.appendChild(c); + if(base) { + CToP.appendToken(apply,'mn',base); + } + for(var j=0;j<contentMMLNode.childNodes.length; j++ ) { + if (contentMMLNode.childNodes[j].nodeType==document.TEXT_NODE) { + CToP.appendToken(mrow,'cn',contentMMLNode.childNodes[j].textContent); + }else if (contentMMLNode.childNodes[j].localName=='sep'){ + apply.appendChild(mrow); + mrow = CToP.createElement('mrow'); + } else { + mrow.appendChild(contentMMLNode.childNodes[j].cloneNode(true)); + } + } + apply.appendChild(mrow); + CToP.applyTransform(parentNode,apply,0); + } + } else { + CToP.transforms.token('mn')(parentNode,contentMMLNode); + } +} + +CToP.tokens['vector'] = function(parentNode,contentMMLNode,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','('); + + var mtable = CToP.createElement('mtable'); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++) { + var mtr = CToP.createElement('mtr'); + var mtd = CToP.createElement('mtd'); + CToP.applyTransform(mtd,children[i],0); + mtr.appendChild(mtd); + mtable.appendChild(mtr); + } + + mrow.appendChild(mtable); + CToP.appendToken(mrow,'mo',')'); + parentNode.appendChild(mrow); +} + +CToP.tokens['piecewise'] = function(parentNode,contentMMLNode,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','{'); + var mtable = CToP.createElement('mtable'); + mrow.appendChild(mtable); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++){ + CToP.applyTransform(mtable,children[i],0); + } + parentNode.appendChild(mrow); +} + +CToP.tokens['piece'] = function(parentNode,contentMMLNode,precedence) { + var mtr = CToP.createElement('mtr'); + var children = CToP.getChildren(contentMMLNode); + for(i=0;i<children.length;i++){ + var mtd = CToP.createElement('mtd'); + mtr.appendChild(mtd); + CToP.applyTransform(mtd,children[i],0); + if(i==0){ + var mtd = CToP.createElement('mtd'); + CToP.appendToken(mtd,"mtext","\u00A0if\u00A0"); + mtr.appendChild(mtd); + } + } + parentNode.appendChild(mtr); +} + +CToP.tokens['otherwise'] = function(parentNode,contentMMLNode,precedence) { + var mtr = CToP.createElement('mtr'); + var children = CToP.getChildren(contentMMLNode); + if(children.length){ + var mtd = CToP.createElement('mtd'); + mtr.appendChild(mtd); + CToP.applyTransform(mtd,children[0],0); + var mtd = CToP.createElement('mtd'); + mtd.setAttribute('columnspan','2'); + CToP.appendToken(mtd,"mtext","\u00A0otherwise"); + mtr.appendChild(mtd); + } + parentNode.appendChild(mtr); +} + +CToP.tokens['matrix'] = function(parentNode,contentMMLNode,precedence) { + var children = CToP.classifyChildren(contentMMLNode); + var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; + + if(bvars.length || qualifiers.length) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,"mo","["); + var msub = CToP.createElement('msub'); + CToP.appendToken(msub,'mi','m'); + var mrow2 = CToP.createElement('mrow'); + for(var i=0;i<bvars.length;i++){ + if(i!=0){ + CToP.appendToken(mrow2,'mo',','); + } + CToP.applyTransform(mrow2,bvars[i].childNodes[0],0); + } + msub.appendChild(mrow2); + mrow.appendChild(msub); + var msub2 = msub.cloneNode(true); + CToP.appendToken(mrow,'mo','|'); + mrow.appendChild(msub2); + CToP.appendToken(mrow,'mo','='); + for(var i=0;i<args.length;i++){ + if(i!=0){ + CToP.appendToken(mrow,'mo',','); + } + CToP.applyTransform(mrow,args[i],0); + } + CToP.appendToken(mrow,'mo',';'); + for(var i=0;i<qualifiers.length;i++){ + if(i!=0){ + CToP.appendToken(mrow,'mo',','); + } + CToP.applyTransform(mrow,qualifiers[i],0); + } + CToP.appendToken(mrow,'mo',']'); + parentNode.appendChild(mrow); + } else { + var mfenced = CToP.createElement('mfenced'); + var mtable = CToP.createElement('mtable'); + for(var i=0;i<args.length;i++){ + CToP.applyTransform(mtable,args[i],0); + } + mfenced.appendChild(mtable); + parentNode.appendChild(mfenced); + } +} + +CToP.tokens['matrixrow'] = function(parentNode,contentMMLNode,precedence) { + var mtr = CToP.createElement('mtr'); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++){ + var mtd = CToP.createElement('mtd'); + CToP.applyTransform(mtd,children[i],0); + mtr.appendChild(mtd); + } + parentNode.appendChild(mtr); +} + +CToP.tokens['condition'] = function(parentNode,contentMMLNode,precedence) { + var mrow = CToP.createElement('mrow'); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++){ + CToP.applyTransform(mrow,children[i],0); + } + parentNode.appendChild(mrow); +} +CToP.tokens['lambda'] = function(parentNode,contentMMLNode,precedence) { + var firstArg = CToP.createElement('lambda'); + var children = CToP.classifyChildren(contentMMLNode); + var args = children.args, bvars = children.bvars, qualifiers = children.qualifiers; + + if(bvars.length){ + CToP.applyTokens["lambda"](parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } else { + var mrow=CToP.createElement('mrow'); + for(var i=0;i<args.length;i++){ + CToP.applyTransform(mrow,args[i],0); + } + if(qualifiers.length){ + var msub = CToP.createElement('msub'); + CToP.appendToken(msub,'mo','|'); + var mrow2 = CToP.createElement('mrow'); + for(var i=0;i<qualifiers.length;i++){ + var children = CToP.getChildren(qualifiers[i]); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(mrow2,children[j],0); + } + } + msub.appendChild(mrow2); + mrow.appendChild(msub); + } + parentNode.appendChild(mrow); + } +} +CToP.tokens["ident"] = function(parentNode,contentMMLNode,precedence) { + CToP.appendToken(parentNode,"mi","id") +} + +CToP.tokens["domainofapplication"] = function(parentNode,contentMMLNode,precedence) { + var merror = CToP.createElement('merror'); + CToP.appendToken(merror,'mtext','unexpected domainofapplication'); + parentNode.appendChild(merror); +} + +CToP.tokens["share"] = function(parentNode,contentMMLNode,precedence) { + var mi = CToP.createElement('mi'); + mi.setAttribute('href',contentMMLNode.getAttribute('href')); + mi.textContent = "Share " + contentMMLNode.getAttribute('href'); + parentNode.appendChild(mi); +} + +CToP.tokens["cerror"] = function(parentNode,contentMMLNode,precedence) { + var merror = CToP.createElement('merror'); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++){ + CToP.applyTransform(merror,children[i],0); + } + parentNode.appendChild(merror); +} + +CToP.tokens["semantics"] = function(parentNode,contentMMLNode,precedence) { + var mrow = CToP.createElement('mrow'); + var children = CToP.getChildren(contentMMLNode); + if(children.length){ + var z = children[0]; + for(var i=0;i<children.length;i++){ + if(children[i].localName=='annotation-xml' && children[i].getAttribute('encoding')=='MathML-Presentation'){ + z = children[i]; + break; + } + } + CToP.applyTransform(mrow,z,0); + } + parentNode.appendChild(mrow); +} + +CToP.tokens["annotation-xml"] = function(parentNode,contentMMLNode,precedence) { + var mrow = CToP.createElement('mrow'); + var children = CToP.getChildren(contentMMLNode); + for(var i=0;i<children.length;i++){ + CToP.applyTransform(mrow,children[i],0); + } + parentNode.appendChild(mrow); +} + + +CToP.contentDictionaries = { + "setname1": function(parentNode,contentMMLNode,precedence) { + var sets = { + "C": '\u2102', + "N": '\u2115', + "P": '\u2119', + "Q": '\u211A', + "R": '\u211D', + "Z": '\u2124' + } + var name = contentMMLNode.textContent; + CToP.appendToken(parentNode,'mi',sets[name]); + }, + "aritherror": function(parentNode,contentMMLNode,precedence) { + var name = contentMMLNode.textContent; + CToP.appendToken(parentNode,'mi',name+':'); + } +} + +/* Functions to transform function/operation application tokens + */ +CToP.applyTokens = { + "rem": CToP.transforms.binary('mod',3), + "divide": CToP.transforms.binary('/',3), + "remainder": CToP.transforms.binary('mod',3), + "implies": CToP.transforms.binary('\u21D2',3), + "factorof": CToP.transforms.binary('|',3), + "in": CToP.transforms.binary('\u2208',3), + "notin": CToP.transforms.binary('\u2209',3), + "notsubset": CToP.transforms.binary('\u2288',2), + "notprsubset": CToP.transforms.binary('\u2284',2), + "setdiff": CToP.transforms.binary('\u2216',2), + "eq": CToP.transforms.infix('=',1), + "compose": CToP.transforms.infix('\u2218',0), + "left_compose": CToP.transforms.infix('\u2218',1), + "xor": CToP.transforms.infix('xor',3), + "neq": CToP.transforms.infix('\u2260',1), + "gt": CToP.transforms.infix('>',1), + "lt": CToP.transforms.infix('<',1), + "geq": CToP.transforms.infix('\u2265',1), + "leq": CToP.transforms.infix('\u2264',1), + "equivalent": CToP.transforms.infix('\u2261',1), + "approx": CToP.transforms.infix('\u2248',1), + "subset": CToP.transforms.infix('\u2286',2), + "prsubset": CToP.transforms.infix('\u2282',2), + "cartesianproduct": CToP.transforms.infix('\u00D7',2), + "cartesian_product": CToP.transforms.infix('\u00D7',2), + "vectorproduct": CToP.transforms.infix('\u00D7',2), + "scalarproduct": CToP.transforms.infix('.',2), + "outerproduct": CToP.transforms.infix('\u2297',2), + "sum": CToP.transforms.iteration('\u2211','='), + "product": CToP.transforms.iteration('\u220F','='), + "forall": CToP.transforms.bind('\u2200','.',','), + "exists": CToP.transforms.bind('\u2203','.',','), + "lambda": CToP.transforms.bind('\u03BB','.',','), + "limit": CToP.transforms.iteration('lim','\u2192'), + "sdev": CToP.transforms.fn('\u03c3'), + "determinant": CToP.transforms.fn('det'), + "max": CToP.transforms.minmax('max'), + "min": CToP.transforms.minmax('min'), + "real": CToP.transforms.fn('\u211b'), + "imaginary": CToP.transforms.fn('\u2111'), + "set": CToP.transforms.set('{','}'), + "list": CToP.transforms.set('(',')') +} +CToP.applyTokens['exp'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msup = CToP.createElement('msup'); + CToP.appendToken(msup,'mi','e'); + CToP.applyTransform(msup,args[0],0); + parentNode.appendChild(msup); +} + +CToP.applyTokens['union'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length) { + CToP.transforms.iteration('\u22C3','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } else { + CToP.transforms.infix('\u222A',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } +} +CToP.applyTokens['intersect'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length) { + CToP.transforms.iteration('\u22C2','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } else { + var mrow = CToP.createElement('mrow'); + var needsBrackets = precedence>2; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + for(var j=0;j<args.length; j++ ) { + var argBrackets = false; + if(j>0) { + CToP.appendToken(mrow,'mo','\u2229'); + if(args[j].localName=='apply') { + var child = CToP.getChildren(args[j])[0]; + argBrackets = child.localName == 'union'; + } + } + if(argBrackets) { + CToP.appendToken(mrow,'mo','('); + } + CToP.applyTransform(mrow,args[j],2); + if(argBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + } + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); + } +} + +CToP.applyTokens['floor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u230a'); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','\u230b'); + parentNode.appendChild(mrow); +} +CToP.applyTokens['conjugate'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mover = CToP.createElement('mover'); + CToP.applyTransform(mover,args[0],0); + CToP.appendToken(mover,'mo','\u00af'); + parentNode.appendChild(mover); +} +CToP.applyTokens['abs'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','|'); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','|'); + parentNode.appendChild(mrow); +} +CToP.applyTokens['and'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length || qualifiers.length) { + CToP.transforms.iteration('\u22c0','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); + } else { + CToP.transforms.infix('\u2227',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } +} +CToP.applyTokens['or'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length || qualifiers.length) { + CToP.transforms.iteration('\u22c1','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); + } else { + CToP.transforms.infix('\u2228',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } +} +CToP.applyTokens['xor'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length || qualifiers.length) { + CToP.transforms.iteration('xor','=')(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,4); + } else { + CToP.transforms.infix('xor',2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); + } +} +CToP.applyTokens['card'] = CToP.applyTokens['size'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','|'); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','|'); + parentNode.appendChild(mrow); +} +CToP.applyTokens['mean'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(args.length==1) { + var mover = CToP.createElement('mover'); + CToP.applyTransform(mover,args[0],0); + CToP.appendToken(mover,'mo','\u00af'); + parentNode.appendChild(mover); + } else { + parentNode.appendChild(CToP.createmfenced(args,'\u27e8','\u27e9')); + } +} +CToP.applyTokens['moment'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var degree,momentabout; + + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='degree') { + degree = qualifiers[i]; + } else if(qualifiers[i].localName=='momentabout') { + momentabout = qualifiers[i]; + } + } + + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u27e8'); + var argrow = CToP.createElement('mrow'); + if(args.length>1) { + argrow.appendChild(CToP.createmfenced(args,'(',')')); + } else { + CToP.applyTransform(argrow,args[0],0); + } + if(degree) { + var msup = CToP.createElement('msup'); + msup.appendChild(argrow); + var children = CToP.getChildren(degree); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(msup,children[j],0); + } + mrow.appendChild(msup); + } else { + mrow.appendChild(argrow); + } + CToP.appendToken(mrow,'mo','\u27e9'); + + if(momentabout) { + var msub = CToP.createElement('msub'); + msub.appendChild(mrow); + var children = CToP.getChildren(momentabout); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(msub,children[j],0); + } + parentNode.appendChild(msub); + } else { + parentNode.appendChild(mrow); + } +} + +CToP.applyTokens['variance'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var msup = CToP.createElement('msup'); + CToP.appendToken(msup,'mo','\u03c3'); + CToP.appendToken(msup,'mn','2'); + mrow.appendChild(msup); + CToP.appendToken(mrow,'mo','\u2061'); + mrow.appendChild(CToP.createmfenced(args,'(',')')); + parentNode.appendChild(mrow); +} +CToP.applyTokens['grad'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u2207'); + CToP.appendToken(mrow,'mo','\u2061'); + mrow.appendChild(CToP.createmfenced(args,'(',')')); + parentNode.appendChild(mrow); +}; +CToP.applyTokens['laplacian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var msup = CToP.createElement('msup'); + CToP.appendToken(msup,'mo','\u2207'); + CToP.appendToken(msup,'mn','2'); + mrow.appendChild(msup); + CToP.appendToken(mrow,'mo','\u2061'); + mrow.appendChild(CToP.createmfenced(args,'(',')')); + parentNode.appendChild(mrow); +}; +CToP.applyTokens['curl'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u2207'); + CToP.appendToken(mrow,'mo','\u00d7'); + var needsBrackets = args[0].localName == 'apply'; + if(needsBrackets) { + mrow.appendChild(CToP.createmfenced(args,'(', ')')); + } + else { + CToP.applyTransform(mrow,args[0],precedence); + } + parentNode.appendChild(mrow); +}; +CToP.applyTokens['divergence'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u2207'); + CToP.appendToken(mrow,'mo','\u22c5'); + var needsBrackets = args[0].localName == 'apply'; + if(needsBrackets) { + mrow.appendChild(CToP.createmfenced(args,'(', ')')); + } + else { + CToP.applyTransform(mrow,args[0],precedence); + } + parentNode.appendChild(mrow); +}; +CToP.applyTokens['not'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u00ac'); + var needsBrackets = args[0].localName=='apply' || args[0].localName=='bind'; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + CToP.applyTransform(mrow,args[0],precedence); + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow) +} +CToP.applyTokens['divide'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mfrac = CToP.createElement('mfrac'); + CToP.applyTransform(mfrac,args[0],0); + CToP.applyTransform(mfrac,args[1],0); + parentNode.appendChild(mfrac); +} +CToP.applyTokens['tendsto'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var type; + if(firstArg.localName=='tendsto') { + type = firstArg.getAttribute('type'); + } else { + type = args[0].textContent; + args = args.slice(1); + } + var name = (type=='above')? '\u2198' : + (type=='below') ? '\u2197' : '\u2192' ; + CToP.transforms.binary(name,2)(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence); +} +CToP.applyTokens['minus'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var tokenPrecedence = args.length==1 ? 5 : 2; + + var mrow = CToP.createElement('mrow'); + var needsBrackets = tokenPrecedence<precedence; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + + if(args.length==1) { + CToP.appendToken(mrow,'mo','-'); + CToP.applyTransform(mrow,args[0],tokenPrecedence); + } else { + CToP.applyTransform(mrow,args[0],tokenPrecedence); + CToP.appendToken(mrow,'mo','-'); + var bracketArg; + if(args[1].localName=='apply') { + var argOp = CToP.getChildren(args[1])[0]; + bracketArg = argOp.localName=='plus' || argOp.localName=='minus'; + } + if(bracketArg) { + CToP.appendToken(mrow,'mo','('); + } + CToP.applyTransform(mrow,args[1],tokenPrecedence); + if(bracketArg) { + CToP.appendToken(mrow,'mo',')'); + } + } + + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); +} +CToP.applyTokens['complex-cartesian'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','+'); + CToP.applyTransform(mrow,args[1],0); + CToP.appendToken(mrow,'mo','\u2062'); + CToP.appendToken(mrow,'mi','i'); + parentNode.appendChild(mrow); +} + +CToP.applyTokens['complex-polar'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','\u2062'); + var msup = CToP.createElement('msup'); + CToP.appendToken(msup,'mi','e'); + var exponent = CToP.createElement('mrow'); + CToP.applyTransform(exponent,args[1],0); + CToP.appendToken(exponent,'mo','\u2062'); + CToP.appendToken(exponent,'mi','i'); + msup.appendChild(exponent); + mrow.appendChild(msup); + parentNode.appendChild(mrow); +} + +CToP.applyTokens['integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + CToP.applyTransform(parentNode,args[0],0); +} + +CToP.applyTokens['based-integer'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msub = CToP.createElement('msub'); + CToP.applyTransform(msub,args[1],0); + CToP.applyTransform(msub,args[0],0); + parentNode.appendChild(msub); +} + +CToP.applyTokens['rational'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mfrac = CToP.createElement('mfrac'); + CToP.applyTransform(mfrac,args[0],0); + CToP.applyTransform(mfrac,args[1],0); + parentNode.appendChild(mfrac); +} + +CToP.applyTokens['times'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var needsBrackets = precedence>3; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + for(var j=0;j<args.length; j++ ) { + if(j>0) { + CToP.appendToken(mrow,'mo',(args[j].localName=='cn') ? "\u00D7" :"\u2062"); + } + CToP.applyTransform(mrow,args[j],3); + } + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); +} + +CToP.applyTokens["plus"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var needsBrackets = precedence>2; + if(needsBrackets) { + CToP.appendToken(mrow,'mo','('); + } + for(var j=0;j<args.length; j++ ) { + var arg = args[j]; + var children = CToP.getChildren(arg); + if(j>0) { + var n; + if(CToP.settings.collapsePlusMinus) { + if(arg.localName=='cn' && !(children.length) && (n=Number(arg.textContent)) <0) { + CToP.appendToken(mrow,'mo','\u2212'); + CToP.appendToken(mrow,'mn', -n); + } else if(arg.localName=='apply' && children.length==2 && children[0].localName=='minus') { + CToP.appendToken(mrow,'mo','\u2212'); + CToP.applyTransform(mrow,children[1],2); + } else if(arg.localName=='apply' && children.length>2 && children[0].localName=='times' && children[1].localName=='cn' && ( n=Number(children[1].textContent) < 0)) { + CToP.appendToken(mrow,'mo','\u2212'); + children[1].textContent=-n;// fix me: modifying document + CToP.applyTransform(mrow,arg,2); + } else{ + CToP.appendToken(mrow,'mo','+'); + CToP.applyTransform(mrow,arg,2); + } + } else { + CToP.appendToken(mrow,'mo','+'); + CToP.applyTransform(mrow,arg,2); + } + } else { + CToP.applyTransform(mrow,arg,2); + } + } + if(needsBrackets) { + CToP.appendToken(mrow,'mo',')'); + } + parentNode.appendChild(mrow); +} + +CToP.applyTokens['transpose'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msup = CToP.createElement('msup'); + CToP.applyTransform(msup,args[0],precedence); + CToP.appendToken(msup,'mi','T'); + parentNode.appendChild(msup); +} + +CToP.applyTokens['power'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msup = CToP.createElement('msup'); + CToP.applyTransform(msup,args[0],3); + CToP.applyTransform(msup,args[1],precedence); + parentNode.appendChild(msup); +} + +CToP.applyTokens['selector'] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msub = CToP.createElement('msub'); + var mrow = args ? args[0]: CToP.createElement('mrow'); + CToP.applyTransform(msub,mrow,0); + var mrow2 = CToP.createElement('mrow'); + for(var i=1;i<args.length;i++){ + if(i!=1){ + CToP.appendToken(mrow2,'mo',','); + } + CToP.applyTransform(mrow2,args[i],0); + } + msub.appendChild(mrow2); + parentNode.appendChild(msub); +} + +CToP.applyTokens["log"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var mi = CToP.createElement('mi'); + mi.textContent = 'log'; + if(qualifiers.length && qualifiers[0].localName=='logbase'){ + var msub = CToP.createElement('msub'); + msub.appendChild(mi); + CToP.applyTransform(msub,CToP.getChildren(qualifiers[0])[0],0); + mrow.appendChild(msub); + } else { + mrow.appendChild(mi); + } + CToP.applyTransform(mrow,args[0],7); + parentNode.appendChild(mrow); +} + +CToP.applyTokens["int"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + var mo = CToP.createElement('mo'); + mo.textContent='\u222B'; + var msubsup = CToP.createElement('msubsup'); + msubsup.appendChild(mo); + var mrow1 = CToP.createElement('mrow'); + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='lowlimit'|| + qualifiers[i].localName=='condition'|| + qualifiers[i].localName=='domainofapplication') + { + var children = CToP.getChildren(qualifiers[i]); + for(var j=0;j<children.length;j++){ + CToP.applyTransform(mrow1,children[j],0); + } + } else { + var children = CToP.getChildren(qualifiers[i]); + if (qualifiers[i].localName=='interval' && children.length==2) { + CToP.applyTransform(mrow1,children[0],0); + } + } + } + msubsup.appendChild(mrow1); + var mrow2 = CToP.createElement('mrow'); + for(var i=0; i<qualifiers.length;i++){ + if(qualifiers[i].localName=='uplimit'){ + var children = CToP.getChildren(qualifiers[i]); + for(j=0;j<children.length;j++){ + CToP.applyTransform(mrow2,children[j],0); + } + break; + } else if(qualifiers[i].localName=='interval' ){ + var children = CToP.getChildren(qualifiers[i]); + CToP.applyTransform(mrow2,children[children.length-1],0); + break; + } + } + msubsup.appendChild(mrow2); + mrow.appendChild(msubsup); + for(var i=0; i<args.length;i++){ + CToP.applyTransform(mrow,args[i],0); + } + for(var i=0; i<bvars.length;i++){ + var bvar = bvars[i]; + var children = CToP.getChildren(bvar); + if(children.length){ + var mrow3 = CToP.createElement("mrow"); + CToP.appendToken(mrow3,'mi','d'); + CToP.applyTransform(mrow3,children[0],0); + mrow.appendChild(mrow3); + } + } + parentNode.appendChild(mrow); +} + +CToP.applyTokens["inverse"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var msup = CToP.createElement('msup'); + var arg = (args.length) ? args[0] : CToP.createElement('mrow'); + CToP.applyTransform(msup,arg,precedence); + var mfenced = CToP.createElement('mfenced'); + CToP.appendToken(mfenced,'mn','-1'); + msup.appendChild(mfenced); + parentNode.appendChild(msup); +} + +CToP.applyTokens["quotient"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.appendToken(mrow,'mo','\u230A'); + if(args.length) { + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(mrow,'mo','/'); + if(args.length>1){ + CToP.applyTransform(mrow,args[1],0); + } + } + CToP.appendToken(mrow,'mo','\u230B'); + parentNode.appendChild(mrow); +} + +CToP.applyTokens["factorial"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mrow = CToP.createElement('mrow'); + CToP.applyTransform(mrow,args[0],4); + CToP.appendToken(mrow,'mo','!'); + parentNode.appendChild(mrow); +} + +CToP.applyTokens["root"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var mr; + if(firstArg.localName=='root' && (qualifiers.length==0 || (qualifiers[0].localName=='degree' && qualifiers[0].textContent=='2'))){ + mr = CToP.createElement('msqrt'); + for(var i=0;i<args.length;i++){ + CToP.applyTransform(mr,args[i],0); + } + } else { + mr = CToP.createElement('mroot'); + CToP.applyTransform(mr,args[0],0); + var arg = (firstArg.localName=='root') ? qualifiers[0].childNodes[0] : args[1]; + CToP.applyTransform(mr,arg,0); + } + parentNode.appendChild(mr); +} + +CToP.applyTokens["diff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + if(bvars.length){ // d/dx form + var outNode; + var mfrac = CToP.createElement('mfrac'); + var toprow = CToP.createElement('mrow'); + var bottomrow = CToP.createElement('mrow'); + mfrac.appendChild(toprow); + mfrac.appendChild(bottomrow); + + var bvar; + var degreeNode; + + var d = CToP.createElement('mi'); + d.textContent = 'd'; + + var children = CToP.getChildren(bvars[0]); + for(var j=0;j<children.length;j++){ + if(children[j].localName=='degree'){ + var childNode = CToP.getChildren(children[j])[0]; + if(childNode.textContent!='1'){ + degreeNode = childNode; + var msup = CToP.createElement('msup'); + msup.appendChild(d); + d = msup; + CToP.applyTransform(d,degreeNode,0); + } + } else { + bvar = children[j]; + } + } + toprow.appendChild(d); + + if(args.length){ + switch(args[0].localName) { + case 'apply': + case 'bind': + case 'reln': + var mrow = CToP.createElement('mrow'); + mrow.appendChild(mfrac); + CToP.applyTransform(mrow,args[0],3); + outNode = mrow; + break; + default: + CToP.applyTransform(toprow,args[0],0); + outNode = mfrac; + } + } + + CToP.appendToken(bottomrow,'mi','d'); + + if(degreeNode){ + var msup2 = CToP.createElement('msup'); + CToP.applyTransform(msup2,bvar,0); + CToP.applyTransform(msup2,degreeNode,0); + bottomrow.appendChild(msup2); + } else { + CToP.applyTransform(bottomrow,bvar,0); + } + + + parentNode.appendChild(outNode); + } else { // f' form + var msup = CToP.createElement('msup'); + var mrow = CToP.createElement('mrow'); + msup.appendChild(mrow); + CToP.applyTransform(mrow,args[0],0); + CToP.appendToken(m,'mo','\u2032'); // tick + parentNode.appendChild(msup); + } +} + +CToP.applyTokens["partialdiff"] = function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) { + var m, mi, msup, mrow, mo, z; + + var mfrac = CToP.createElement('mfrac'); + var toprow = CToP.createElement('mrow'); + var bottomrow = CToP.createElement('mrow'); + mfrac.appendChild(toprow); + mfrac.appendChild(bottomrow); + + var degreeNode, differendNode; + + if(bvars.length==0 && args.length==2 && args[0].localName=='list'){ + if(args[1].localName=='lambda') { // `d^(n+m)/(dx^n dy^m) f` form, through a lambda + var degree = CToP.getChildren(args[0]).length; + if(degree!=1) { + msup = CToP.createElement('msup'); + CToP.appendToken(msup,'mo','\u2202'); // curly d + CToP.appendToken(msup,'mn',degree); + toprow.appendChild(msup); + } else { + CToP.appendToken(toprow,'mo','\u2202'); + } + + var children = CToP.getChildren(args[1]); + + differendNode = children[children.length - 1]; // thing being differentiated + + var bvarNames = []; + var lambdaChildren = CToP.getChildren(args[1]); // names of bound variables + var lambdaSequence = CToP.getChildren(args[0]); // indices of bound variable names, in order + for(var i=0;i<lambdaChildren.length;i++){ + if(lambdaChildren[i].localName=='bvar'){ + bvarNames.push(CToP.getChildren(lambdaChildren[i])[0]); + } + } + + var lastN = null, degree = 0; + function addDiff(n,degree) { + CToP.appendToken(bottomrow,'mo','\u2202'); + var bvar = bvarNames[n]; + if(degree>1) { + var msup = CToP.createElement('msup'); + CToP.applyTransform(msup,bvar,0); + CToP.appendToken(msup,'mn',degree); + bottomrow.appendChild(msup); + } else { + CToP.applyTransform(bottomrow,bvar,0); + } + } + for(var i=0;i<lambdaSequence.length;i++){ + var n = Number(lambdaSequence[i].textContent)-1; + if(lastN!==null && n!=lastN) { + addDiff(lastN,degree); + degree = 0; + } + lastN = n; + degree += 1; + } + if(lastN) { + addDiff(lastN,degree); + } + } else { // `D_i_j f` form + var mrow = CToP.createElement('mrow'); + var msub = CToP.createElement('msub'); + CToP.appendToken(msub,'mi','D'); + var bvar = CToP.getChildren(args[0]); + msub.appendChild(CToP.createmfenced(bvar,'','')); + mrow.appendChild(msub); + CToP.applyTransform(mrow,args[1],0); + parentNode.appendChild(mrow); + return; + } + } else { // `d^(n+m)/(dx^n dy^m) f` form, with bvars + var msup = CToP.createElement('msup'); + toprow.appendChild(msup); + CToP.appendToken(msup,'mo','\u2202'); + + var degreeRow = CToP.createElement('mrow'); + msup.appendChild(degreeRow); + + var qualifier; + + if(qualifiers.length && qualifiers[0].localName=='degree' && CToP.getChildren(qualifiers[0]).length){ + qualifier = CToP.getChildren(qualifiers[0])[0]; + CToP.applyTransform(degreeRow,qualifier,0); + } else { + var degree = 0; + var hadFirst = false; + for(var i=0;i<bvars.length;i++){ + var children = CToP.getChildren(bvars[i]); + if(children.length==2){ + for(j=0;j<2;j++){ + if(children[j].localName=='degree') { + if(/^\s*\d+\s*$/.test(children[j].textContent)){ + degree += Number(children[j].textContent); + } else { + if(hadFirst){ + CToP.appendToken(degreeRow,'mo','+'); + } + hadFirst = true; + CToP.applyTransform(degreeRow,CToP.getChildren(children[j])[0],0); + } + } + } + } else { + degree++; + } + } + if(degree>0){ + if(hadFirst){ + CToP.appendToken(degreeRow,'mo','+'); + } + CToP.appendToken(degreeRow,'mn',degree); + } + } + + if(args.length){ + differendNode = args[0]; + } + + for(var i=0;i<bvars.length;i++){ + CToP.appendToken(bottomrow,'mo','\u2202'); + var children = CToP.getChildren(bvars[i]); + + if(children.length==2){ + for(j=0;j<2;j++){ + if(children[j].localName=='degree'){ + var msup2 = CToP.createElement('msup'); + CToP.applyTransform(msup2,children[1-j],0); + var bvarDegreeNode = CToP.getChildren(children[j])[0]; + CToP.applyTransform(msup2,bvarDegreeNode,0); + bottomrow.appendChild(msup2); + } + } + } else if(children.length==1) { + CToP.applyTransform(bottomrow,children[0],0); + } + } + } + if(differendNode) { + switch(differendNode.localName) { + case 'apply': + case 'bind': + case 'reln': + var mrow = CToP.createElement('mrow'); + mrow.appendChild(mfrac); + CToP.applyTransform(mrow,differendNode,3); + outNode = mrow; + break; + default: + CToP.applyTransform(toprow,differendNode,0); + outNode = mfrac; + } + } else { + outNode = mfrac; + } + parentNode.appendChild(outNode); +} + +return CToP; +})(); MathJax.Hub.Register.StartupHook("MathML Jax Ready",function () {