tiny-markdown-editor 0.1.33 → 0.2.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/grammar.js CHANGED
@@ -1,406 +1,284 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.htmlBlockGrammar = exports.commands = void 0;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commands = exports.inlineGrammar = exports.htmlBlockGrammar = exports.lineGrammar = exports.punctuationTrailing = exports.punctuationLeading = void 0;
7
4
  exports.htmlescape = htmlescape;
8
- exports.punctuationTrailing = exports.punctuationLeading = exports.lineGrammar = exports.inlineGrammar = void 0;
9
- require("core-js/modules/es.regexp.flags.js");
10
- // const replacements = {
11
- // ASCIIPunctuation: '!"#$%&\'()*+,\\-./:;<=>?@\\[\\]^_`{|}~',
12
- // TriggerChars: '`_\*\[\]\(\)',
13
- // Scheme: `[A-Za-z][A-Za-z0-9\+\.\-]{1,31}`,
14
- // Email: `[a-zA-Z0-9.!#$%&'*+/=?^_\`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*`, // From CommonMark spec
15
-
16
- // }
17
5
  const replacements = {
18
- ASCIIPunctuation: /[!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~\\]/,
19
- NotTriggerChar: /[^`_*[\]()<>!~]/,
20
- Scheme: /[A-Za-z][A-Za-z0-9+.-]{1,31}/,
21
- Email: /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/,
22
- // From CommonMark spec
23
- HTMLOpenTag: /<HTMLTagName(?:HTMLAttribute)*\s*\/?>/,
24
- HTMLCloseTag: /<\/HTMLTagName\s*>/,
25
- HTMLTagName: /[A-Za-z][A-Za-z0-9-]*/,
26
- HTMLComment: /<!--(?:[^>-]|(?:[^>-](?:[^-]|-[^-])*[^-]))-->/,
27
- HTMLPI: /<\?(?:|.|(?:[^?]|\?[^>])*)\?>/,
28
- HTMLDeclaration: /<![A-Z]+\s[^>]*>/,
29
- HTMLCDATA: /<!\[CDATA\[.*?\]\]>/,
30
- HTMLAttribute: /\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:HTMLAttValue)?/,
31
- HTMLAttValue: /\s*=\s*(?:(?:'[^']*')|(?:"[^"]*")|(?:[^\s"'=<>`]+))/,
32
- KnownTag: /address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul/
6
+ ASCIIPunctuation: /[!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~\\]/,
7
+ NotTriggerChar: /[^`_*[\]()<>!~]/,
8
+ Scheme: /[A-Za-z][A-Za-z0-9+.-]{1,31}/,
9
+ Email: /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/, // From CommonMark spec
10
+ HTMLOpenTag: /<HTMLTagName(?:HTMLAttribute)*\s*\/?>/,
11
+ HTMLCloseTag: /<\/HTMLTagName\s*>/,
12
+ HTMLTagName: /[A-Za-z][A-Za-z0-9-]*/,
13
+ HTMLComment: /<!--(?:[^>-]|(?:[^>-](?:[^-]|-[^-])*[^-]))-->/,
14
+ HTMLPI: /<\?(?:|.|(?:[^?]|\?[^>])*)\?>/,
15
+ HTMLDeclaration: /<![A-Z]+\s[^>]*>/,
16
+ HTMLCDATA: /<!\[CDATA\[.*?\]\]>/,
17
+ HTMLAttribute: /\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:HTMLAttValue)?/,
18
+ HTMLAttValue: /\s*=\s*(?:(?:'[^']*')|(?:"[^"]*")|(?:[^\s"'=<>`]+))/,
19
+ KnownTag: /address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul/
33
20
  };
34
-
35
21
  // From CommonMark.js.
36
- const punctuationLeading = exports.punctuationLeading = new RegExp(/^(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])/);
37
- const punctuationTrailing = exports.punctuationTrailing = new RegExp(/(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])$/);
38
-
39
- // export const inlineTriggerChars = new RegExp(`[${replacements.TriggerChars}]`);
40
-
22
+ exports.punctuationLeading = new RegExp(/^(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])/);
23
+ exports.punctuationTrailing = new RegExp(/(?:[!"#$%&'()*+,\-./:;<=>?@[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B])$/);
41
24
  /**
42
- * This is CommonMark's block grammar, but we're ignoring nested blocks here.
25
+ * This is CommonMark's block grammar, but we're ignoring nested blocks here.
43
26
  */
44
- const lineGrammar = exports.lineGrammar = {
45
- TMH1: {
46
- regexp: /^( {0,3}#\s)(.*?)((?:\s+#+\s*)?)$/,
47
- replacement: '<span class="TMMark TMMark_TMH1">$1</span>$$2<span class="TMMark TMMark_TMH1">$3</span>'
48
- },
49
- TMH2: {
50
- regexp: /^( {0,3}##\s)(.*?)((?:\s+#+\s*)?)$/,
51
- replacement: '<span class="TMMark TMMark_TMH2">$1</span>$$2<span class="TMMark TMMark_TMH2">$3</span>'
52
- },
53
- TMH3: {
54
- regexp: /^( {0,3}###\s)(.*?)((?:\s+#+\s*)?)$/,
55
- replacement: '<span class="TMMark TMMark_TMH3">$1</span>$$2<span class="TMMark TMMark_TMH3">$3</span>'
56
- },
57
- TMH4: {
58
- regexp: /^( {0,3}####\s)(.*?)((?:\s+#+\s*)?)$/,
59
- replacement: '<span class="TMMark TMMark_TMH4">$1</span>$$2<span class="TMMark TMMark_TMH4">$3</span>'
60
- },
61
- TMH5: {
62
- regexp: /^( {0,3}#####\s)(.*?)((?:\s+#+\s*)?)$/,
63
- replacement: '<span class="TMMark TMMark_TMH5">$1</span>$$2<span class="TMMark TMMark_TMH5">$3</span>'
64
- },
65
- TMH6: {
66
- regexp: /^( {0,3}######\s)(.*?)((?:\s+#+\s*)?)$/,
67
- replacement: '<span class="TMMark TMMark_TMH6">$1</span>$$2<span class="TMMark TMMark_TMH6">$3</span>'
68
- },
69
- TMBlockquote: {
70
- regexp: /^( {0,3}>[ ]?)(.*)$/,
71
- replacement: '<span class="TMMark TMMark_TMBlockquote">$1</span>$$2'
72
- },
73
- TMCodeFenceBacktickOpen: {
74
- regexp: /^( {0,3}(?<seq>````*)\s*)([^`]*?)(\s*)$/,
75
- replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span><span class="TMInfoString">$3</span>$4'
76
- },
77
- TMCodeFenceTildeOpen: {
78
- regexp: /^( {0,3}(?<seq>~~~~*)\s*)(.*?)(\s*)$/,
79
- replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span><span class="TMInfoString">$3</span>$4'
80
- },
81
- TMCodeFenceBacktickClose: {
82
- regexp: /^( {0,3}(?<seq>````*))(\s*)$/,
83
- replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span>$3'
84
- },
85
- TMCodeFenceTildeClose: {
86
- regexp: /^( {0,3}(?<seq>~~~~*))(\s*)$/,
87
- replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span>$3'
88
- },
89
- TMBlankLine: {
90
- regexp: /^([ \t]*)$/,
91
- replacement: '$0'
92
- },
93
- TMSetextH1Marker: {
94
- regexp: /^ {0,3}=+\s*$/,
95
- replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>'
96
- },
97
- TMSetextH2Marker: {
98
- regexp: /^ {0,3}-+\s*$/,
99
- replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>'
100
- },
101
- TMHR: {
102
- regexp: /^( {0,3}(\*[ \t]*\*[ \t]*\*[ \t*]*)|(-[ \t]*-[ \t]*-[ \t-]*)|(_[ \t]*_[ \t]*_[ \t_]*))$/,
103
- replacement: '<span class="TMMark TMMark_TMHR">$0</span>'
104
- },
105
- TMUL: {
106
- regexp: /^( {0,3}[+*-] {1,4})(.*)$/,
107
- replacement: '<span class="TMMark TMMark_TMUL">$1</span>$$2'
108
- },
109
- TMOL: {
110
- regexp: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/,
111
- replacement: '<span class="TMMark TMMark_TMOL">$1</span>$$2'
112
- },
113
- // TODO: This is currently preventing sublists (and any content within list items, really) from working
114
- TMIndentedCode: {
115
- regexp: /^( {4}|\t)(.*)$/,
116
- replacement: '<span class="TMMark TMMark_TMIndentedCode">$1</span>$2'
117
- },
118
- TMLinkReferenceDefinition: {
119
- // TODO: Link destination can't include unbalanced parantheses, but we just ignore that here
120
- regexp: /^( {0,3}\[\s*)([^\s\]](?:[^\]]|\\\])*?)(\s*\]:\s*)((?:[^\s<>]+)|(?:<(?:[^<>\\]|\\.)*>))?(\s*)((?:\((?:[^()\\]|\\.)*\))|(?:"(?:[^"\\]|\\.)*")|(?:'(?:[^'\\]|\\.)*'))?(\s*)$/,
121
- replacement: '<span class="TMMark TMMark_TMLinkReferenceDefinition">$1</span><span class="TMLinkLabel TMLinkLabel_Definition">$2</span><span class="TMMark TMMark_TMLinkReferenceDefinition">$3</span><span class="TMLinkDestination">$4</span>$5<span class="TMLinkTitle">$6</span>$7',
122
- labelPlaceholder: 2 // this defines which placeholder in the above regex is the link "label"
123
- }
27
+ exports.lineGrammar = {
28
+ TMH1: {
29
+ regexp: /^( {0,3}#\s)(.*?)((?:\s+#+\s*)?)$/,
30
+ replacement: '<span class="TMMark TMMark_TMH1">$1</span>$$2<span class="TMMark TMMark_TMH1">$3</span>'
31
+ },
32
+ TMH2: {
33
+ regexp: /^( {0,3}##\s)(.*?)((?:\s+#+\s*)?)$/,
34
+ replacement: '<span class="TMMark TMMark_TMH2">$1</span>$$2<span class="TMMark TMMark_TMH2">$3</span>'
35
+ },
36
+ TMH3: {
37
+ regexp: /^( {0,3}###\s)(.*?)((?:\s+#+\s*)?)$/,
38
+ replacement: '<span class="TMMark TMMark_TMH3">$1</span>$$2<span class="TMMark TMMark_TMH3">$3</span>'
39
+ },
40
+ TMH4: {
41
+ regexp: /^( {0,3}####\s)(.*?)((?:\s+#+\s*)?)$/,
42
+ replacement: '<span class="TMMark TMMark_TMH4">$1</span>$$2<span class="TMMark TMMark_TMH4">$3</span>'
43
+ },
44
+ TMH5: {
45
+ regexp: /^( {0,3}#####\s)(.*?)((?:\s+#+\s*)?)$/,
46
+ replacement: '<span class="TMMark TMMark_TMH5">$1</span>$$2<span class="TMMark TMMark_TMH5">$3</span>'
47
+ },
48
+ TMH6: {
49
+ regexp: /^( {0,3}######\s)(.*?)((?:\s+#+\s*)?)$/,
50
+ replacement: '<span class="TMMark TMMark_TMH6">$1</span>$$2<span class="TMMark TMMark_TMH6">$3</span>'
51
+ },
52
+ TMBlockquote: {
53
+ regexp: /^( {0,3}>[ ]?)(.*)$/,
54
+ replacement: '<span class="TMMark TMMark_TMBlockquote">$1</span>$$2'
55
+ },
56
+ TMCodeFenceBacktickOpen: {
57
+ regexp: /^( {0,3}(?<seq>````*)\s*)([^`]*?)(\s*)$/,
58
+ replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span><span class="TMInfoString">$3</span>$4'
59
+ },
60
+ TMCodeFenceTildeOpen: {
61
+ regexp: /^( {0,3}(?<seq>~~~~*)\s*)(.*?)(\s*)$/,
62
+ replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span><span class="TMInfoString">$3</span>$4'
63
+ },
64
+ TMCodeFenceBacktickClose: {
65
+ regexp: /^( {0,3}(?<seq>````*))(\s*)$/,
66
+ replacement: '<span class="TMMark TMMark_TMCodeFenceBacktick">$1</span>$3'
67
+ },
68
+ TMCodeFenceTildeClose: {
69
+ regexp: /^( {0,3}(?<seq>~~~~*))(\s*)$/,
70
+ replacement: '<span class="TMMark TMMark_TMCodeFenceTilde">$1</span>$3'
71
+ },
72
+ TMBlankLine: {
73
+ regexp: /^([ \t]*)$/,
74
+ replacement: '$0'
75
+ },
76
+ TMSetextH1Marker: {
77
+ regexp: /^ {0,3}=+\s*$/,
78
+ replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>'
79
+ },
80
+ TMSetextH2Marker: {
81
+ regexp: /^ {0,3}-+\s*$/,
82
+ replacement: '<span class="TMMark TMMark_TMSetextH1Marker">$0</span>'
83
+ },
84
+ TMHR: {
85
+ regexp: /^( {0,3}(\*[ \t]*\*[ \t]*\*[ \t*]*)|(-[ \t]*-[ \t]*-[ \t-]*)|(_[ \t]*_[ \t]*_[ \t_]*))$/,
86
+ replacement: '<span class="TMMark TMMark_TMHR">$0</span>'
87
+ },
88
+ TMUL: {
89
+ regexp: /^( {0,3}[+*-] {1,4})(.*)$/,
90
+ replacement: '<span class="TMMark TMMark_TMUL">$1</span>$$2'
91
+ },
92
+ TMOL: {
93
+ regexp: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/,
94
+ replacement: '<span class="TMMark TMMark_TMOL">$1</span>$$2'
95
+ },
96
+ // TODO: This is currently preventing sublists (and any content within list items, really) from working
97
+ TMIndentedCode: {
98
+ regexp: /^( {4}|\t)(.*)$/,
99
+ replacement: '<span class="TMMark TMMark_TMIndentedCode">$1</span>$2'
100
+ },
101
+ TMLinkReferenceDefinition: {
102
+ // TODO: Link destination can't include unbalanced parantheses, but we just ignore that here
103
+ regexp: /^( {0,3}\[\s*)([^\s\]](?:[^\]]|\\\])*?)(\s*\]:\s*)((?:[^\s<>]+)|(?:<(?:[^<>\\]|\\.)*>))?(\s*)((?:\((?:[^()\\]|\\.)*\))|(?:"(?:[^"\\]|\\.)*")|(?:'(?:[^'\\]|\\.)*'))?(\s*)$/,
104
+ replacement: '<span class="TMMark TMMark_TMLinkReferenceDefinition">$1</span><span class="TMLinkLabel TMLinkLabel_Definition">$2</span><span class="TMMark TMMark_TMLinkReferenceDefinition">$3</span><span class="TMLinkDestination">$4</span>$5<span class="TMLinkTitle">$6</span>$7',
105
+ labelPlaceholder: 2, // this defines which placeholder in the above regex is the link "label"
106
+ },
124
107
  };
125
-
126
108
  /**
127
109
  * HTML blocks have multiple different classes of opener and closer. This array defines all the cases
128
110
  */
129
- var htmlBlockGrammar = exports.htmlBlockGrammar = [{
130
- start: /^ {0,3}<(?:script|pre|style)(?:\s|>|$)/i,
131
- end: /(?:<\/script>|<\/pre>|<\/style>)/i,
132
- paraInterrupt: true
133
- }, {
134
- start: /^ {0,3}<!--/,
135
- end: /-->/,
136
- paraInterrupt: true
137
- }, {
138
- start: /^ {0,3}<\?/,
139
- end: /\?>/,
140
- paraInterrupt: true
141
- }, {
142
- start: /^ {0,3}<![A-Z]/,
143
- end: />/,
144
- paraInterrupt: true
145
- }, {
146
- start: /^ {0,3}<!\[CDATA\[/,
147
- end: /\]\]>/,
148
- paraInterrupt: true
149
- }, {
150
- start: /^ {0,3}(?:<|<\/)(?:KnownTag)(?:\s|>|\/>|$)/i,
151
- end: false,
152
- paraInterrupt: true
153
- }, {
154
- start: /^ {0,3}(?:HTMLOpenTag|HTMLCloseTag)\s*$/,
155
- end: false,
156
- paraInterrupt: false
157
- }];
158
-
111
+ exports.htmlBlockGrammar = [
112
+ { start: /^ {0,3}<(?:script|pre|style)(?:\s|>|$)/i, end: /(?:<\/script>|<\/pre>|<\/style>)/i, paraInterrupt: true },
113
+ { start: /^ {0,3}<!--/, end: /-->/, paraInterrupt: true },
114
+ { start: /^ {0,3}<\?/, end: /\?>/, paraInterrupt: true },
115
+ { start: /^ {0,3}<![A-Z]/, end: />/, paraInterrupt: true },
116
+ { start: /^ {0,3}<!\[CDATA\[/, end: /\]\]>/, paraInterrupt: true },
117
+ { start: /^ {0,3}(?:<|<\/)(?:KnownTag)(?:\s|>|\/>|$)/i, end: false, paraInterrupt: true },
118
+ { start: /^ {0,3}(?:HTMLOpenTag|HTMLCloseTag)\s*$/, end: false, paraInterrupt: false },
119
+ ];
159
120
  /**
160
121
  * Structure of the object:
161
122
  * Top level entries are rules, each consisting of a regular expressions (in string format) as well as a replacement.
162
123
  * In the regular expressions, replacements from the object 'replacements' will be processed before compiling into the property regexp.
163
124
  */
164
- var inlineGrammar = exports.inlineGrammar = {
165
- escape: {
166
- regexp: /^\\(ASCIIPunctuation)/,
167
- replacement: '<span class="TMMark TMMark_TMEscape">\\</span>$1'
168
- },
169
- code: {
170
- regexp: /^(`+)((?:[^`])|(?:[^`].*?[^`]))(\1)/,
171
- replacement: '<span class="TMMark TMMark_TMCode">$1</span><code class="TMCode">$2</code><span class="TMMark TMMark_TMCode">$3</span>'
172
- },
173
- autolink: {
174
- regexp: /^<((?:Scheme:[^\s<>]*)|(?:Email))>/,
175
- replacement: '<span class="TMMark TMMark_TMAutolink">&lt;</span><span class="TMAutolink">$1</span><span class="TMMark TMMark_TMAutolink">&gt;</span>'
176
- },
177
- html: {
178
- regexp: /^((?:HTMLOpenTag)|(?:HTMLCloseTag)|(?:HTMLComment)|(?:HTMLPI)|(?:HTMLDeclaration)|(?:HTMLCDATA))/,
179
- replacement: '<span class="TMHTML">$1</span>'
180
- },
181
- linkOpen: {
182
- regexp: /^\[/,
183
- replacement: ''
184
- },
185
- imageOpen: {
186
- regexp: /^!\[/,
187
- replacement: ''
188
- },
189
- linkLabel: {
190
- regexp: /^(\[\s*)([^\]]*?)(\s*\])/,
191
- replacement: '',
192
- labelPlaceholder: 2
193
- },
194
- default: {
195
- regexp: /^(.|(?:NotTriggerChar+))/,
196
- replacement: '$1'
197
- }
125
+ exports.inlineGrammar = {
126
+ escape: {
127
+ regexp: /^\\(ASCIIPunctuation)/,
128
+ replacement: '<span class="TMMark TMMark_TMEscape">\\</span>$1'
129
+ },
130
+ code: {
131
+ regexp: /^(`+)((?:[^`])|(?:[^`].*?[^`]))(\1)/,
132
+ replacement: '<span class="TMMark TMMark_TMCode">$1</span><code class="TMCode">$2</code><span class="TMMark TMMark_TMCode">$3</span>'
133
+ },
134
+ autolink: {
135
+ regexp: /^<((?:Scheme:[^\s<>]*)|(?:Email))>/,
136
+ replacement: '<span class="TMMark TMMark_TMAutolink">&lt;</span><span class="TMAutolink">$1</span><span class="TMMark TMMark_TMAutolink">&gt;</span>'
137
+ },
138
+ html: {
139
+ regexp: /^((?:HTMLOpenTag)|(?:HTMLCloseTag)|(?:HTMLComment)|(?:HTMLPI)|(?:HTMLDeclaration)|(?:HTMLCDATA))/,
140
+ replacement: '<span class="TMHTML">$1</span>',
141
+ },
142
+ linkOpen: {
143
+ regexp: /^\[/,
144
+ replacement: ''
145
+ },
146
+ imageOpen: {
147
+ regexp: /^!\[/,
148
+ replacement: ''
149
+ },
150
+ linkLabel: {
151
+ regexp: /^(\[\s*)([^\]]*?)(\s*\])/,
152
+ replacement: '',
153
+ labelPlaceholder: 2
154
+ },
155
+ default: {
156
+ regexp: /^(.|(?:NotTriggerChar+))/,
157
+ replacement: '$1'
158
+ }
198
159
  };
199
-
200
160
  // Process replacements in regexps
201
161
  const replacementRegexp = new RegExp(Object.keys(replacements).join('|'));
202
-
203
162
  // Inline
204
- const inlineRules = [...Object.keys(inlineGrammar)];
163
+ const inlineRules = [...Object.keys(exports.inlineGrammar)];
205
164
  for (let rule of inlineRules) {
206
- let re = inlineGrammar[rule].regexp.source;
207
- // Replace while there is something to replace. This means it also works over multiple levels (replacements containing replacements)
208
- while (re.match(replacementRegexp)) {
209
- re = re.replace(replacementRegexp, string => {
210
- return replacements[string].source;
211
- });
212
- }
213
- inlineGrammar[rule].regexp = new RegExp(re, inlineGrammar[rule].regexp.flags);
165
+ let re = exports.inlineGrammar[rule].regexp.source;
166
+ // Replace while there is something to replace. This means it also works over multiple levels (replacements containing replacements)
167
+ while (re.match(replacementRegexp)) {
168
+ re = re.replace(replacementRegexp, (string) => { return replacements[string].source; });
169
+ }
170
+ exports.inlineGrammar[rule].regexp = new RegExp(re, exports.inlineGrammar[rule].regexp.flags);
214
171
  }
215
-
216
172
  // HTML Block (only opening rule is processed currently)
217
- for (let rule of htmlBlockGrammar) {
218
- let re = rule.start.source;
219
- // Replace while there is something to replace. This means it also works over multiple levels (replacements containing replacements)
220
- while (re.match(replacementRegexp)) {
221
- re = re.replace(replacementRegexp, string => {
222
- return replacements[string].source;
223
- });
224
- }
225
- rule.start = new RegExp(re, rule.start.flags);
173
+ for (let rule of exports.htmlBlockGrammar) {
174
+ let re = rule.start.source;
175
+ // Replace while there is something to replace. This means it also works over multiple levels (replacements containing replacements)
176
+ while (re.match(replacementRegexp)) {
177
+ re = re.replace(replacementRegexp, (string) => { return replacements[string].source; });
178
+ }
179
+ rule.start = new RegExp(re, rule.start.flags);
226
180
  }
227
-
228
181
  /**
229
182
  * Escapes HTML special characters (<, >, and &) in the string.
230
183
  * @param {string} string The raw string to be escaped
231
184
  * @returns {string} The string, ready to be used in HTML
232
185
  */
233
186
  function htmlescape(string) {
234
- return (string ? string : '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
187
+ return (string ? string : '')
188
+ .replace(/&/g, '&amp;')
189
+ .replace(/</g, '&lt;')
190
+ .replace(/>/g, '&gt;');
235
191
  }
236
192
  /**
237
193
  * Contains the commands that can be sent to the editor. Contains objects with a name representing the name of the command.
238
194
  * Each of the objects contains the following keys:
239
- *
195
+ *
240
196
  * - type: Can be either inline (for inline formatting) or line (for block / line formatting).
241
- * - className: Used to determine whether the command is active at a given position.
197
+ * - className: Used to determine whether the command is active at a given position.
242
198
  * For line formatting, this looks at the class of the line element. For inline elements, tries to find an enclosing element with that class.
243
- * - set / unset: Contain instructions how to set and unset the command. For line type commands, both consist of a pattern and replacement that
199
+ * - set / unset: Contain instructions how to set and unset the command. For line type commands, both consist of a pattern and replacement that
244
200
  * will be applied to each line (using String.replace). For inline type commands, the set object contains a pre and post string which will
245
- * be inserted before and after the selection. The unset object contains a prePattern and a postPattern. Both should be regular expressions and
201
+ * be inserted before and after the selection. The unset object contains a prePattern and a postPattern. Both should be regular expressions and
246
202
  * they will be applied to the portion of the line before and after the selection (using String.replace, with an empty replacement string).
247
203
  */
248
- const commands = exports.commands = {
249
- // Replacements for unset for inline commands are '' by default
250
- bold: {
251
- type: 'inline',
252
- className: 'TMStrong',
253
- set: {
254
- pre: '**',
255
- post: '**'
256
- },
257
- unset: {
258
- prePattern: /(?:\*\*|__)$/,
259
- postPattern: /^(?:\*\*|__)/
260
- }
261
- },
262
- italic: {
263
- type: 'inline',
264
- className: 'TMEm',
265
- set: {
266
- pre: '*',
267
- post: '*'
268
- },
269
- unset: {
270
- prePattern: /(?:\*|_)$/,
271
- postPattern: /^(?:\*|_)/
272
- }
273
- },
274
- code: {
275
- type: 'inline',
276
- className: 'TMCode',
277
- set: {
278
- pre: '`',
279
- post: '`'
280
- },
281
- unset: {
282
- prePattern: /`+$/,
283
- postPattern: /^`+/
284
- } // FIXME this doesn't ensure balanced backticks right now
285
- },
286
- strikethrough: {
287
- type: 'inline',
288
- className: 'TMStrikethrough',
289
- set: {
290
- pre: '~~',
291
- post: '~~'
292
- },
293
- unset: {
294
- prePattern: /~~$/,
295
- postPattern: /^~~/
296
- }
297
- },
298
- h1: {
299
- type: 'line',
300
- className: 'TMH1',
301
- set: {
302
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
303
- replacement: '# $2'
304
- },
305
- unset: {
306
- pattern: /^( {0,3}#\s+)(.*?)((?:\s+#+\s*)?)$/,
307
- replacement: '$2'
308
- }
309
- },
310
- h2: {
311
- type: 'line',
312
- className: 'TMH2',
313
- set: {
314
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
315
- replacement: '## $2'
316
- },
317
- unset: {
318
- pattern: /^( {0,3}##\s+)(.*?)((?:\s+#+\s*)?)$/,
319
- replacement: '$2'
320
- }
321
- },
322
- h3: {
323
- type: 'line',
324
- className: 'TMH3',
325
- set: {
326
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
327
- replacement: '### $2'
328
- },
329
- unset: {
330
- pattern: /^( {0,3}###\s+)(.*?)((?:\s+#+\s*)?)$/,
331
- replacement: '$2'
332
- }
333
- },
334
- h4: {
335
- type: 'line',
336
- className: 'TMH4',
337
- set: {
338
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
339
- replacement: '#### $2'
340
- },
341
- unset: {
342
- pattern: /^( {0,3}####\s+)(.*?)((?:\s+#+\s*)?)$/,
343
- replacement: '$2'
344
- }
345
- },
346
- h5: {
347
- type: 'line',
348
- className: 'TMH5',
349
- set: {
350
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
351
- replacement: '##### $2'
352
- },
353
- unset: {
354
- pattern: /^( {0,3}#####\s+)(.*?)((?:\s+#+\s*)?)$/,
355
- replacement: '$2'
356
- }
357
- },
358
- h6: {
359
- type: 'line',
360
- className: 'TMH6',
361
- set: {
362
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
363
- replacement: '###### $2'
364
- },
365
- unset: {
366
- pattern: /^( {0,3}######\s+)(.*?)((?:\s+#+\s*)?)$/,
367
- replacement: '$2'
368
- }
369
- },
370
- ul: {
371
- type: 'line',
372
- className: 'TMUL',
373
- set: {
374
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
375
- replacement: '- $2'
376
- },
377
- unset: {
378
- pattern: /^( {0,3}[+*-] {1,4})(.*)$/,
379
- replacement: '$2'
380
- }
381
- },
382
- ol: {
383
- type: 'line',
384
- className: 'TMOL',
385
- set: {
386
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
387
- replacement: '$#. $2'
388
- },
389
- unset: {
390
- pattern: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/,
391
- replacement: '$2'
392
- }
393
- },
394
- blockquote: {
395
- type: 'line',
396
- className: 'TMBlockquote',
397
- set: {
398
- pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/,
399
- replacement: '> $2'
400
- },
401
- unset: {
402
- pattern: /^( {0,3}>[ ]?)(.*)$/,
403
- replacement: '$2'
404
- }
405
- }
406
- };
204
+ exports.commands = {
205
+ // Replacements for unset for inline commands are '' by default
206
+ bold: {
207
+ type: 'inline',
208
+ className: 'TMStrong',
209
+ set: { pre: '**', post: '**' },
210
+ unset: { prePattern: /(?:\*\*|__)$/, postPattern: /^(?:\*\*|__)/ }
211
+ },
212
+ italic: {
213
+ type: 'inline',
214
+ className: 'TMEm',
215
+ set: { pre: '*', post: '*' },
216
+ unset: { prePattern: /(?:\*|_)$/, postPattern: /^(?:\*|_)/ }
217
+ },
218
+ code: {
219
+ type: 'inline',
220
+ className: 'TMCode',
221
+ set: { pre: '`', post: '`' },
222
+ unset: { prePattern: /`+$/, postPattern: /^`+/ } // FIXME this doesn't ensure balanced backticks right now
223
+ },
224
+ strikethrough: {
225
+ type: 'inline',
226
+ className: 'TMStrikethrough',
227
+ set: { pre: '~~', post: '~~' },
228
+ unset: { prePattern: /~~$/, postPattern: /^~~/ }
229
+ },
230
+ h1: {
231
+ type: 'line',
232
+ className: 'TMH1',
233
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '# $2' },
234
+ unset: { pattern: /^( {0,3}#\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
235
+ },
236
+ h2: {
237
+ type: 'line',
238
+ className: 'TMH2',
239
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '## $2' },
240
+ unset: { pattern: /^( {0,3}##\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
241
+ },
242
+ h3: {
243
+ type: 'line',
244
+ className: 'TMH3',
245
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '### $2' },
246
+ unset: { pattern: /^( {0,3}###\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
247
+ },
248
+ h4: {
249
+ type: 'line',
250
+ className: 'TMH4',
251
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '#### $2' },
252
+ unset: { pattern: /^( {0,3}####\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
253
+ },
254
+ h5: {
255
+ type: 'line',
256
+ className: 'TMH5',
257
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '##### $2' },
258
+ unset: { pattern: /^( {0,3}#####\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
259
+ },
260
+ h6: {
261
+ type: 'line',
262
+ className: 'TMH6',
263
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '###### $2' },
264
+ unset: { pattern: /^( {0,3}######\s+)(.*?)((?:\s+#+\s*)?)$/, replacement: '$2' }
265
+ },
266
+ ul: {
267
+ type: 'line',
268
+ className: 'TMUL',
269
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '- $2' },
270
+ unset: { pattern: /^( {0,3}[+*-] {1,4})(.*)$/, replacement: '$2' }
271
+ },
272
+ ol: {
273
+ type: 'line',
274
+ className: 'TMOL',
275
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '$#. $2' },
276
+ unset: { pattern: /^( {0,3}\d{1,9}[.)] {1,4})(.*)$/, replacement: '$2' }
277
+ },
278
+ blockquote: {
279
+ type: 'line',
280
+ className: 'TMBlockquote',
281
+ set: { pattern: /^( {0,3}(?:(?:#+|[0-9]{1,9}[).]|[>\-*+])\s+)?)(.*)$/, replacement: '> $2' },
282
+ unset: { pattern: /^( {0,3}>[ ]?)(.*)$/, replacement: '$2' }
283
+ },
284
+ };