worker.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* globals marked, unfetch, ES6Promise */
  2. if (!self.Promise) {
  3. self.importScripts('https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js');
  4. self.Promise = ES6Promise;
  5. }
  6. if (!self.fetch) {
  7. self.importScripts('https://cdn.jsdelivr.net/npm/unfetch/dist/unfetch.umd.js');
  8. self.fetch = unfetch;
  9. }
  10. var versionCache = {};
  11. var currentVersion;
  12. onunhandledrejection = function (e) {
  13. throw e.reason;
  14. };
  15. onmessage = function (e) {
  16. if (e.data.version === currentVersion) {
  17. parse(e);
  18. } else {
  19. loadVersion(e.data.version).then(function () {
  20. parse(e);
  21. });
  22. }
  23. };
  24. function parse(e) {
  25. switch (e.data.task) {
  26. case 'defaults':
  27. var defaults = {};
  28. if (typeof marked.getDefaults === 'function') {
  29. defaults = marked.getDefaults();
  30. delete defaults.renderer;
  31. } else if ('defaults' in marked) {
  32. for (var prop in marked.defaults) {
  33. if (prop !== 'renderer') {
  34. defaults[prop] = marked.defaults[prop];
  35. }
  36. }
  37. }
  38. postMessage({
  39. task: e.data.task,
  40. defaults: defaults
  41. });
  42. break;
  43. case 'parse':
  44. var startTime = new Date();
  45. var lexed = marked.lexer(e.data.markdown, e.data.options);
  46. var lexedList = [];
  47. for (var i = 0; i < lexed.length; i++) {
  48. var lexedLine = [];
  49. for (var j in lexed[i]) {
  50. lexedLine.push(j + ':' + jsonString(lexed[i][j]));
  51. }
  52. lexedList.push('{' + lexedLine.join(', ') + '}');
  53. }
  54. var parsed = marked.parser(lexed, e.data.options);
  55. var endTime = new Date();
  56. // setTimeout(function () {
  57. postMessage({
  58. task: e.data.task,
  59. lexed: lexedList.join('\n'),
  60. parsed: parsed,
  61. time: endTime - startTime
  62. });
  63. // }, 10000);
  64. break;
  65. }
  66. }
  67. function jsonString(input) {
  68. var output = (input + '')
  69. .replace(/\n/g, '\\n')
  70. .replace(/\r/g, '\\r')
  71. .replace(/\t/g, '\\t')
  72. .replace(/\f/g, '\\f')
  73. .replace(/[\\"']/g, '\\$&')
  74. .replace(/\u0000/g, '\\0');
  75. return '"' + output + '"';
  76. };
  77. function loadVersion(ver) {
  78. var promise;
  79. if (versionCache[ver]) {
  80. promise = Promise.resolve(versionCache[ver]);
  81. } else {
  82. promise = fetch(ver)
  83. .then(function (res) { return res.text(); })
  84. .then(function (text) {
  85. versionCache[ver] = text;
  86. return text;
  87. });
  88. }
  89. return promise.then(function (text) {
  90. try {
  91. // eslint-disable-next-line no-new-func
  92. Function(text)();
  93. } catch (err) {
  94. throw new Error('Cannot load that version of marked');
  95. }
  96. currentVersion = ver;
  97. });
  98. }