Combine multiple elements into a single typesetting pass. Issue #873.

This commit is contained in:
Davide P. Cervone 2014-08-18 15:36:09 -04:00
parent 4666badbe2
commit e1cf022d8a

View File

@ -2011,14 +2011,11 @@ MathJax.Hub = {
Typeset: function (element,callback) { Typeset: function (element,callback) {
if (!MathJax.isReady) return null; if (!MathJax.isReady) return null;
var ec = this.elementCallback(element,callback); var ec = this.elementCallback(element,callback);
var queue = MathJax.Callback.Queue(); if (ec.count) {
for (var i = 0, m = ec.elements.length; i < m; i++) { var queue = MathJax.Callback.Queue(
if (ec.elements[i]) { ["PreProcess",this,ec.elements],
queue.Push( ["Process",this,ec.elements]
["PreProcess",this,ec.elements[i]], );
["Process",this,ec.elements[i]]
);
}
} }
return queue.Push(ec.callback); return queue.Push(ec.callback);
}, },
@ -2026,14 +2023,13 @@ MathJax.Hub = {
PreProcess: function (element,callback) { PreProcess: function (element,callback) {
var ec = this.elementCallback(element,callback); var ec = this.elementCallback(element,callback);
var queue = MathJax.Callback.Queue(); var queue = MathJax.Callback.Queue();
for (var i = 0, m = ec.elements.length; i < m; i++) { if (ec.count) {
if (ec.elements[i]) { var elements = (ec.count === 1 ? [ec.elements] : ec.elements);
queue.Push( queue.Push(["Post",this.signal,["Begin PreProcess",ec.elements]]);
["Post",this.signal,["Begin PreProcess",ec.elements[i]]], for (var i = 0, m = elements.length; i < m; i++) {
(arguments.callee.disabled? {} : ["Execute",this.preProcessors,ec.elements[i]]), if (elements[i]) {queue.Push(["Execute",this.preProcessors,elements[i]])}
["Post",this.signal,["End PreProcess",ec.elements[i]]]
);
} }
queue.Push(["Post",this.signal,["End PreProcess",ec.elements]]);
} }
return queue.Push(ec.callback); return queue.Push(ec.callback);
}, },
@ -2045,32 +2041,31 @@ MathJax.Hub = {
takeAction: function (action,element,callback) { takeAction: function (action,element,callback) {
var ec = this.elementCallback(element,callback); var ec = this.elementCallback(element,callback);
var elements = ec.elements;
var queue = MathJax.Callback.Queue(["Clear",this.signal]); var queue = MathJax.Callback.Queue(["Clear",this.signal]);
for (var i = 0, m = ec.elements.length; i < m; i++) { var state = {
if (ec.elements[i]) { scripts: [], // filled in by prepareScripts
var state = { start: new Date().getTime(), // timer for processing messages
scripts: [], // filled in by prepareScripts i: 0, j: 0, // current script, current jax
start: new Date().getTime(), // timer for processing messages jax: {}, // scripts grouped by output jax
i: 0, j: 0, // current script, current jax jaxIDs: [] // id's of jax used
jax: {}, // scripts grouped by output jax };
jaxIDs: [] // id's of jax used if (ec.count) {
}; queue.Push(
queue.Push( ["Post",this.signal,["Begin "+action,elements]],
["Post",this.signal,["Begin "+action,ec.elements[i]]], ["Post",this.signal,["Begin Math",elements,action]],
["Post",this.signal,["Begin Math",ec.elements[i],action]], ["prepareScripts",this,action,elements,state],
["prepareScripts",this,action,ec.elements[i],state], ["Post",this.signal,["Begin Math Input",elements,action]],
["Post",this.signal,["Begin Math Input",ec.elements[i],action]], ["processInput",this,state],
["processInput",this,state], ["Post",this.signal,["End Math Input",elements,action]],
["Post",this.signal,["End Math Input",ec.elements[i],action]], ["prepareOutput",this,state,"preProcess"],
["prepareOutput",this,state,"preProcess"], ["Post",this.signal,["Begin Math Output",elements,action]],
["Post",this.signal,["Begin Math Output",ec.elements[i],action]], ["processOutput",this,state],
["processOutput",this,state], ["Post",this.signal,["End Math Output",elements,action]],
["Post",this.signal,["End Math Output",ec.elements[i],action]], ["prepareOutput",this,state,"postProcess"],
["prepareOutput",this,state,"postProcess"], ["Post",this.signal,["End Math",elements,action]],
["Post",this.signal,["End Math",ec.elements[i],action]], ["Post",this.signal,["End "+action,elements]]
["Post",this.signal,["End "+action,ec.elements[i]]] );
);
}
} }
return queue.Push(ec.callback); return queue.Push(ec.callback);
}, },
@ -2357,6 +2352,7 @@ MathJax.Hub = {
if (callback == null && (element instanceof Array || typeof element === 'function')) if (callback == null && (element instanceof Array || typeof element === 'function'))
{try {MathJax.Callback(element); callback = element; element = null} catch(e) {}} {try {MathJax.Callback(element); callback = element; element = null} catch(e) {}}
if (element == null) {element = this.config.elements || []} if (element == null) {element = this.config.elements || []}
if (element instanceof HTMLCollection) {element = [].slice.apply(element)}
if (!(element instanceof Array)) {element = [element]} if (!(element instanceof Array)) {element = [element]}
element = [].concat(element); // make a copy so the original isn't changed element = [].concat(element); // make a copy so the original isn't changed
for (var i = 0, m = element.length; i < m; i++) for (var i = 0, m = element.length; i < m; i++)
@ -2364,11 +2360,15 @@ MathJax.Hub = {
if (!document.body) {document.body = document.getElementsByTagName("body")[0]} if (!document.body) {document.body = document.getElementsByTagName("body")[0]}
if (element.length == 0) {element.push(document.body)} if (element.length == 0) {element.push(document.body)}
if (!callback) {callback = {}} if (!callback) {callback = {}}
return {elements: element, callback: callback}; return {
count: element.length,
elements: (element.length === 1 ? element[0] : element),
callback: callback
};
}, },
elementScripts: function (element) { elementScripts: function (element) {
if (element instanceof Array) { if (element instanceof Array || element instanceof HTMLCollection) {
var scripts = []; var scripts = [];
for (var i = 0, m = element.length; i < m; i++) for (var i = 0, m = element.length; i < m; i++)
{scripts.push.apply(scripts,this.elementScripts(element[i]))} {scripts.push.apply(scripts,this.elementScripts(element[i]))}