worker.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /* global marked */
  2. var versionCache = {};
  3. var currentVersion;
  4. onmessage = function (e) {
  5. if (e.data.version === currentVersion) {
  6. parse(e);
  7. } else {
  8. getVersion(e.data.version).then(function (text) {
  9. // eslint-disable-next-line no-new-func
  10. Function(text)();
  11. currentVersion = e.data.version;
  12. parse(e);
  13. });
  14. }
  15. };
  16. onunhandledrejection = function (e) {
  17. throw e.reason;
  18. };
  19. function parse(e) {
  20. switch (e.data.task) {
  21. case 'defaults':
  22. var defaults = marked.getDefaults();
  23. defaults.renderer = null;
  24. postMessage({
  25. task: e.data.task,
  26. defaults: defaults
  27. });
  28. break;
  29. case 'parse':
  30. var startTime = new Date();
  31. var lexed = marked.lexer(e.data.markdown, e.data.options);
  32. var lexedList = [];
  33. for (var i = 0; i < lexed.length; i++) {
  34. var lexedLine = [];
  35. for (var j in lexed[i]) {
  36. lexedLine.push(j + ':' + jsonString(lexed[i][j]));
  37. }
  38. lexedList.push('{' + lexedLine.join(', ') + '}');
  39. }
  40. var parsed = marked.parser(lexed, e.data.options);
  41. var endTime = new Date();
  42. // setTimeout(function () {
  43. postMessage({
  44. task: e.data.task,
  45. lexed: lexedList.join('\n'),
  46. parsed: parsed,
  47. time: endTime - startTime
  48. });
  49. // }, 10000);
  50. break;
  51. }
  52. }
  53. function jsonString(input) {
  54. var output = (input + '')
  55. .replace(/\n/g, '\\n')
  56. .replace(/\r/g, '\\r')
  57. .replace(/\t/g, '\\t')
  58. .replace(/\f/g, '\\f')
  59. .replace(/[\\"']/g, '\\$&')
  60. .replace(/\u0000/g, '\\0');
  61. return '"' + output + '"';
  62. };
  63. function getVersion(ver) {
  64. if (ver in versionCache) {
  65. return Promise.resolve(versionCache[ver]);
  66. }
  67. return fetch(ver)
  68. .then(function (res) { return res.text(); })
  69. .then(function (text) {
  70. versionCache[ver] = text;
  71. return text;
  72. });
  73. }