123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /* globals marked, unfetch, ES6Promise, Promise */ // eslint-disable-line no-redeclare
- 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;
- }
- var versionCache = {};
- var currentVersion;
- onunhandledrejection = function(e) {
- throw e.reason;
- };
- onmessage = function(e) {
- if (e.data.version === currentVersion) {
- parse(e);
- } else {
- loadVersion(e.data.version).then(function() {
- parse(e);
- });
- }
- };
- function parse(e) {
- switch (e.data.task) {
- case 'defaults':
- 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];
- }
- }
- }
- 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 = jsonString(lexed);
- var parsed = marked.parser(lexed, e.data.options);
- var endTime = new Date();
- postMessage({
- task: e.data.task,
- lexed: lexedList,
- parsed: parsed,
- time: endTime - startTime
- });
- break;
- }
- }
- function stringRepeat(char, times) {
- var s = '';
- for (var i = 0; i < times; i++) {
- s += char;
- }
- return s;
- }
- function jsonString(input, level) {
- level = level || 0;
- if (Array.isArray(input)) {
- if (input.length === 0) {
- return '[]';
- }
- var items = [],
- i;
- if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
- for (i = 0; i < input.length; i++) {
- items.push(stringRepeat(' ', 2 * level) + jsonString(input[i], level + 1));
- }
- return '[\n' + items.join('\n') + '\n]';
- }
- for (i = 0; i < input.length; i++) {
- 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);
- }
- }
- function loadVersion(ver) {
- var promise;
- if (versionCache[ver]) {
- promise = Promise.resolve(versionCache[ver]);
- } else {
- promise = fetch(ver)
- .then(function(res) { return res.text(); })
- .then(function(text) {
- versionCache[ver] = text;
- return text;
- });
- }
- return promise.then(function(text) {
- try {
- // eslint-disable-next-line no-new-func
- Function(text)();
- } catch (err) {
- throw new Error('Cannot load that version of marked');
- }
- currentVersion = ver;
- });
- }
|