marked 2.0.7 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/marked.js CHANGED
@@ -75,6 +75,7 @@
75
75
  return {
76
76
  baseUrl: null,
77
77
  breaks: false,
78
+ extensions: null,
78
79
  gfm: true,
79
80
  headerIds: true,
80
81
  headerPrefix: '',
@@ -1458,6 +1459,8 @@
1458
1459
  ;
1459
1460
 
1460
1461
  _proto.blockTokens = function blockTokens(src, tokens, top) {
1462
+ var _this = this;
1463
+
1461
1464
  if (tokens === void 0) {
1462
1465
  tokens = [];
1463
1466
  }
@@ -1470,10 +1473,24 @@
1470
1473
  src = src.replace(/^ +$/gm, '');
1471
1474
  }
1472
1475
 
1473
- var token, i, l, lastToken;
1476
+ var token, i, l, lastToken, cutSrc, lastParagraphClipped;
1474
1477
 
1475
1478
  while (src) {
1476
- // newline
1479
+ var _this$options, _this$options$extensi, _this$options$extensi2;
1480
+
1481
+ if ((_this$options = this.options) != null && (_this$options$extensi = _this$options.extensions) != null && _this$options$extensi.block && this.options.extensions.block.some(function (extTokenizer) {
1482
+ if (token = extTokenizer.call(_this, src, tokens)) {
1483
+ src = src.substring(token.raw.length);
1484
+ tokens.push(token);
1485
+ return true;
1486
+ }
1487
+
1488
+ return false;
1489
+ })) {
1490
+ continue;
1491
+ } // newline
1492
+
1493
+
1477
1494
  if (token = this.tokenizer.space(src)) {
1478
1495
  src = src.substring(token.raw.length);
1479
1496
 
@@ -1582,11 +1599,43 @@
1582
1599
  tokens.push(token);
1583
1600
  continue;
1584
1601
  } // top-level paragraph
1602
+ // prevent paragraph consuming extensions by clipping 'src' to extension start
1603
+
1604
+
1605
+ cutSrc = src;
1606
+
1607
+ if ((_this$options$extensi2 = this.options.extensions) != null && _this$options$extensi2.startBlock) {
1608
+ (function () {
1609
+ var startIndex = Infinity;
1610
+ var tempSrc = src.slice(1);
1611
+ var tempStart = void 0;
1612
+
1613
+ _this.options.extensions.startBlock.forEach(function (getStartIndex) {
1614
+ tempStart = getStartIndex.call(this, tempSrc);
1615
+
1616
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1617
+ startIndex = Math.min(startIndex, tempStart);
1618
+ }
1619
+ });
1620
+
1621
+ if (startIndex < Infinity && startIndex >= 0) {
1622
+ cutSrc = src.substring(0, startIndex + 1);
1623
+ }
1624
+ })();
1625
+ }
1626
+
1627
+ if (top && (token = this.tokenizer.paragraph(cutSrc))) {
1628
+ lastToken = tokens[tokens.length - 1];
1585
1629
 
1630
+ if (lastParagraphClipped && lastToken.type === 'paragraph') {
1631
+ lastToken.raw += '\n' + token.raw;
1632
+ lastToken.text += '\n' + token.text;
1633
+ } else {
1634
+ tokens.push(token);
1635
+ }
1586
1636
 
1587
- if (top && (token = this.tokenizer.paragraph(src))) {
1637
+ lastParagraphClipped = cutSrc.length !== src.length;
1588
1638
  src = src.substring(token.raw.length);
1589
- tokens.push(token);
1590
1639
  continue;
1591
1640
  } // text
1592
1641
 
@@ -1694,6 +1743,8 @@
1694
1743
  ;
1695
1744
 
1696
1745
  _proto.inlineTokens = function inlineTokens(src, tokens, inLink, inRawBlock) {
1746
+ var _this2 = this;
1747
+
1697
1748
  if (tokens === void 0) {
1698
1749
  tokens = [];
1699
1750
  }
@@ -1706,7 +1757,7 @@
1706
1757
  inRawBlock = false;
1707
1758
  }
1708
1759
 
1709
- var token, lastToken; // String with links masked to avoid interference with em and strong
1760
+ var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong
1710
1761
 
1711
1762
  var maskedSrc = src;
1712
1763
  var match;
@@ -1735,11 +1786,26 @@
1735
1786
  }
1736
1787
 
1737
1788
  while (src) {
1789
+ var _this$options2, _this$options2$extens, _this$options$extensi3;
1790
+
1738
1791
  if (!keepPrevChar) {
1739
1792
  prevChar = '';
1740
1793
  }
1741
1794
 
1742
- keepPrevChar = false; // escape
1795
+ keepPrevChar = false; // extensions
1796
+
1797
+ if ((_this$options2 = this.options) != null && (_this$options2$extens = _this$options2.extensions) != null && _this$options2$extens.inline && this.options.extensions.inline.some(function (extTokenizer) {
1798
+ if (token = extTokenizer.call(_this2, src, tokens)) {
1799
+ src = src.substring(token.raw.length);
1800
+ tokens.push(token);
1801
+ return true;
1802
+ }
1803
+
1804
+ return false;
1805
+ })) {
1806
+ continue;
1807
+ } // escape
1808
+
1743
1809
 
1744
1810
  if (token = this.tokenizer.escape(src)) {
1745
1811
  src = src.substring(token.raw.length);
@@ -1752,11 +1818,11 @@
1752
1818
  src = src.substring(token.raw.length);
1753
1819
  inLink = token.inLink;
1754
1820
  inRawBlock = token.inRawBlock;
1755
- var _lastToken = tokens[tokens.length - 1];
1821
+ lastToken = tokens[tokens.length - 1];
1756
1822
 
1757
- if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
1758
- _lastToken.raw += token.raw;
1759
- _lastToken.text += token.text;
1823
+ if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1824
+ lastToken.raw += token.raw;
1825
+ lastToken.text += token.text;
1760
1826
  } else {
1761
1827
  tokens.push(token);
1762
1828
  }
@@ -1779,14 +1845,14 @@
1779
1845
 
1780
1846
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1781
1847
  src = src.substring(token.raw.length);
1782
- var _lastToken2 = tokens[tokens.length - 1];
1848
+ lastToken = tokens[tokens.length - 1];
1783
1849
 
1784
1850
  if (token.type === 'link') {
1785
1851
  token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1786
1852
  tokens.push(token);
1787
- } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
1788
- _lastToken2.raw += token.raw;
1789
- _lastToken2.text += token.text;
1853
+ } else if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1854
+ lastToken.raw += token.raw;
1855
+ lastToken.text += token.text;
1790
1856
  } else {
1791
1857
  tokens.push(token);
1792
1858
  }
@@ -1837,9 +1903,32 @@
1837
1903
  tokens.push(token);
1838
1904
  continue;
1839
1905
  } // text
1906
+ // prevent inlineText consuming extensions by clipping 'src' to extension start
1840
1907
 
1841
1908
 
1842
- if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
1909
+ cutSrc = src;
1910
+
1911
+ if ((_this$options$extensi3 = this.options.extensions) != null && _this$options$extensi3.startInline) {
1912
+ (function () {
1913
+ var startIndex = Infinity;
1914
+ var tempSrc = src.slice(1);
1915
+ var tempStart = void 0;
1916
+
1917
+ _this2.options.extensions.startInline.forEach(function (getStartIndex) {
1918
+ tempStart = getStartIndex.call(this, tempSrc);
1919
+
1920
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1921
+ startIndex = Math.min(startIndex, tempStart);
1922
+ }
1923
+ });
1924
+
1925
+ if (startIndex < Infinity && startIndex >= 0) {
1926
+ cutSrc = src.substring(0, startIndex + 1);
1927
+ }
1928
+ })();
1929
+ }
1930
+
1931
+ if (token = this.tokenizer.inlineText(cutSrc, inRawBlock, smartypants)) {
1843
1932
  src = src.substring(token.raw.length);
1844
1933
 
1845
1934
  if (token.raw.slice(-1) !== '_') {
@@ -2215,11 +2304,23 @@
2215
2304
  item,
2216
2305
  checked,
2217
2306
  task,
2218
- checkbox;
2307
+ checkbox,
2308
+ ret;
2219
2309
  var l = tokens.length;
2220
2310
 
2221
2311
  for (i = 0; i < l; i++) {
2222
- token = tokens[i];
2312
+ var _this$options$extensi, _this$options$extensi2;
2313
+
2314
+ token = tokens[i]; // Run any renderer extensions
2315
+
2316
+ if ((_this$options$extensi = this.options.extensions) != null && (_this$options$extensi2 = _this$options$extensi.renderers) != null && _this$options$extensi2[token.type]) {
2317
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2318
+
2319
+ if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
2320
+ out += ret || '';
2321
+ continue;
2322
+ }
2323
+ }
2223
2324
 
2224
2325
  switch (token.type) {
2225
2326
  case 'space':
@@ -2383,11 +2484,23 @@
2383
2484
  renderer = renderer || this.renderer;
2384
2485
  var out = '',
2385
2486
  i,
2386
- token;
2487
+ token,
2488
+ ret;
2387
2489
  var l = tokens.length;
2388
2490
 
2389
2491
  for (i = 0; i < l; i++) {
2390
- token = tokens[i];
2492
+ var _this$options$extensi3, _this$options$extensi4;
2493
+
2494
+ token = tokens[i]; // Run any renderer extensions
2495
+
2496
+ if ((_this$options$extensi3 = this.options.extensions) != null && (_this$options$extensi4 = _this$options$extensi3.renderers) != null && _this$options$extensi4[token.type]) {
2497
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2498
+
2499
+ if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2500
+ out += ret || '';
2501
+ continue;
2502
+ }
2503
+ }
2391
2504
 
2392
2505
  switch (token.type) {
2393
2506
  case 'escape':
@@ -2606,82 +2719,171 @@
2606
2719
  * Use Extension
2607
2720
  */
2608
2721
 
2609
- marked.use = function (extension) {
2610
- var opts = merge({}, extension);
2722
+ marked.use = function () {
2723
+ var _this = this;
2611
2724
 
2612
- if (extension.renderer) {
2613
- (function () {
2614
- var renderer = marked.defaults.renderer || new Renderer();
2725
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2726
+ args[_key] = arguments[_key];
2727
+ }
2728
+
2729
+ var opts = merge.apply(void 0, [{}].concat(args));
2730
+ var extensions = marked.defaults.extensions || {
2731
+ renderers: {},
2732
+ childTokens: {}
2733
+ };
2734
+ var hasExtensions;
2735
+ args.forEach(function (pack) {
2736
+ // ==-- Parse "addon" extensions --== //
2737
+ if (pack.extensions) {
2738
+ hasExtensions = true;
2739
+ pack.extensions.forEach(function (ext) {
2740
+ if (!ext.name) {
2741
+ throw new Error('extension name required');
2742
+ }
2743
+
2744
+ if (ext.renderer) {
2745
+ var _extensions$renderers;
2746
+
2747
+ // Renderer extensions
2748
+ var prevRenderer = (_extensions$renderers = extensions.renderers) == null ? void 0 : _extensions$renderers[ext.name];
2749
+
2750
+ if (prevRenderer) {
2751
+ // Replace extension with func to run new extension but fall back if false
2752
+ extensions.renderers[ext.name] = function () {
2753
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2754
+ args[_key2] = arguments[_key2];
2755
+ }
2615
2756
 
2616
- var _loop = function _loop(prop) {
2617
- var prevRenderer = renderer[prop];
2757
+ var ret = ext.renderer.apply(this, args);
2618
2758
 
2619
- renderer[prop] = function () {
2620
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2621
- args[_key] = arguments[_key];
2759
+ if (ret === false) {
2760
+ ret = prevRenderer.apply(this, args);
2761
+ }
2762
+
2763
+ return ret;
2764
+ };
2765
+ } else {
2766
+ extensions.renderers[ext.name] = ext.renderer;
2767
+ }
2768
+ }
2769
+
2770
+ if (ext.tokenizer) {
2771
+ // Tokenizer Extensions
2772
+ if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {
2773
+ throw new Error("extension level must be 'block' or 'inline'");
2622
2774
  }
2623
2775
 
2624
- var ret = extension.renderer[prop].apply(renderer, args);
2776
+ if (extensions[ext.level]) {
2777
+ extensions[ext.level].unshift(ext.tokenizer);
2778
+ } else {
2779
+ extensions[ext.level] = [ext.tokenizer];
2780
+ }
2625
2781
 
2626
- if (ret === false) {
2627
- ret = prevRenderer.apply(renderer, args);
2782
+ if (ext.start) {
2783
+ // Function to check for start of token
2784
+ if (ext.level === 'block') {
2785
+ if (extensions.startBlock) {
2786
+ extensions.startBlock.push(ext.start);
2787
+ } else {
2788
+ extensions.startBlock = [ext.start];
2789
+ }
2790
+ } else if (ext.level === 'inline') {
2791
+ if (extensions.startInline) {
2792
+ extensions.startInline.push(ext.start);
2793
+ } else {
2794
+ extensions.startInline = [ext.start];
2795
+ }
2796
+ }
2628
2797
  }
2798
+ }
2799
+
2800
+ if (ext.childTokens) {
2801
+ // Child tokens to be visited by walkTokens
2802
+ extensions.childTokens[ext.name] = ext.childTokens;
2803
+ }
2804
+ });
2805
+ } // ==-- Parse "overwrite" extensions --== //
2806
+
2807
+
2808
+ if (pack.renderer) {
2809
+ (function () {
2810
+ var renderer = marked.defaults.renderer || new Renderer();
2629
2811
 
2630
- return ret;
2812
+ var _loop = function _loop(prop) {
2813
+ var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false
2814
+
2815
+ renderer[prop] = function () {
2816
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2817
+ args[_key3] = arguments[_key3];
2818
+ }
2819
+
2820
+ var ret = pack.renderer[prop].apply(renderer, args);
2821
+
2822
+ if (ret === false) {
2823
+ ret = prevRenderer.apply(renderer, args);
2824
+ }
2825
+
2826
+ return ret;
2827
+ };
2631
2828
  };
2632
- };
2633
2829
 
2634
- for (var prop in extension.renderer) {
2635
- _loop(prop);
2636
- }
2830
+ for (var prop in pack.renderer) {
2831
+ _loop(prop);
2832
+ }
2637
2833
 
2638
- opts.renderer = renderer;
2639
- })();
2640
- }
2834
+ opts.renderer = renderer;
2835
+ })();
2836
+ }
2641
2837
 
2642
- if (extension.tokenizer) {
2643
- (function () {
2644
- var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2838
+ if (pack.tokenizer) {
2839
+ (function () {
2840
+ var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2645
2841
 
2646
- var _loop2 = function _loop2(prop) {
2647
- var prevTokenizer = tokenizer[prop];
2842
+ var _loop2 = function _loop2(prop) {
2843
+ var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false
2648
2844
 
2649
- tokenizer[prop] = function () {
2650
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2651
- args[_key2] = arguments[_key2];
2652
- }
2845
+ tokenizer[prop] = function () {
2846
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
2847
+ args[_key4] = arguments[_key4];
2848
+ }
2653
2849
 
2654
- var ret = extension.tokenizer[prop].apply(tokenizer, args);
2850
+ var ret = pack.tokenizer[prop].apply(tokenizer, args);
2655
2851
 
2656
- if (ret === false) {
2657
- ret = prevTokenizer.apply(tokenizer, args);
2658
- }
2852
+ if (ret === false) {
2853
+ ret = prevTokenizer.apply(tokenizer, args);
2854
+ }
2659
2855
 
2660
- return ret;
2856
+ return ret;
2857
+ };
2661
2858
  };
2662
- };
2663
2859
 
2664
- for (var prop in extension.tokenizer) {
2665
- _loop2(prop);
2666
- }
2860
+ for (var prop in pack.tokenizer) {
2861
+ _loop2(prop);
2862
+ }
2667
2863
 
2668
- opts.tokenizer = tokenizer;
2669
- })();
2670
- }
2864
+ opts.tokenizer = tokenizer;
2865
+ })();
2866
+ } // ==-- Parse WalkTokens extensions --== //
2671
2867
 
2672
- if (extension.walkTokens) {
2673
- var walkTokens = marked.defaults.walkTokens;
2674
2868
 
2675
- opts.walkTokens = function (token) {
2676
- extension.walkTokens(token);
2869
+ if (pack.walkTokens) {
2870
+ var walkTokens = marked.defaults.walkTokens;
2677
2871
 
2678
- if (walkTokens) {
2679
- walkTokens(token);
2680
- }
2681
- };
2682
- }
2872
+ opts.walkTokens = function (token) {
2873
+ pack.walkTokens.call(_this, token);
2683
2874
 
2684
- marked.setOptions(opts);
2875
+ if (walkTokens) {
2876
+ walkTokens(token);
2877
+ }
2878
+ };
2879
+ }
2880
+
2881
+ if (hasExtensions) {
2882
+ opts.extensions = extensions;
2883
+ }
2884
+
2885
+ marked.setOptions(opts);
2886
+ });
2685
2887
  };
2686
2888
  /**
2687
2889
  * Run callback for every token
@@ -2689,7 +2891,7 @@
2689
2891
 
2690
2892
 
2691
2893
  marked.walkTokens = function (tokens, callback) {
2692
- for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2894
+ var _loop3 = function _loop3() {
2693
2895
  var token = _step.value;
2694
2896
  callback(token);
2695
2897
 
@@ -2721,11 +2923,26 @@
2721
2923
 
2722
2924
  default:
2723
2925
  {
2724
- if (token.tokens) {
2926
+ var _marked$defaults, _marked$defaults$exte, _marked$defaults$exte2, _marked$defaults3, _marked$defaults3$ext;
2927
+
2928
+ if ((_marked$defaults = marked.defaults) != null && (_marked$defaults$exte = _marked$defaults.extensions) != null && (_marked$defaults$exte2 = _marked$defaults$exte.childTokens) != null && _marked$defaults$exte2[token.type]) {
2929
+ var _marked$defaults2;
2930
+
2931
+ // Walk any extensions
2932
+ (_marked$defaults2 = marked.defaults) == null ? void 0 : _marked$defaults2.extensions.childTokens[token.type].forEach(function (childTokens) {
2933
+ marked.walkTokens(token[childTokens], callback);
2934
+ });
2935
+ }
2936
+
2937
+ if (token.tokens && !((_marked$defaults3 = marked.defaults) != null && (_marked$defaults3$ext = _marked$defaults3.extensions) != null && _marked$defaults3$ext.childTokens[token.type])) {
2725
2938
  marked.walkTokens(token.tokens, callback);
2726
2939
  }
2727
2940
  }
2728
2941
  }
2942
+ };
2943
+
2944
+ for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2945
+ _loop3();
2729
2946
  }
2730
2947
  };
2731
2948
  /**