You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.1 KiB
160 lines
5.1 KiB
/*************************************************************
|
|
*
|
|
* latest.js
|
|
*
|
|
* Replacement for cdn.mathjax.org/mathjax/latest that loads the
|
|
* latest (2.x) version of MathJax from cdnjs, rawgit.com, or jsdelivr
|
|
* depending on where it was loaded from.
|
|
*
|
|
* ---------------------------------------------------------------------
|
|
*
|
|
* Copyright (c) 2017-2018 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.
|
|
*/
|
|
|
|
(function () {
|
|
|
|
var CDN = {
|
|
'cdnjs.cloudflare.com': {
|
|
api: 'https://api.cdnjs.com/libraries/mathjax?fields=version',
|
|
version: 'version',
|
|
mathjax: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/'
|
|
},
|
|
|
|
'cdn.rawgit.com': {
|
|
api: 'https://api.github.com/repos/mathjax/mathjax/releases/latest',
|
|
version: 'tag_name',
|
|
mathjax: 'https://cdn.rawgit.com/mathjax/MathJax/'
|
|
},
|
|
|
|
'cdn.jsdelivr.net': {
|
|
api: 'https://api.jsdelivr.com/v1/jsdelivr/libraries?name=mathjax&lastversion=*',
|
|
version: 'lastversion',
|
|
mathjax: 'https://cdn.jsdelivr.net/mathjax/'
|
|
}
|
|
};
|
|
|
|
function Error(message) {
|
|
if (console && console.log) console.log(message);
|
|
}
|
|
|
|
function getScript() {
|
|
if (document.currentScript) return document.currentScript;
|
|
var scripts = document.getElementsByTagName("script");
|
|
for (var i = 0, m = scripts.length; i < m; i++) {
|
|
var script = scripts[i];
|
|
for (var cdn in CDN) {if (CDN.hasOwnProperty(cdn)) {
|
|
var url = CDN[cdn].mathjax;
|
|
if (script.src && script.src.substr(0,url.length) === url) return script;
|
|
}}
|
|
}
|
|
}
|
|
|
|
function getCDN(script) {
|
|
if (!script) return;
|
|
var cdn = script.src.replace(/https:\/\//,'').replace(/[\/\?].*/,'');
|
|
return CDN[cdn];
|
|
}
|
|
|
|
var cookiePattern = /(?:^|;\s*)mjx\.latest=([^;]*)(?:;|$)/;
|
|
function getVersion() {
|
|
var match;
|
|
try {match = cookiePattern.exec(document.cookie)} catch (err) {}
|
|
if (match && match[1] !== '') return match[1];
|
|
}
|
|
function setVersion(version) {
|
|
cookie = 'mjx.latest=' + version;
|
|
var time = new Date();
|
|
time.setDate(time.getDate() + 7);
|
|
cookie += '; expires=' + time.toGMTString();
|
|
cookie += '; path=/';
|
|
try {document.cookie = cookie} catch (err) {}
|
|
}
|
|
|
|
function getXMLHttpRequest() {
|
|
if (window.XMLHttpRequest) return new XMLHttpRequest();
|
|
if (window.ActiveXObject) {
|
|
try {return new ActiveXObject("Msxml2.XMLHTTP")} catch (err) {}
|
|
try {return new ActiveXObject("Microsoft.XMLHTTP")} catch (err) {}
|
|
}
|
|
}
|
|
|
|
function loadMathJax(url) {
|
|
var script = document.createElement('script');
|
|
script.type = 'text/javascript';
|
|
script.async = true;
|
|
script.src = url;
|
|
var head = document.head || document.getElementsByTagName('head')[0] || document.body;
|
|
if (head) {
|
|
head.appendChild(script);
|
|
} else {
|
|
Error("Can't find the document <head> element");
|
|
}
|
|
}
|
|
|
|
function loadDefaultMathJax() {
|
|
var script = getScript();
|
|
if (script) {
|
|
loadMathJax(script.src.replace(/\/latest\.js/, "/MathJax.js"));
|
|
} else {
|
|
Error("Can't determine the URL for loading MathJax");
|
|
}
|
|
}
|
|
|
|
function getLatestMathJax(cdn,config,unpacked) {
|
|
var request = getXMLHttpRequest();
|
|
if (request) {
|
|
request.onreadystatechange = function() {
|
|
if (request.readyState === 4) {
|
|
if (request.status === 200) {
|
|
var json = JSON.parse(request.responseText);
|
|
if (json instanceof Array) json = json[0];
|
|
var version = json[cdn.version];
|
|
if (version.substr(0,2) === '2.') {
|
|
setVersion(version);
|
|
loadMathJax(cdn.mathjax + json[cdn.version] + unpacked + '/MathJax.js' + config);
|
|
return;
|
|
}
|
|
} else {
|
|
Error("Problem acquiring MathJax version: status = " + request.status);
|
|
}
|
|
loadDefaultMathJax();
|
|
}
|
|
}
|
|
request.open('GET', cdn.api, true);
|
|
request.send(null);
|
|
} else {
|
|
Error("Can't create XMLHttpRequest object");
|
|
loadDefaultMathJax();
|
|
}
|
|
}
|
|
|
|
var script = getScript();
|
|
var cdn = getCDN(script);
|
|
if (cdn) {
|
|
var config = script.src.replace(/.*?(\?|$)/, "$1");
|
|
config += (config ? '&' : '?') + 'latest';
|
|
var unpacked = (script.src.match(/\/unpacked\/latest\.js/) ? "/unpacked" : "");
|
|
var version = getVersion();
|
|
if (version) {
|
|
loadMathJax(cdn.mathjax + version + unpacked + '/MathJax.js' + config);
|
|
} else {
|
|
getLatestMathJax(cdn, config, unpacked);
|
|
}
|
|
} else {
|
|
loadDefaultMathJax();
|
|
}
|
|
|
|
})();
|