123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743 |
- /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
- /* vim: set ts=2 et sw=2 tw=80: */
- /*************************************************************
- *
- * MathJax/extensions/MathML/content-mathml.js
- *
- * This file provides methods to convert Content-MathML to
- * Presentation MathML for processing by MathJax. The transform is
- * performed in a DOM filter for the MathML input jax, so that the
- * Show Math As menu will still show the Original MathML as Content MathML,
- * but the Presentation MathML can be obtained from the main MathML menu.
- *
- * To load it, include
- *
- * MathML: {
- * extensions: ["content-mathml.js"]
- * }
- *
- * in your configuration.
- *
- * A portion of this file is taken from ctop.js which is
- * Copyright (c) David Carlisle 2001, 2002, 2008, 2009, 2013,
- * and is used by permission of David Carlisle, who has agreed to allow us
- * to release it under the Apache2 license (see below). That portion is
- * indicated via comments.
- *
- * The remainder falls under the copyright that follows.
- * ---------------------------------------------------------------------
- *
- * Copyright (c) 2013-2017 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- MathJax.Extension["MathML/content-mathml"] = (function(HUB) {
- /*
- * Content MathML to Presentation MathML conversion
- *
- * based on David Carlisle's ctop.js - https://web-xslt.googlecode.com/svn/trunk/ctop/ctop.js
- *
- */
- var isMSIE = HUB.Browser.isMSIE;
- if (isMSIE) {
- try {document.namespaces.add("m","http://www.w3.org/1998/Math/MathML")} catch (err) {}
- }
- var CONFIG = HUB.CombineConfig("MathML.content-mathml",{
- // 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'
- }
- });
- var CToP = {
- version: "2.7.2",
- settings: CONFIG,
- /* Transform the given <math> elements from Content MathML to Presentation MathML and replace the original elements
- */
- transformElements: function(elements) {
- for (var i = 0, l = elements.length; i<l; 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) {
- if (element.nodeName.indexOf(":") >= 0) element = CToP.cloneNode(element,true); // removes namespaces
- var mathNode = CToP.cloneNode(element);
- for (var j = 0, l = element.childNodes.length; j<l; j++ ) {
- CToP.applyTransform(mathNode,element.childNodes[j],0);
- }
- return mathNode;
- },
- getTextContent: function(element) {
- return element.text !== undefined ? element.text : element.innerText !== undefined ? element.innerText : element.textContent;
- },
- setTextContent: function(element,textContent) {
- for (var i = 0, l = element.childNodes.length; i<l; i++) {
- if (element.childNodes[i].nodeType === 3) {
- element.removeChild(element.childNodes[i]);
- i--;
- l--;
- }
- }
- element.appendChild(document.createTextNode(textContent));
- },
- cloneNode: function(element,deep) {
- var clone, i, l;
- if (element.nodeType === 1) {
- clone = CToP.createElement(element.nodeName);
- for (i = 0, l = element.attributes.length; i<l; i++ ) {
- clone.setAttribute(element.attributes[i].nodeName,element.attributes[i].nodeValue);
- }
- if (deep) {
- for (i = 0, l = element.childNodes.length; i<l; i++ ) {
- var clonedChild = CToP.cloneNode(element.childNodes[i],true);
- clone.appendChild(clonedChild);
- }
- }
- } else if (element.nodeType === 3) {
- clone = document.createTextNode(element.nodeValue);
- }
- return clone;
- },
- /* Create an element with given name, belonging to the MathML namespace
- */
- createElement: function(name) {
- name = name.replace(/^.*:/,""); // remove namespace
- return (document.createElementNS ?
- document.createElementNS("http://www.w3.org/1998/Math/MathML",name) :
- document.createElement("m:"+name));
- },
- /* Get node's children
- */
- getChildren: function(node) {
- var children = [];
- for (var j = 0, l = node.childNodes.length; j<l; j++ ) {
- if (node.childNodes[j].nodeType === 1) {
- 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, l = contentMMLNode.childNodes.length; j<l; j++ ) {
- if (contentMMLNode.childNodes[j].nodeType === 1) {
- var childNode = contentMMLNode.childNodes[j], name = childNode.nodeName;
- 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);
- textContent = textContent.replace(/^\s+/,"").replace(/\s+$/,"");
- if (name === 'mn' && textContent.substr(0,1) === "-") {
- //
- // use <mrow><mo>−</mo><mn>n</mn></mrow> instead of <mn>-n</mn>
- //
- element.appendChild(document.createTextNode(textContent.substr(1)));
- var mrow = CToP.createElement('mrow');
- CToP.appendToken(mrow,'mo','\u2212');
- mrow.appendChild(element);
- element = mrow;
- } else {
- element.appendChild(document.createTextNode(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;
- }
- var nodeName = contentMMLNode.nodeName.replace(/.*:/,'');
- if (contentMMLNode.nodeType === 1) {
- if (CToP.tokens[nodeName]) {
- CToP.tokens[nodeName](parentNode,contentMMLNode,precedence);
- } else if (contentMMLNode.childNodes.length === 0) {
- var mml = CToP.MML[nodeName];
- if (mml && mml.isa && mml.isa(CToP.mbase)) {
- parentNode.appendChild(CToP.cloneNode(contentMMLNode));
- } else {
- CToP.appendToken(parentNode,'mi',nodeName);
- }
- } else {
- var clonedChild = CToP.cloneNode(contentMMLNode);
- parentNode.appendChild(clonedChild);
- for (var j = 0, l = contentMMLNode.childNodes.length; j<l; j++ ) {
- CToP.applyTransform(clonedChild,contentMMLNode.childNodes[j],precedence);
- }
- }
- } else if (contentMMLNode.nodeType === 3) {
- parentNode.appendChild(CToP.cloneNode(contentMMLNode));
- }
- },
- /* 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, l = children.length; j<l; 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 === 3) {
- CToP.appendToken(parentNode,name,CToP.getTextContent(contentMMLNode));
- } else {
- var mrow = CToP.createElement('mrow');
- for (var j = 0, l = contentMMLNode.childNodes.length; j<l; j++ ) {
- if (contentMMLNode.childNodes[j].nodeType === 3) {
- CToP.appendToken(parentNode,name,CToP.getTextContent(contentMMLNode.childNodes[j]));
- }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, l = args.length; j<l; 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');
- CToP.setTextContent(mo,name);
- var munderover = CToP.createElement('munderover');
- munderover.appendChild(mo);
- var mrow1 = CToP.createElement('mrow');
- var i, j, num_qualifiers, num_bvars, children, bvar, num_children, num_args;
- for (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName === 'lowlimit'||
- qualifiers[i].nodeName === 'condition'||
- qualifiers[i].nodeName === 'domainofapplication')
- {
- if (qualifiers[i].nodeName === 'lowlimit') {
- for (j = 0, num_bvars = bvars.length; j<num_bvars; j++ ) {
- bvar = bvars[j];
- children = CToP.getChildren(bvar);
- if (children.length) {
- CToP.applyTransform(mrow1,children[0],0);
- }
- }
- if (bvars.length) {
- CToP.appendToken(mrow1,"mo",limitSymbol);
- }
- }
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0;j<children.length;j++) {
- CToP.applyTransform(mrow1,children[j],0);
- }
- } else {
- children = CToP.getChildren(qualifiers[i]);
- if (qualifiers[i].nodeName === 'interval' && children.length === 2) {
- for (j = 0, num_bvars = bvars.length; j<num_bvars; j++ ) {
- bvar = bvars[j];
- 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 (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName === 'uplimit' ||qualifiers[i].nodeName === 'interval' )
- {
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(mjrow,children[j],0);
- }
- }
- }
- munderover.appendChild(mjrow);
- mrow.appendChild(munderover);
- for (i = 0, num_args = args.length; i<num_args; 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');
- var children, i, j, l, num_qualifiers, num_children;
- if (name) {
- CToP.appendToken(mrow,'mo',name);
- }
- for (j = 0, l = bvars.length; j<l; j++ ) {
- var bvar = bvars[j];
- if (j>0) {
- CToP.appendToken(mrow,'mo',',');
- }
- children = CToP.getChildren(bvar);
- if (children.length) {
- CToP.applyTransform(mrow,children[0],0);
- }
- }
- var conditions_mrow = CToP.createElement('mrow');
- var conditions = false;
- for (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName === 'condition') {
- conditions = true;
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(conditions_mrow,children[j],0);
- }
- }
- }
- if (conditions) {
- CToP.appendToken(mrow,'mo',conditionSeparator);
- }
- mrow.appendChild(conditions_mrow);
- for (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName != 'condition') {
- CToP.appendToken(mrow,'mo','\u2208');
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(mrow,children[j],0);
- }
- }
- }
- if (args.length && (bvars.length||children.length)) {
- CToP.appendToken(mrow,'mo',argSeparator);
- }
- for (i = 0, l = args.length; i<l; 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, l = args.length; i<l; i++ ) {
- if (i>0) {
- CToP.appendToken(mrow2,'mo',',');
- }
- CToP.applyTransform(mrow2,args[i],0);
- }
- if (qualifiers.length) {
- CToP.appendToken(mrow2,'mo','|');
- for (i = 0, l = qualifiers.length; i<l; 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 === 3) {
- var mi = CToP.appendToken(parentNode,'mi',CToP.getTextContent(contentMMLNode));
- 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('(',')'),
- 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));
- },
- apply: 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.nodeName;
- name = (name === "csymbol") ? CToP.getTextContent(firstArg).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'));
- }
- },
- 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'+CToP.getTextContent(contentMMLNode));
- 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, l = contentMMLNode.childNodes.length; j<l; j++ ) {
- if (contentMMLNode.childNodes[j].nodeType === 3) {
- CToP.appendToken(mrow,'cn',CToP.getTextContent(contentMMLNode.childNodes[j]));
- }else if (contentMMLNode.childNodes[j].nodeName === 'sep') {
- apply.appendChild(mrow);
- mrow = CToP.createElement('mrow');
- } else {
- mrow.appendChild(CToP.cloneNode(contentMMLNode.childNodes[j],true));
- }
- }
- apply.appendChild(mrow);
- CToP.applyTransform(parentNode,apply,0);
- }
- } else {
- CToP.transforms.token('mn')(parentNode,contentMMLNode);
- }
- },
- 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, l = children.length; i<l; 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);
- },
- 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, l = children.length; i<l; i++ ) {
- CToP.applyTransform(mtable,children[i],0);
- }
- parentNode.appendChild(mrow);
- },
- piece: function(parentNode,contentMMLNode,precedence) {
- var mtr = CToP.createElement('mtr');
- var children = CToP.getChildren(contentMMLNode);
- for (var i = 0, l = children.length; i<l; i++ ) {
- var mtd = CToP.createElement('mtd');
- mtr.appendChild(mtd);
- CToP.applyTransform(mtd,children[i],0);
- if (i === 0) {
- mtd = CToP.createElement('mtd');
- CToP.appendToken(mtd,"mtext","\u00A0if\u00A0");
- mtr.appendChild(mtd);
- }
- }
- parentNode.appendChild(mtr);
- },
- 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);
- mtd = CToP.createElement('mtd');
- mtd.setAttribute('columnspan','2');
- CToP.appendToken(mtd,"mtext","\u00A0otherwise");
- mtr.appendChild(mtd);
- }
- parentNode.appendChild(mtr);
- },
- 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, l = bvars.length; i<l; i++ ) {
- if (i != 0) {
- CToP.appendToken(mrow2,'mo',',');
- }
- CToP.applyTransform(mrow2,bvars[i].childNodes[0],0);
- }
- msub.appendChild(mrow2);
- mrow.appendChild(msub);
- var msub2 = CToP.cloneNode(msub,true);
- CToP.appendToken(mrow,'mo','|');
- mrow.appendChild(msub2);
- CToP.appendToken(mrow,'mo','=');
- for (i = 0, l = args.length; i<l; i++ ) {
- if (i != 0) {
- CToP.appendToken(mrow,'mo',',');
- }
- CToP.applyTransform(mrow,args[i],0);
- }
- CToP.appendToken(mrow,'mo',';');
- for (i = 0, l = qualifiers.length; i<l; 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 (i = 0, l = args.length; i<l; i++ ) {
- CToP.applyTransform(mtable,args[i],0);
- }
- mfenced.appendChild(mtable);
- parentNode.appendChild(mfenced);
- }
- },
- matrixrow: function(parentNode,contentMMLNode,precedence) {
- var mtr = CToP.createElement('mtr');
- var children = CToP.getChildren(contentMMLNode);
- for (var i = 0, l = children.length; i<l; i++ ) {
- var mtd = CToP.createElement('mtd');
- CToP.applyTransform(mtd,children[i],0);
- mtr.appendChild(mtd);
- }
- parentNode.appendChild(mtr);
- },
- condition: function(parentNode,contentMMLNode,precedence) {
- var mrow = CToP.createElement('mrow');
- var children = CToP.getChildren(contentMMLNode);
- for (var i = 0, l = children.length; i<l; i++ ) {
- CToP.applyTransform(mrow,children[i],0);
- }
- parentNode.appendChild(mrow);
- },
- 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;
- var i, l, num_qualifiers;
-
- if (bvars.length) {
- CToP.applyTokens.lambda(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence);
- } else {
- var mrow = CToP.createElement('mrow');
- for (i = 0, l = args.length; i<l; 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 (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- children = CToP.getChildren(qualifiers[i]);
- for (var j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(mrow2,children[j],0);
- }
- }
- msub.appendChild(mrow2);
- mrow.appendChild(msub);
- }
- parentNode.appendChild(mrow);
- }
- },
- ident: function(parentNode,contentMMLNode,precedence) {
- CToP.appendToken(parentNode,"mi","id")
- },
- domainofapplication: function(parentNode,contentMMLNode,precedence) {
- var merror = CToP.createElement('merror');
- CToP.appendToken(merror,'mtext','unexpected domainofapplication');
- parentNode.appendChild(merror);
- },
- share: function(parentNode,contentMMLNode,precedence) {
- var mi = CToP.createElement('mi');
- mi.setAttribute('href',contentMMLNode.getAttribute('href'));
- CToP.setTextContent(mi,"Share " + contentMMLNode.getAttribute('href'));
- parentNode.appendChild(mi);
- },
- cerror: function(parentNode,contentMMLNode,precedence) {
- var merror = CToP.createElement('merror');
- var children = CToP.getChildren(contentMMLNode);
- for (var i = 0, l = children.length; i<l; i++ ) {
- CToP.applyTransform(merror,children[i],0);
- }
- parentNode.appendChild(merror);
- },
- 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, l = children.length; i<l; i++ ) {
- if (children[i].nodeName === 'annotation-xml' && children[i].getAttribute('encoding') === 'MathML-Presentation') {
- z = children[i];
- break;
- }
- }
- CToP.applyTransform(mrow,z,0);
- }
- parentNode.appendChild(mrow);
- },
- "annotation-xml": function(parentNode,contentMMLNode,precedence) {
- var mrow = CToP.createElement('mrow');
- var children = CToP.getChildren(contentMMLNode);
- for (var i = 0, l = children.length; i<l; i++ ) {
- CToP.applyTransform(mrow,children[i],0);
- }
- parentNode.appendChild(mrow);
- }
- };
- CToP.tokens.reln = CToP.tokens.bind = CToP.tokens.apply;
- CToP.contentDictionaries = {
- "setname1": function(parentNode,contentMMLNode,precedence) {
- var sets = {
- C: '\u2102',
- N: '\u2115',
- P: '\u2119',
- Q: '\u211A',
- R: '\u211D',
- Z: '\u2124'
- }
- var name = CToP.getTextContent(contentMMLNode);
- CToP.appendToken(parentNode,'mi',sets[name]);
- },
- aritherror: function(parentNode,contentMMLNode,precedence) {
- var name = CToP.getTextContent(contentMMLNode);
- 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('(',')'),
- 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);
- },
- 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);
- }
- },
- 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, l = args.length; j<l; j++ ) {
- var argBrackets = false;
- if (j>0) {
- CToP.appendToken(mrow,'mo','\u2229');
- if (args[j].nodeName === 'apply') {
- var child = CToP.getChildren(args[j])[0];
- argBrackets = child.nodeName === '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);
- }
- },
- 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);
- },
- 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);
- },
- 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);
- },
- 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);
- }
- },
- 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);
- }
- },
- 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);
- }
- },
- card: 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);
- },
- 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'));
- }
- },
- moment: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var degree, momentabout, children, i, j, l;
- for (i = 0, l = qualifiers.length; i<l; i++ ) {
- if (qualifiers[i].nodeName === 'degree') {
- degree = qualifiers[i];
- } else if (qualifiers[i].nodeName === '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);
- children = CToP.getChildren(degree);
- for (j = 0, l = children.length; j<l; 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);
- children = CToP.getChildren(momentabout);
- for (j = 0, l = children.length; j<l; j++ ) {
- CToP.applyTransform(msub,children[j],0);
- }
- parentNode.appendChild(msub);
- } else {
- parentNode.appendChild(mrow);
- }
- },
- 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);
- },
- 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);
- },
- 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);
- },
- 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].nodeName === 'apply';
- if (needsBrackets) {
- mrow.appendChild(CToP.createmfenced(args,'(', ')'));
- }
- else {
- CToP.applyTransform(mrow,args[0],precedence);
- }
- parentNode.appendChild(mrow);
- },
- 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].nodeName === 'apply';
- if (needsBrackets) {
- mrow.appendChild(CToP.createmfenced(args,'(', ')'));
- }
- else {
- CToP.applyTransform(mrow,args[0],precedence);
- }
- parentNode.appendChild(mrow);
- },
- not: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var mrow = CToP.createElement('mrow');
- CToP.appendToken(mrow,'mo','\u00ac');
- var needsBrackets = args[0].nodeName === 'apply' || args[0].nodeName === 'bind';
- if (needsBrackets) {
- CToP.appendToken(mrow,'mo','(');
- }
- CToP.applyTransform(mrow,args[0],precedence);
- if (needsBrackets) {
- CToP.appendToken(mrow,'mo',')');
- }
- parentNode.appendChild(mrow)
- },
- 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);
- },
- tendsto: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var type;
- if (firstArg.nodeName === 'tendsto') {
- type = firstArg.getAttribute('type');
- } else {
- type = CToP.getTextContent(args[0]);
- 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);
- },
- 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].nodeName === 'apply') {
- var argOp = CToP.getChildren(args[1])[0];
- bracketArg = argOp.nodeName === 'plus' || argOp.nodeName === '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);
- },
- "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);
- },
- "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);
- },
- integer: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- CToP.applyTransform(parentNode,args[0],0);
- },
- "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);
- },
- 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);
- },
- 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, l = args.length; j<l; j++ ) {
- if (j>0) {
- CToP.appendToken(mrow,'mo',(args[j].nodeName === 'cn') ? "\u00D7" :"\u2062");
- }
- CToP.applyTransform(mrow,args[j],3);
- }
- if (needsBrackets) {
- CToP.appendToken(mrow,'mo',')');
- }
- parentNode.appendChild(mrow);
- },
- 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, l = args.length; j<l; j++ ) {
- var arg = args[j];
- var children = CToP.getChildren(arg);
- if (j>0) {
- var n;
- if (CToP.settings.collapsePlusMinus) {
- if (arg.nodeName === 'cn' && !(children.length) && (n = Number(CToP.getTextContent(arg))) <0) {
- CToP.appendToken(mrow,'mo','\u2212');
- CToP.appendToken(mrow,'mn', -n);
- } else if (arg.nodeName === 'apply' && children.length === 2 && children[0].nodeName === 'minus') {
- CToP.appendToken(mrow,'mo','\u2212');
- CToP.applyTransform(mrow,children[1],2);
- } else if (arg.nodeName === 'apply' && children.length>2 && children[0].nodeName === 'times' && children[1].nodeName === 'cn' && (n = Number(CToP.getTextContent(children[1]))) < 0) {
- CToP.appendToken(mrow,'mo','\u2212');
- children[1].textContent = -n; // OK to change MathML since it is being discarded afterward
- 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);
- },
- 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);
- },
- 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);
- },
- 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, l = args.length; i<l; i++ ) {
- if (i != 1) {
- CToP.appendToken(mrow2,'mo',',');
- }
- CToP.applyTransform(mrow2,args[i],0);
- }
- msub.appendChild(mrow2);
- parentNode.appendChild(msub);
- },
- log: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var mrow = CToP.createElement('mrow');
- var mi = CToP.createElement('mi');
- CToP.setTextContent(mi,'log');
- if (qualifiers.length && qualifiers[0].nodeName === '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);
- },
- "int": function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var mrow = CToP.createElement('mrow');
- var mo = CToP.createElement('mo');
- CToP.setTextContent(mo,'\u222B');
- var msubsup = CToP.createElement('msubsup');
- msubsup.appendChild(mo);
- var mrow1 = CToP.createElement('mrow');
- var children, i, j, l, num_qualifiers, num_children;
- for (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName === 'lowlimit'||
- qualifiers[i].nodeName === 'condition'||
- qualifiers[i].nodeName === 'domainofapplication')
- {
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(mrow1,children[j],0);
- }
- } else {
- children = CToP.getChildren(qualifiers[i]);
- if (qualifiers[i].nodeName === 'interval' && children.length === 2) {
- CToP.applyTransform(mrow1,children[0],0);
- }
- }
- }
- msubsup.appendChild(mrow1);
- var mrow2 = CToP.createElement('mrow');
- for (i = 0, num_qualifiers = qualifiers.length; i<num_qualifiers; i++ ) {
- if (qualifiers[i].nodeName === 'uplimit') {
- children = CToP.getChildren(qualifiers[i]);
- for (j = 0, num_children = children.length; j<num_children; j++ ) {
- CToP.applyTransform(mrow2,children[j],0);
- }
- break;
- } else if (qualifiers[i].nodeName === 'interval' ) {
- children = CToP.getChildren(qualifiers[i]);
- CToP.applyTransform(mrow2,children[children.length-1],0);
- break;
- }
- }
- msubsup.appendChild(mrow2);
- mrow.appendChild(msubsup);
- for (i = 0, l = args.length; i<l; i++ ) {
- CToP.applyTransform(mrow,args[i],0);
- }
- for (i = 0, l = bvars.length; i<l; i++ ) {
- var bvar = bvars[i];
- 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);
- },
- 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);
- },
- 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);
- },
- 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);
- },
- root: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var mr;
- if (firstArg.nodeName === 'root' && (qualifiers.length === 0 || (qualifiers[0].nodeName === 'degree' && CToP.getTextContent(qualifiers[0]) === '2'))) {
- mr = CToP.createElement('msqrt');
- for (var i = 0, l = args.length; i<l; i++ ) {
- CToP.applyTransform(mr,args[i],0);
- }
- } else {
- mr = CToP.createElement('mroot');
- CToP.applyTransform(mr,args[0],0);
- var arg = (firstArg.nodeName === 'root') ? qualifiers[0].childNodes[0] : args[1];
- CToP.applyTransform(mr,arg,0);
- }
- parentNode.appendChild(mr);
- },
- 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, degreeNode, msup, mrow;
- var d = CToP.createElement('mi');
- CToP.setTextContent(d,'d');
- var children = CToP.getChildren(bvars[0]);
- for (var j = 0, l = children.length; j<l; j++ ) {
- if (children[j].nodeName === 'degree') {
- var childNode = CToP.getChildren(children[j])[0];
- if (CToP.getTextContent(childNode) != '1') {
- degreeNode = childNode;
- 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].nodeName) {
- case 'apply':
- case 'bind':
- case 'reln':
- 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
- msup = CToP.createElement('msup');
- mrow = CToP.createElement('mrow');
- msup.appendChild(mrow);
- CToP.applyTransform(mrow,args[0],0);
- CToP.appendToken(msup,'mo','\u2032'); // tick
- parentNode.appendChild(msup);
- }
- },
- partialdiff: function(parentNode,contentMMLNode,firstArg,args,bvars,qualifiers,precedence) {
- var msup, msub, mrow;
- var mfrac = CToP.createElement('mfrac');
- var toprow = CToP.createElement('mrow');
- var bottomrow = CToP.createElement('mrow');
- mfrac.appendChild(toprow);
- mfrac.appendChild(bottomrow);
- var differendNode, degree, children;
- if (bvars.length === 0 && args.length === 2 && args[0].nodeName === 'list') {
- if (args[1].nodeName === 'lambda') { // `d^(n+m)/(dx^n dy^m) f` form, through a lambda
- 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');
- }
- 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, l = lambdaChildren.length; i<l; i++ ) {
- if (lambdaChildren[i].nodeName === '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 (i = 0, l = lambdaSequence.length; i<l; i++ ) {
- var n = Number(CToP.getTextContent(lambdaSequence[i]))-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
- mrow = CToP.createElement('mrow');
- 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
- 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].nodeName === 'degree' && CToP.getChildren(qualifiers[0]).length) {
- qualifier = CToP.getChildren(qualifiers[0])[0];
- CToP.applyTransform(degreeRow,qualifier,0);
- } else {
- degree = 0;
- var hadFirst = false;
- for (i = 0, l = bvars.length; i<l; i++ ) {
- children = CToP.getChildren(bvars[i]);
- if (children.length === 2) {
- for (var j = 0;j<2;j++) {
- if (children[j].nodeName === 'degree') {
- if (/^\s*\d+\s*$/.test(CToP.getTextContent(children[j]))) {
- degree += Number(CToP.getTextContent(children[j]));
- } 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 (i = 0, l = bvars.length; i<l; i++ ) {
- CToP.appendToken(bottomrow,'mo','\u2202');
- children = CToP.getChildren(bvars[i]);
- if (children.length === 2) {
- for (j = 0;j<2;j++) {
- if (children[j].nodeName === '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.nodeName) {
- case 'apply':
- case 'bind':
- case 'reln':
- 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);
- }
- };
- CToP.applyTokens.size = CToP.applyTokens.card;
- return CToP;
- })(MathJax.Hub);
- MathJax.Hub.Register.StartupHook("MathML Jax Ready",function () {
- var MATHML = MathJax.InputJax.MathML;
- var CToP = MathJax.Extension["MathML/content-mathml"];
- CToP.mbase = MathJax.ElementJax.mml.mbase;
- CToP.MML = MathJax.ElementJax.mml;
- MATHML.DOMfilterHooks.Add(function (data) {
- data.math = CToP.transformElement(data.math);
- });
- MathJax.Hub.Startup.signal.Post("MathML/content-mathml Ready");
- });
- MathJax.Ajax.loadComplete("[MathJax]/extensions/MathML/content-mathml.js");
|