marked/docs/demo/worker.js
2019-02-13 14:18:15 -06:00

80 lines
1.8 KiB
JavaScript

/* global marked */
var versionCache = {};
var currentVersion;
onmessage = function (e) {
if (e.data.version === currentVersion) {
parse(e);
} else {
getVersion(e.data.version).then(function (text) {
// eslint-disable-next-line no-new-func
Function(text)();
currentVersion = e.data.version;
parse(e);
});
}
};
onunhandledrejection = function (e) {
throw e.reason;
};
function parse(e) {
switch (e.data.task) {
case 'defaults':
var defaults = marked.getDefaults();
defaults.renderer = null;
postMessage({
task: e.data.task,
defaults: defaults
});
break;
case 'parse':
var startTime = new Date();
var lexed = marked.lexer(e.data.markdown, e.data.options);
var lexedList = [];
for (var i = 0; i < lexed.length; i++) {
var lexedLine = [];
for (var j in lexed[i]) {
lexedLine.push(j + ':' + jsonString(lexed[i][j]));
}
lexedList.push('{' + lexedLine.join(', ') + '}');
}
var parsed = marked.parser(lexed, e.data.options);
var endTime = new Date();
// setTimeout(function () {
postMessage({
task: e.data.task,
lexed: lexedList.join('\n'),
parsed: parsed,
time: endTime - startTime
});
// }, 10000);
break;
}
}
function jsonString(input) {
var output = (input + '')
.replace(/\n/g, '\\n')
.replace(/\r/g, '\\r')
.replace(/\t/g, '\\t')
.replace(/\f/g, '\\f')
.replace(/[\\"']/g, '\\$&')
.replace(/\u0000/g, '\\0');
return '"' + output + '"';
};
function getVersion(ver) {
if (ver in versionCache) {
return Promise.resolve(versionCache[ver]);
}
return fetch(ver)
.then(function (res) { return res.text(); })
.then(function (text) {
versionCache[ver] = text;
return text;
});
}