worker.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* globals marked, unfetch, ES6Promise, Promise */ // eslint-disable-line no-redeclare
  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 = jsonString(lexed);
  47. var parsed = marked.parser(lexed, e.data.options);
  48. var endTime = new Date();
  49. postMessage({
  50. task: e.data.task,
  51. lexed: lexedList,
  52. parsed: parsed,
  53. time: endTime - startTime
  54. });
  55. break;
  56. }
  57. }
  58. function stringRepeat(char, times) {
  59. var s = '';
  60. for (var i = 0; i < times; i++) {
  61. s += char;
  62. }
  63. return s;
  64. }
  65. function jsonString(input, level) {
  66. level = level || 0;
  67. if (Array.isArray(input)) {
  68. if (input.length === 0) {
  69. return '[]';
  70. }
  71. var items = [],
  72. i;
  73. if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
  74. for (i = 0; i < input.length; i++) {
  75. items.push(stringRepeat(' ', 2 * level) + jsonString(input[i], level + 1));
  76. }
  77. return '[\n' + items.join('\n') + '\n]';
  78. }
  79. for (i = 0; i < input.length; i++) {
  80. items.push(jsonString(input[i], level));
  81. }
  82. return '[' + items.join(', ') + ']';
  83. } else if (typeof input === 'object' && input !== null) {
  84. var props = [];
  85. for (var prop in input) {
  86. props.push(prop + ':' + jsonString(input[prop], level));
  87. }
  88. return '{' + props.join(', ') + '}';
  89. } else {
  90. return JSON.stringify(input);
  91. }
  92. }
  93. function loadVersion(ver) {
  94. var promise;
  95. if (versionCache[ver]) {
  96. promise = Promise.resolve(versionCache[ver]);
  97. } else {
  98. promise = fetch(ver)
  99. .then(function(res) { return res.text(); })
  100. .then(function(text) {
  101. versionCache[ver] = text;
  102. return text;
  103. });
  104. }
  105. return promise.then(function(text) {
  106. try {
  107. // eslint-disable-next-line no-new-func
  108. Function(text)();
  109. } catch (err) {
  110. throw new Error('Cannot load that version of marked');
  111. }
  112. currentVersion = ver;
  113. });
  114. }