Skip to content

Commit d9ebbae

Browse files
committed
Add MathJax.Object.isArray, and change most 'instanceof Array' to use it (unless the arrays are only going to generated by MathJax internals). Resolves issue #1584.
1 parent d536272 commit d9ebbae

File tree

13 files changed

+78
-64
lines changed

13 files changed

+78
-64
lines changed

unpacked/MathJax.js

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
154154

155155
})
156156
});
157+
158+
BASE.Object.isArray = function (obj) {
159+
return Object.prototype.toString.call(obj) === "[object Array]";
160+
};
161+
162+
BASE.Object.Array = Array;
157163

158164
})("MathJax");
159165

@@ -211,6 +217,7 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
211217
(function (BASENAME) {
212218
var BASE = window[BASENAME];
213219
if (!BASE) {BASE = window[BASENAME] = {}}
220+
var isArray = BASE.Object.isArray;
214221
//
215222
// Create a callback from an associative array
216223
//
@@ -279,8 +286,8 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
279286
}
280287
}
281288
TESTEVAL = null;
282-
}
283-
289+
};
290+
284291
//
285292
// Create a callback from various types of data
286293
//
@@ -291,11 +298,11 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
291298
{args = [].slice.call(args,i)}
292299
else {args = [].slice.call(arguments,0)}
293300
}
294-
if (args instanceof Array && args.length === 1) {args = args[0]}
301+
if (isArray(args) && args.length === 1) {args = args[0]}
295302
if (typeof args === 'function') {
296303
if (args.execute === CALLBACK.prototype.execute) {return args}
297304
return CALLBACK({hook: args});
298-
} else if (args instanceof Array) {
305+
} else if (isArray(args)) {
299306
if (typeof(args[0]) === 'string' && args[1] instanceof Object &&
300307
typeof args[1][args[0]] === 'function') {
301308
return CALLBACK({hook: args[1][args[0]], object: args[1], data: args.slice(2)});
@@ -343,7 +350,7 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
343350
}
344351
};
345352
var WAITSIGNAL = function (callback,signals) {
346-
if (!(signals instanceof Array)) {signals = [signals]}
353+
if (!isArray(signals)) {signals = [signals]}
347354
if (!callback.signal) {
348355
callback.oldExecute = callback.execute;
349356
callback.execute = WAITEXECUTE;
@@ -442,8 +449,8 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
442449
//
443450
var EXECUTEHOOKS = function (hooks,data,reset) {
444451
if (!hooks) {return null}
445-
if (!(hooks instanceof Array)) {hooks = [hooks]}
446-
if (!(data instanceof Array)) {data = (data == null ? [] : [data])}
452+
if (!isArray(hooks)) {hooks = [hooks]}
453+
if (!isArray(data)) {data = (data == null ? [] : [data])}
447454
var handler = HOOKS(reset);
448455
for (var i = 0, m = hooks.length; i < m; i++) {handler.Add(hooks[i])}
449456
return handler.Execute.apply(handler,data);
@@ -592,7 +599,7 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
592599
// Execute the message hooks for the given message
593600
//
594601
ExecuteHooks: function (msg) {
595-
var type = ((msg instanceof Array) ? msg[0] : msg);
602+
var type = (isArray(msg) ? msg[0] : msg);
596603
if (!this.hooks[type]) {return null}
597604
return this.hooks[type].Execute(msg);
598605
},
@@ -1003,7 +1010,7 @@ MathJax.cdnFileVersions = {}; // can be used to specify revisions for individua
10031010
for (id in styles) {if (styles.hasOwnProperty(id)) {
10041011
if (typeof styles[id] === 'string') {
10051012
string += id + " {"+styles[id]+"}\n";
1006-
} else if (styles[id] instanceof Array) {
1013+
} else if (BASE.Object.isArray(styles[id])) {
10071014
for (var i = 0; i < styles[id].length; i++) {
10081015
style = {}; style[id] = styles[id][i];
10091016
string += this.StyleString(style);
@@ -1055,9 +1062,9 @@ MathJax.HTML = {
10551062
}
10561063
}
10571064
if (contents) {
1058-
if (!(contents instanceof Array)) {contents = [contents]}
1065+
if (!MathJax.Object.isArray(contents)) {contents = [contents]}
10591066
for (var i = 0, m = contents.length; i < m; i++) {
1060-
if (contents[i] instanceof Array) {
1067+
if (MathJax.Object.isArray(contents[i])) {
10611068
obj.appendChild(this.Element(contents[i][0],contents[i][1],contents[i][2]));
10621069
} else if (type === "script") { // IE throws an error if script is added as a text node
10631070
this.setScript(obj, contents[i]);
@@ -1220,7 +1227,7 @@ MathJax.Localization = {
12201227
}),
12211228

12221229
_: function (id,phrase) {
1223-
if (phrase instanceof Array) {return this.processSnippet(id,phrase)}
1230+
if (MathJax.Object.isArray(phrase)) {return this.processSnippet(id,phrase)}
12241231
return this.processString(this.lookupPhrase(id,phrase),[].slice.call(arguments,2));
12251232
},
12261233

@@ -1230,9 +1237,9 @@ MathJax.Localization = {
12301237
// If the argument is a snippet (and we are processing snippets) do so,
12311238
// Otherwise, if it is a number, convert it for the lacale
12321239
//
1233-
var i, m;
1240+
var i, m, isArray = MathJax.Object.isArray;
12341241
for (i = 0, m = args.length; i < m; i++) {
1235-
if (domain && args[i] instanceof Array) {args[i] = this.processSnippet(domain,args[i])}
1242+
if (domain && isArray(args[i])) {args[i] = this.processSnippet(domain,args[i])}
12361243
}
12371244
//
12381245
// Split string at escapes and process them individually
@@ -1282,7 +1289,7 @@ MathJax.Localization = {
12821289
for (i = 0; i < m; i++) {
12831290
part += parts[i]; i++; // add the string and move on to substitution result
12841291
if (i < m) {
1285-
if (parts[i] instanceof Array) { // substitution was a snippet
1292+
if (isArray(parts[i])) { // substitution was a snippet
12861293
snippet.push(part); // add the accumulated string
12871294
snippet = snippet.concat(parts[i]); // concatenate the substution snippet
12881295
part = ""; // start accumulating a new string
@@ -1302,18 +1309,18 @@ MathJax.Localization = {
13021309
// strings or snippets to translate
13031310
//
13041311
for (var i = 0, m = snippet.length; i < m; i++) {
1305-
if (snippet[i] instanceof Array) {
1312+
if (MathJax.Object.isArray(snippet[i])) {
13061313
//
13071314
// This could be a sub-snippet:
13081315
// ["tag"] or ["tag",{properties}] or ["tag",{properties},snippet]
13091316
// Or it could be something to translate:
13101317
// [id,string,args] or [domain,snippet]
13111318
var data = snippet[i];
13121319
if (typeof data[1] === "string") { // [id,string,args]
1313-
var id = data[0]; if (!(id instanceof Array)) {id = [domain,id]}
1320+
var id = data[0]; if (!MathJax.Object.isArray(id)) {id = [domain,id]}
13141321
var phrase = this.lookupPhrase(id,data[1]);
13151322
result = result.concat(this.processMarkdown(phrase,data.slice(2),domain));
1316-
} else if (data[1] instanceof Array) { // [domain,snippet]
1323+
} else if (MathJax.Object.isArray(data[1])) { // [domain,snippet]
13171324
result = result.concat(this.processSnippet.apply(this,data));
13181325
} else if (data.length >= 3) { // ["tag",{properties},snippet]
13191326
result.push([data[0],data[1],this.processSnippet(domain,data[2])]);
@@ -1349,7 +1356,7 @@ MathJax.Localization = {
13491356
// Select the tag to use by number of stars (three stars requires two tags)
13501357
//
13511358
data = this.processString(parts[i+2],args,domain);
1352-
if (!(data instanceof Array)) {data = [data]}
1359+
if (!MathJax.Object.isArray(data)) {data = [data]}
13531360
data = [["b","i","i"][parts[i+1].length-1],{},data]; // number of stars determines type
13541361
if (parts[i+1].length === 3) {data = ["b",{},data]} // bold-italic
13551362
} else if (parts[i+3]) { // backtics (for code)
@@ -1358,14 +1365,14 @@ MathJax.Localization = {
13581365
// Make a <code> tag
13591366
//
13601367
data = this.processString(parts[i+4].replace(/^\s/,"").replace(/\s$/,""),args,domain);
1361-
if (!(data instanceof Array)) {data = [data]}
1368+
if (!MathJax.Object.isArray(data)) {data = [data]}
13621369
data = ["code",{},data];
13631370
} else if (parts[i+5]) { // hyperlink
13641371
//
13651372
// Process the link text, and make an <a> tag with the URL
13661373
//
13671374
data = this.processString(parts[i+5],args,domain);
1368-
if (!(data instanceof Array)) {data = [data]}
1375+
if (!MathJax.Object.isArray(data)) {data = [data]}
13691376
data = ["a",{href:this.processString(parts[i+6],args),target:"_blank"},data];
13701377
} else {
13711378
//
@@ -1400,7 +1407,7 @@ MathJax.Localization = {
14001407
// Then concatenate the snippet to the current one
14011408
//
14021409
string = this.processString(string,args,domain);
1403-
if (!(string instanceof Array)) {string = [string]}
1410+
if (!MathJax.Object.isArray(string)) {string = [string]}
14041411
result = result.concat(string);
14051412
}
14061413
return result;
@@ -1411,7 +1418,7 @@ MathJax.Localization = {
14111418
// Get the domain and messageID
14121419
//
14131420
if (!domain) {domain = "_"}
1414-
if (id instanceof Array) {domain = (id[0] || "_"); id = (id[1] || "")}
1421+
if (MathJax.Object.isArray(id)) {domain = (id[0] || "_"); id = (id[1] || "")}
14151422
//
14161423
// Check if the data is available and if not,
14171424
// load it and throw a restart error so the calling
@@ -1725,8 +1732,8 @@ MathJax.Message = {
17251732
// Translate message if it is [id,message,arguments]
17261733
//
17271734
var id = "";
1728-
if (text instanceof Array) {
1729-
id = text[0]; if (id instanceof Array) {id = id[1]}
1735+
if (MathJax.Object.isArray(text)) {
1736+
id = text[0]; if (MathJax.Object.isArray(id)) {id = id[1]}
17301737
//
17311738
// Localization._() will throw a restart error if a localization file
17321739
// needs to be loaded, so trap that and redo the Set() call
@@ -2411,11 +2418,11 @@ MathJax.Hub = {
24112418
},
24122419

24132420
elementCallback: function (element,callback) {
2414-
if (callback == null && (element instanceof Array || typeof element === 'function'))
2421+
if (callback == null && (MathJax.Object.isArray(element) || typeof element === 'function'))
24152422
{try {MathJax.Callback(element); callback = element; element = null} catch(e) {}}
24162423
if (element == null) {element = this.config.elements || []}
24172424
if (this.isHTMLCollection(element)) {element = this.HTMLCollection2Array(element)}
2418-
if (!(element instanceof Array)) {element = [element]}
2425+
if (!MathJax.Object.isArray(element)) {element = [element]}
24192426
element = [].concat(element); // make a copy so the original isn't changed
24202427
for (var i = 0, m = element.length; i < m; i++)
24212428
{if (typeof(element[i]) === 'string') {element[i] = document.getElementById(element[i])}}
@@ -2431,7 +2438,7 @@ MathJax.Hub = {
24312438

24322439
elementScripts: function (element) {
24332440
var scripts = [];
2434-
if (element instanceof Array || this.isHTMLCollection(element)) {
2441+
if (MathJax.Object.isArray(element) || this.isHTMLCollection(element)) {
24352442
for (var i = 0, m = element.length; i < m; i++) {
24362443
var alreadyDone = 0;
24372444
for (var j = 0; j < i && !alreadyDone; j++)
@@ -2468,7 +2475,7 @@ MathJax.Hub = {
24682475
Insert: function (dst,src) {
24692476
for (var id in src) {if (src.hasOwnProperty(id)) {
24702477
// allow for concatenation of arrays?
2471-
if (typeof src[id] === 'object' && !(src[id] instanceof Array) &&
2478+
if (typeof src[id] === 'object' && !(MathJax.Object.isArray(src[id])) &&
24722479
(typeof dst[id] === 'object' || typeof dst[id] === 'function')) {
24732480
this.Insert(dst[id],src[id]);
24742481
} else {
@@ -2785,7 +2792,7 @@ MathJax.Hub.Startup = {
27852792
//
27862793
loadArray: function (files,dir,name,synchronous) {
27872794
if (files) {
2788-
if (!(files instanceof Array)) {files = [files]}
2795+
if (!MathJax.Object.isArray(files)) {files = [files]}
27892796
if (files.length) {
27902797
var queue = MathJax.Callback.Queue(), callback = {}, file;
27912798
for (var i = 0, m = files.length; i < m; i++) {
@@ -2895,11 +2902,11 @@ MathJax.Hub.Startup = {
28952902
Process: function (script,state) {
28962903
var queue = CALLBACK.Queue(), file;
28972904
// Load any needed element jax
2898-
var jax = this.elementJax; if (!(jax instanceof Array)) {jax = [jax]}
2905+
var jax = this.elementJax; if (!BASE.Object.isArray(jax)) {jax = [jax]}
28992906
for (var i = 0, m = jax.length; i < m; i++) {
29002907
file = BASE.ElementJax.directory+"/"+jax[i]+"/"+this.JAXFILE;
29012908
if (!this.require) {this.require = []}
2902-
else if (!(this.require instanceof Array)) {this.require = [this.require]};
2909+
else if (!BASE.Object.isArray(this.require)) {this.require = [this.require]};
29032910
this.require.push(file); // so Startup will wait for it to be loaded
29042911
queue.Push(AJAX.Require(file));
29052912
}
@@ -2954,7 +2961,7 @@ MathJax.Hub.Startup = {
29542961
{jax[mimetype].unshift(this)} else {jax[mimetype].push(this)}
29552962
// Make sure the element jax is loaded before Startup is called
29562963
if (!this.require) {this.require = []}
2957-
else if (!(this.require instanceof Array)) {this.require = [this.require]};
2964+
else if (!BASE.Object.isArray(this.require)) {this.require = [this.require]};
29582965
this.require.push(BASE.ElementJax.directory+"/"+(mimetype.split(/\//)[1])+"/"+this.JAXFILE);
29592966
},
29602967
Remove: function (jax) {}

unpacked/extensions/FontWarnings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@
247247
} else {delete CONFIG.messageStyle.filter}
248248
CONFIG.messageStyle.maxWidth = (document.body.clientWidth-75) + "px";
249249
var i = 0; while (i < data.length) {
250-
if (data[i] instanceof Array) {
250+
if (MathJax.Object.isArray(data[i])) {
251251
if (data[i].length === 1 && CONFIG.HTML[data[i][0]]) {
252252
data.splice.apply(data,[i,1].concat(CONFIG.HTML[data[i][0]]));
253253
} else if (typeof data[i][1] === "string") {

unpacked/extensions/MathMenu.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
[["MathMenu",id]].concat([].slice.call(arguments,1))
4343
);
4444
};
45+
46+
var isArray = MathJax.Object.isArray;
4547

4648
var isPC = HUB.Browser.isPC, isMSIE = HUB.Browser.isMSIE, isIE9 = ((document.documentMode||0) > 8);
4749
var ROUND = (isPC ? null : "5px");
@@ -806,7 +808,7 @@
806808
action: function () {},
807809

808810
Init: function (name,action,def) {
809-
if (!(name instanceof Array)) {name = [name,name]} // make [id,label] pair
811+
if (!isArray(name)) {name = [name,name]} // make [id,label] pair
810812
this.name = name; this.action = action;
811813
this.With(def);
812814
},
@@ -837,7 +839,7 @@
837839
return def;
838840
},
839841
Init: function (name,def) {
840-
if (!(name instanceof Array)) {name = [name,name]} // make [id,label] pair
842+
if (!isArray(name)) {name = [name,name]} // make [id,label] pair
841843
this.name = name; var i = 1;
842844
if (!(def instanceof MENU.ITEM)) {this.With(def), i++}
843845
this.submenu = MENU.apply(MENU,[].slice.call(arguments,i));
@@ -936,7 +938,7 @@
936938
return def;
937939
},
938940
Init: function (name,variable,def) {
939-
if (!(name instanceof Array)) {name = [name,name]} // make [id,label] pair
941+
if (!isArray(name)) {name = [name,name]} // make [id,label] pair
940942
this.name = name; this.variable = variable; this.With(def);
941943
if (this.value == null) {this.value = this.name[0]}
942944
},
@@ -983,7 +985,7 @@
983985
return def;
984986
},
985987
Init: function (name,variable,def) {
986-
if (!(name instanceof Array)) {name = [name,name]} // make [id,label] pair
988+
if (!isArray(name)) {name = [name,name]} // make [id,label] pair
987989
this.name = name; this.variable = variable; this.With(def);
988990
},
989991
Label: function (def,menu) {
@@ -1012,7 +1014,7 @@
10121014
role: "menuitem", // Aria role.
10131015

10141016
Init: function (name,def) {
1015-
if (!(name instanceof Array)) {name = [name,name]} // make [id,label] pair
1017+
if (!isArray(name)) {name = [name,name]} // make [id,label] pair
10161018
this.name = name; this.With(def);
10171019
},
10181020
Label: function (def,menu) {

unpacked/extensions/Safe.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@
227227
value = this.length2em(value);
228228
if (value == null) return false;
229229
var mM = [-CONFIG.lengthMax,CONFIG.lengthMax];
230-
if (CONFIG.styleLengths[name] instanceof Array) mM = CONFIG.styleLengths[name];
230+
if (MathJax.Object.isArray(CONFIG.styleLengths[name])) mM = CONFIG.styleLengths[name];
231231
return (value >= mM[0] && value <= mM[1]);
232232
},
233233
//

unpacked/extensions/TeX/begingroup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () {
118118
// so they can be made global when merged with the root stack.
119119
//
120120
while (n > 0) {this.stack[n].Undef(name,type); n--}
121-
if (!(value instanceof Array)) {value = [value]}
121+
if (!MathJax.Object.isArray(value)) {value = [value]}
122122
if (this.isEqn) {value.global = true}
123123
}
124124
this.stack[n].Def(name,value,type);

unpacked/jax/input/MathML/jax.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@
289289
//
290290
// Translate message if it is ["id","message",args]
291291
//
292-
if (message instanceof Array) {message = _.apply(_,message)}
292+
if (MathJax.Object.isArray(message)) {message = _.apply(_,message)}
293293
throw MathJax.Hub.Insert(Error(message),{mathmlError: true});
294294
},
295295
//

0 commit comments

Comments
 (0)