marked/docs/demo/worker.js

141 lines
3.3 KiB
JavaScript
Raw Normal View History

2019-07-02 16:28:32 -05:00
/* globals marked, unfetch, ES6Promise, Promise */ // eslint-disable-line no-redeclare
2020-04-01 21:08:44 -05:00
2019-02-14 09:19:14 -06:00
if (!self.Promise) {
self.importScripts('https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js');
self.Promise = ES6Promise;
}
if (!self.fetch) {
self.importScripts('https://cdn.jsdelivr.net/npm/unfetch/dist/unfetch.umd.js');
self.fetch = unfetch;
}
2019-02-14 11:14:15 -06:00
2019-02-13 12:16:39 -06:00
var versionCache = {};
var currentVersion;
2019-02-14 11:14:15 -06:00
2019-04-26 20:58:04 -05:00
onunhandledrejection = function(e) {
2019-02-14 11:14:15 -06:00
throw e.reason;
};
2019-04-26 20:58:04 -05:00
onmessage = function(e) {
2019-02-13 12:16:39 -06:00
if (e.data.version === currentVersion) {
parse(e);
} else {
2019-04-26 20:58:04 -05:00
loadVersion(e.data.version).then(function() {
2019-02-13 12:16:39 -06:00
parse(e);
});
}
};
function getDefaults() {
var defaults = {};
if (typeof marked.getDefaults === 'function') {
defaults = marked.getDefaults();
delete defaults.renderer;
} else if ('defaults' in marked) {
for (var prop in marked.defaults) {
if (prop !== 'renderer') {
defaults[prop] = marked.defaults[prop];
}
}
}
return defaults;
}
function mergeOptions(options) {
var defaults = getDefaults();
var opts = {};
var invalidOptions = [
'renderer',
'tokenizer',
'walkTokens',
'extensions',
'highlight',
'sanitizer'
];
for (var prop in defaults) {
opts[prop] = invalidOptions.includes(prop) || !(prop in options)
? defaults[prop]
: options[prop];
}
return opts;
}
2019-04-26 20:58:04 -05:00
function parse(e) {
2019-02-13 12:16:39 -06:00
switch (e.data.task) {
case 'defaults':
postMessage({
id: e.data.id,
2019-02-13 12:16:39 -06:00
task: e.data.task,
defaults: getDefaults()
2019-02-13 12:16:39 -06:00
});
break;
case 'parse':
var options = mergeOptions(e.data.options);
2019-02-13 14:18:15 -06:00
var startTime = new Date();
var lexed = marked.lexer(e.data.markdown, options);
2020-04-08 23:57:18 -05:00
var lexedList = jsonString(lexed);
var parsed = marked.parser(lexed, options);
2019-02-13 14:18:15 -06:00
var endTime = new Date();
2019-02-13 12:16:39 -06:00
postMessage({
id: e.data.id,
2019-02-13 12:16:39 -06:00
task: e.data.task,
2020-04-01 21:08:44 -05:00
lexed: lexedList,
2019-02-13 14:18:15 -06:00
parsed: parsed,
time: endTime - startTime
2019-02-13 12:16:39 -06:00
});
break;
}
}
2020-04-08 23:46:46 -05:00
function jsonString(input, level) {
2020-04-08 23:57:18 -05:00
level = level || 0;
2020-04-08 23:46:46 -05:00
if (Array.isArray(input)) {
if (input.length === 0) {
return '[]';
}
2020-04-08 23:57:18 -05:00
var items = [],
i;
2020-04-08 23:46:46 -05:00
if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
2020-04-08 23:57:18 -05:00
for (i = 0; i < input.length; i++) {
items.push(' '.repeat(2 * level) + jsonString(input[i], level + 1));
2020-04-08 23:57:18 -05:00
}
return '[\n' + items.join('\n') + '\n]';
2020-04-08 23:46:46 -05:00
}
2020-04-08 23:57:18 -05:00
for (i = 0; i < input.length; i++) {
2020-04-08 23:46:46 -05:00
items.push(jsonString(input[i], level));
}
return '[' + items.join(', ') + ']';
} else if (typeof input === 'object' && input !== null) {
var props = [];
for (var prop in input) {
props.push(prop + ':' + jsonString(input[prop], level));
}
return '{' + props.join(', ') + '}';
} else {
return JSON.stringify(input);
}
2020-04-01 21:08:44 -05:00
}
2019-02-13 12:16:39 -06:00
2019-04-26 20:58:04 -05:00
function loadVersion(ver) {
2019-02-14 11:14:15 -06:00
var promise;
2019-02-14 11:52:14 -06:00
if (versionCache[ver]) {
2019-02-14 11:14:15 -06:00
promise = Promise.resolve(versionCache[ver]);
} else {
promise = fetch(ver)
2019-04-26 20:58:04 -05:00
.then(function(res) { return res.text(); })
.then(function(text) {
2019-02-14 11:14:15 -06:00
versionCache[ver] = text;
return text;
});
2019-02-13 12:16:39 -06:00
}
2019-04-26 20:58:04 -05:00
return promise.then(function(text) {
2019-02-14 11:14:15 -06:00
try {
// eslint-disable-next-line no-new-func
Function(text)();
} catch (err) {
throw new Error('Cannot load that version of marked');
}
currentVersion = ver;
});
2019-02-13 12:16:39 -06:00
}