Skip to content

Commit 64b65a6

Browse files
authored
Merge pull request #1603 from dpvc/issue1584
Add MathJax.Object.isArray, and change most 'instanceof Array' to use it. #1584
2 parents ec3cf0a + 8344a10 commit 64b65a6

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 = Array.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)