securemark 0.276.5 → 0.277.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +12 -12
  3. package/design.md +4 -0
  4. package/dist/index.js +72 -37
  5. package/markdown.d.ts +25 -8
  6. package/package.json +1 -1
  7. package/src/parser/api/parse.test.ts +2 -2
  8. package/src/parser/block/dlist.test.ts +1 -1
  9. package/src/parser/block/extension/fig.test.ts +1 -1
  10. package/src/parser/block/heading.test.ts +2 -2
  11. package/src/parser/block/paragraph.test.ts +12 -9
  12. package/src/parser/inline/autolink/email.test.ts +0 -3
  13. package/src/parser/inline/autolink/hashnum.test.ts +4 -4
  14. package/src/parser/inline/autolink/hashnum.ts +1 -1
  15. package/src/parser/inline/autolink/hashtag.test.ts +8 -7
  16. package/src/parser/inline/autolink/hashtag.ts +2 -2
  17. package/src/parser/inline/autolink.ts +5 -12
  18. package/src/parser/inline/deletion.test.ts +2 -2
  19. package/src/parser/inline/emphasis.test.ts +35 -26
  20. package/src/parser/inline/emphasis.ts +11 -4
  21. package/src/parser/inline/emstrong.ts +62 -0
  22. package/src/parser/inline/extension/index.test.ts +6 -6
  23. package/src/parser/inline/extension/indexee.ts +4 -4
  24. package/src/parser/inline/extension/placeholder.test.ts +4 -4
  25. package/src/parser/inline/insertion.test.ts +2 -2
  26. package/src/parser/inline/link.test.ts +1 -1
  27. package/src/parser/inline/mark.test.ts +1 -1
  28. package/src/parser/inline/{comment.test.ts → remark.test.ts} +26 -26
  29. package/src/parser/inline/{comment.ts → remark.ts} +3 -3
  30. package/src/parser/inline/strong.test.ts +32 -25
  31. package/src/parser/inline/strong.ts +8 -4
  32. package/src/parser/inline.test.ts +102 -22
  33. package/src/parser/inline.ts +6 -3
  34. package/src/parser/source/text.test.ts +0 -1
  35. package/src/parser/source/text.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.277.0
4
+
5
+ - Revert emphasis syntax and strong syntax.
6
+ - Rename comment syntax to remark syntax.
7
+
3
8
  ## 0.276.5
4
9
 
5
10
  - Refactoring.
package/README.md CHANGED
@@ -47,7 +47,7 @@ Secure markdown renderer working on browsers for user input data.
47
47
  - Blockquote (>, !>)
48
48
  - Preformattedtext (```)
49
49
  - Pagebreak (===)
50
- - Inline markups (_, *, `, []{}, {}, ![]{}, !{}, \[](), ++, ~~, (()), ...)
50
+ - Inline markups (*, **, `, []{}, {}, ![]{}, !{}, \[](), ++, ~~, (()), ...)
51
51
  - Inline HTML tags (\<bdi>, \<bdo>)
52
52
  - Autolink (https://host, user@host, @user)
53
53
  - Shortmedia (!https://host/image.png, !https://youtu.be/...)
@@ -61,20 +61,20 @@ Secure markdown renderer working on browsers for user input data.
61
61
  - Channel (@user#tag)
62
62
  - Hashtag (#tag)
63
63
  - Template ({{ template }})
64
- - Comment ([% comment %])
64
+ - Remark ([% remark %])
65
65
 
66
66
  ## Operator precedence
67
67
 
68
- |P| Operators |
69
- |-|------------------|
70
- |9| \n, \\\n |
71
- |8| ` |
72
- |6| (()), [[]], ${}$ |
73
- |5| \<tag>\</tag> |
74
- |4| [% %] |
75
- |3| $, " |
76
- |2| (), [], {} |
77
- |1| _, *, ==, ++, ~~ |
68
+ |P| Operators |
69
+ |-|-------------------|
70
+ |9| \n, \\\n |
71
+ |8| ` |
72
+ |6| (()), [[]], ${}$ |
73
+ |5| \<tag>\</tag> |
74
+ |4| [% %] |
75
+ |3| $, " |
76
+ |2| (), [], {} |
77
+ |1| *, **, ==, ++, ~~ |
78
78
 
79
79
  ## Dependencies
80
80
 
package/design.md CHANGED
@@ -333,3 +333,7 @@ Data URIは保存および転送容量削減ならびにユーザーおよび管
333
333
  - \<small>: 法的表記を縮小表示すべきでないため削除。
334
334
  - \<sub>: \<small>の代わりに使用されないよう削除。他の構文との相性も悪い。
335
335
  - \<sup>: 同上。
336
+
337
+ ### _ emphasis
338
+
339
+ オートリンクと単語検索と非常に相性が悪いため不採用。
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.276.5 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.277.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
2
2
  (function webpackUniversalModuleDefinition(root, factory) {
3
3
  if(typeof exports === 'object' && typeof module === 'object')
4
4
  module.exports = factory(require("Prism"), require("DOMPurify"));
@@ -5761,7 +5761,7 @@ const combinator_1 = __webpack_require__(2087);
5761
5761
  const annotation_1 = __webpack_require__(2736);
5762
5762
  const reference_1 = __webpack_require__(3555);
5763
5763
  const template_1 = __webpack_require__(4695);
5764
- const comment_1 = __webpack_require__(8657);
5764
+ const remark_1 = __webpack_require__(3217);
5765
5765
  const math_1 = __webpack_require__(8946);
5766
5766
  const extension_1 = __webpack_require__(8053);
5767
5767
  const ruby_1 = __webpack_require__(6705);
@@ -5770,6 +5770,7 @@ const html_1 = __webpack_require__(5994);
5770
5770
  const insertion_1 = __webpack_require__(2945);
5771
5771
  const deletion_1 = __webpack_require__(7501);
5772
5772
  const mark_1 = __webpack_require__(2480);
5773
+ const emstrong_1 = __webpack_require__(6132);
5773
5774
  const emphasis_1 = __webpack_require__(3867);
5774
5775
  const strong_1 = __webpack_require__(6578);
5775
5776
  const code_1 = __webpack_require__(5771);
@@ -5779,7 +5780,7 @@ const shortmedia_1 = __webpack_require__(4189);
5779
5780
  const autolink_1 = __webpack_require__(6051);
5780
5781
  const bracket_1 = __webpack_require__(5196);
5781
5782
  const source_1 = __webpack_require__(6743);
5782
- exports.inline = (0, combinator_1.lazy)(() => (0, combinator_1.union)([annotation_1.annotation, reference_1.reference, template_1.template, comment_1.comment, math_1.math, extension_1.extension, ruby_1.ruby, link_1.textlink, link_1.linemedialink, media_1.linemedia, html_1.html, insertion_1.insertion, deletion_1.deletion, mark_1.mark, strong_1.strong, emphasis_1.emphasis, code_1.code, htmlentity_1.htmlentity, shortmedia_1.lineshortmedia, autolink_1.autolink, bracket_1.bracket, source_1.text]));
5783
+ exports.inline = (0, combinator_1.lazy)(() => (0, combinator_1.union)([annotation_1.annotation, reference_1.reference, template_1.template, remark_1.remark, math_1.math, extension_1.extension, ruby_1.ruby, link_1.textlink, link_1.linemedialink, media_1.linemedia, html_1.html, insertion_1.insertion, deletion_1.deletion, mark_1.mark, emstrong_1.emstrong, strong_1.strong, emphasis_1.emphasis, code_1.code, htmlentity_1.htmlentity, shortmedia_1.lineshortmedia, autolink_1.autolink, bracket_1.bracket, source_1.text]));
5783
5784
  var indexee_1 = __webpack_require__(1269);
5784
5785
  Object.defineProperty(exports, "indexee", ({
5785
5786
  enumerable: true,
@@ -5851,22 +5852,15 @@ const hashnum_1 = __webpack_require__(5631);
5851
5852
  const anchor_1 = __webpack_require__(6495);
5852
5853
  const source_1 = __webpack_require__(6743);
5853
5854
  const util_1 = __webpack_require__(9437);
5854
- exports.autolink = (0, combinator_1.lazy)(() => (0, combinator_1.validate)(/^(?:[@#>0-9a-z\r\n]|\S[#>])/i, (0, combinator_1.constraint)(2 /* State.autolink */, false, (0, combinator_1.syntax)(2 /* Syntax.autolink */, 1, 1, ~1 /* State.shortcut */, (0, combinator_1.union)([(0, combinator_1.some)((0, combinator_1.union)([url_1.lineurl])), (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.union)([url_1.url, email_1.email,
5855
+ exports.autolink = (0, combinator_1.lazy)(() => (0, combinator_1.validate)(/^(?:[@#>0-9a-z\r\n]|\S[#>])/iu, (0, combinator_1.constraint)(2 /* State.autolink */, false, (0, combinator_1.syntax)(2 /* Syntax.autolink */, 1, 1, ~1 /* State.shortcut */, (0, combinator_1.union)([(0, combinator_1.some)((0, combinator_1.union)([url_1.lineurl])), (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.union)([url_1.url, email_1.email,
5855
5856
  // Escape unmatched email-like strings.
5856
- (0, combinator_1.focus)(/^[0-9a-z](?:[_.+-](?=[0-9a-z])|[0-9a-z])*(?:@(?:[0-9a-z]+(?:[.-][0-9a-z]+)*)?)*/i, ({
5857
- source
5858
- }) => {
5859
- if (source.length > 255 || source.includes('@')) return [[source], ''];
5860
- const i = source.indexOf('_');
5861
- if (i === -1) return [[source], ''];
5862
- return [[source.slice(0, i)], source.slice(i)];
5863
- }), channel_1.channel, account_1.account,
5857
+ (0, source_1.str)(/^[0-9a-z]+(?:[_.+-][0-9a-z]+)*(?:@(?:[0-9a-z]+(?:[.-][0-9a-z]+)*)?)*/i), channel_1.channel, account_1.account,
5864
5858
  // Escape unmatched account-like strings.
5865
5859
  (0, source_1.str)(/^@+[0-9a-z]*(?:-[0-9a-z]+)*/i),
5866
5860
  // Escape invalid leading characters.
5867
- (0, source_1.str)(new RegExp(/^(?:[^\p{C}\p{S}\p{P}\s]|emoji)(?=#)/u.source.replace('emoji', hashtag_1.emoji), 'u')), hashtag_1.hashtag, hashnum_1.hashnum,
5861
+ (0, source_1.str)(new RegExp(/^(?:[^\p{C}\p{S}\p{P}\s]|emoji|['_])(?=#)/u.source.replace('emoji', hashtag_1.emoji), 'u')), hashtag_1.hashtag, hashnum_1.hashnum,
5868
5862
  // Escape unmatched hashtag-like strings.
5869
- (0, source_1.str)(new RegExp(/^#+(?:[^\p{C}\p{S}\p{P}\s]|emoji|')*/u.source.replace('emoji', hashtag_1.emoji), 'u')),
5863
+ (0, source_1.str)(new RegExp(/^#+(?:[^\p{C}\p{S}\p{P}\s]|emoji|['_])*/u.source.replace('emoji', hashtag_1.emoji), 'u')),
5870
5864
  // Escape invalid leading characters.
5871
5865
  (0, source_1.str)(/^[0-9\p{Sc}](?=>)/u), anchor_1.anchor])), ns => ns.length === 1 ? ns : [(0, util_1.stringify)(ns)])])))));
5872
5866
 
@@ -5985,7 +5979,7 @@ const link_1 = __webpack_require__(9628);
5985
5979
  const hashtag_1 = __webpack_require__(5491);
5986
5980
  const source_1 = __webpack_require__(6743);
5987
5981
  const dom_1 = __webpack_require__(3252);
5988
- exports.hashnum = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.constraint)(1 /* State.shortcut */, false, (0, combinator_1.open)('#', (0, source_1.str)(new RegExp(/^[0-9]{1,16}(?![^\p{C}\p{S}\p{P}\s]|emoji|')/u.source.replace(/emoji/, hashtag_1.emoji), 'u')))), (0, combinator_1.convert)(source => `[${source}]{ ${source.slice(1)} }`, (0, combinator_1.union)([link_1.unsafelink]))), ([el]) => [(0, dom_1.define)(el, {
5982
+ exports.hashnum = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.constraint)(1 /* State.shortcut */, false, (0, combinator_1.open)('#', (0, source_1.str)(new RegExp(/^[0-9]{1,9}(?![^\p{C}\p{S}\p{P}\s]|emoji|['_])/u.source.replace(/emoji/, hashtag_1.emoji), 'u')))), (0, combinator_1.convert)(source => `[${source}]{ ${source.slice(1)} }`, (0, combinator_1.union)([link_1.unsafelink]))), ([el]) => [(0, dom_1.define)(el, {
5989
5983
  class: 'hashnum',
5990
5984
  href: null
5991
5985
  })]));
@@ -6009,7 +6003,7 @@ const dom_1 = __webpack_require__(3252);
6009
6003
  // https://example/hashtags/a must be a hashtag page or a redirect page going there.
6010
6004
  // https://github.com/tc39/proposal-regexp-unicode-property-escapes#matching-emoji
6011
6005
  exports.emoji = String.raw`\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F`;
6012
- exports.hashtag = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.constraint)(1 /* State.shortcut */, false, (0, combinator_1.open)('#', (0, source_1.str)(new RegExp([/^(?=(?:[0-9]{1,15})?(?:[^\d\p{C}\p{S}\p{P}\s]|emoji|'))/u.source, /(?:[^\p{C}\p{S}\p{P}\s]|emoji|(?<!')'|_(?=[^\p{C}\p{S}\p{P}\s]|emoji|'))+/u.source].join('').replace(/emoji/g, exports.emoji), 'u')))), (0, combinator_1.convert)(source => `[${source}]{ ${`/hashtags/${source.slice(1)}`} }`, (0, combinator_1.union)([link_1.unsafelink]))), ([el]) => [(0, dom_1.define)(el, {
6006
+ exports.hashtag = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.constraint)(1 /* State.shortcut */, false, (0, combinator_1.open)('#', (0, source_1.str)(new RegExp([/^(?!['_])(?=(?:[0-9]{1,9})?(?:[^\d\p{C}\p{S}\p{P}\s]|emoji|'|_(?=[^\p{C}\p{S}\p{P}\s]|emoji|')))/u.source, /(?:[^\p{C}\p{S}\p{P}\s]|emoji|'|_(?=[^\p{C}\p{S}\p{P}\s]|emoji|'))+/u.source].join('').replace(/emoji/g, exports.emoji), 'u')))), (0, combinator_1.convert)(source => `[${source}]{ ${`/hashtags/${source.slice(1)}`} }`, (0, combinator_1.union)([link_1.unsafelink]))), ([el]) => [(0, dom_1.define)(el, {
6013
6007
  class: 'hashtag'
6014
6008
  })]));
6015
6009
 
@@ -6084,7 +6078,7 @@ function format(text) {
6084
6078
 
6085
6079
  /***/ }),
6086
6080
 
6087
- /***/ 8657:
6081
+ /***/ 7501:
6088
6082
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6089
6083
 
6090
6084
  "use strict";
@@ -6093,22 +6087,18 @@ function format(text) {
6093
6087
  Object.defineProperty(exports, "__esModule", ({
6094
6088
  value: true
6095
6089
  }));
6096
- exports.comment = void 0;
6090
+ exports.deletion = void 0;
6097
6091
  const combinator_1 = __webpack_require__(2087);
6098
6092
  const inline_1 = __webpack_require__(1160);
6099
6093
  const source_1 = __webpack_require__(6743);
6100
- const memoize_1 = __webpack_require__(1808);
6094
+ const visibility_1 = __webpack_require__(7618);
6101
6095
  const array_1 = __webpack_require__(8112);
6102
6096
  const dom_1 = __webpack_require__(3252);
6103
- exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('[%', (0, combinator_1.syntax)(0 /* Syntax.none */, 4, 1, 0 /* State.none */, (0, combinator_1.match)(/^\[(%+)\s/, (0, memoize_1.memoize)(([, fence]) => (0, combinator_1.surround)((0, combinator_1.open)((0, source_1.str)(`[${fence}`), (0, combinator_1.some)(source_1.text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true), (0, combinator_1.some)((0, combinator_1.union)([inline_1.inline]), new RegExp(String.raw`^\s+${fence}\]`), [[new RegExp(String.raw`^\s+${fence}\]`), 4]]), (0, combinator_1.close)((0, combinator_1.some)(source_1.text, /^\S/), (0, source_1.str)(`${fence}]`)), true, ([as, bs = [], cs], rest) => [[(0, dom_1.html)('span', {
6104
- class: 'comment'
6105
- }, [(0, dom_1.html)('input', {
6106
- type: 'checkbox'
6107
- }), (0, dom_1.html)('span', (0, dom_1.defrag)((0, array_1.push)((0, array_1.unshift)(as, bs), cs)))])], rest], ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest]), ([, fence]) => fence.length, [])))));
6097
+ exports.deletion = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('~~', '~'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('\n', '~~')), (0, combinator_1.open)('\n', (0, combinator_1.some)(inline_1.inline, '~'), true)]))), (0, source_1.str)('~~'), false, ([, bs], rest) => [[(0, dom_1.html)('del', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6108
6098
 
6109
6099
  /***/ }),
6110
6100
 
6111
- /***/ 7501:
6101
+ /***/ 3867:
6112
6102
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6113
6103
 
6114
6104
  "use strict";
@@ -6117,18 +6107,20 @@ exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('[%',
6117
6107
  Object.defineProperty(exports, "__esModule", ({
6118
6108
  value: true
6119
6109
  }));
6120
- exports.deletion = void 0;
6110
+ exports.emphasis = void 0;
6121
6111
  const combinator_1 = __webpack_require__(2087);
6122
6112
  const inline_1 = __webpack_require__(1160);
6113
+ const emstrong_1 = __webpack_require__(6132);
6114
+ const strong_1 = __webpack_require__(6578);
6123
6115
  const source_1 = __webpack_require__(6743);
6124
6116
  const visibility_1 = __webpack_require__(7618);
6125
6117
  const array_1 = __webpack_require__(8112);
6126
6118
  const dom_1 = __webpack_require__(3252);
6127
- exports.deletion = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('~~', '~'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('\n', '~~')), (0, combinator_1.open)('\n', (0, combinator_1.some)(inline_1.inline, '~'), true)]))), (0, source_1.str)('~~'), false, ([, bs], rest) => [[(0, dom_1.html)('del', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6119
+ exports.emphasis = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('*', '*'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([strong_1.strong, (0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('*'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), (0, combinator_1.union)([emstrong_1.emstrong, strong_1.strong, exports.emphasis]))])))), (0, source_1.str)('*'), false, ([, bs], rest) => [[(0, dom_1.html)('em', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6128
6120
 
6129
6121
  /***/ }),
6130
6122
 
6131
- /***/ 3867:
6123
+ /***/ 6132:
6132
6124
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6133
6125
 
6134
6126
  "use strict";
@@ -6137,14 +6129,33 @@ exports.deletion = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, s
6137
6129
  Object.defineProperty(exports, "__esModule", ({
6138
6130
  value: true
6139
6131
  }));
6140
- exports.emphasis = void 0;
6132
+ exports.emstrong = void 0;
6141
6133
  const combinator_1 = __webpack_require__(2087);
6142
6134
  const inline_1 = __webpack_require__(1160);
6135
+ const strong_1 = __webpack_require__(6578);
6136
+ const emphasis_1 = __webpack_require__(3867);
6143
6137
  const source_1 = __webpack_require__(6743);
6144
6138
  const visibility_1 = __webpack_require__(7618);
6145
- const array_1 = __webpack_require__(8112);
6146
6139
  const dom_1 = __webpack_require__(3252);
6147
- exports.emphasis = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('_', '_'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('_'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '_', [[/^\\?\n/, 9]]), exports.emphasis)])))), (0, source_1.str)('_'), false, ([, bs], rest) => [[(0, dom_1.html)('em', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6140
+ const array_1 = __webpack_require__(8112);
6141
+ const substrong = (0, combinator_1.lazy)(() => (0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('**'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), (0, combinator_1.union)([exports.emstrong, strong_1.strong]))])));
6142
+ const subemphasis = (0, combinator_1.lazy)(() => (0, combinator_1.some)((0, combinator_1.union)([strong_1.strong, (0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('*'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), (0, combinator_1.union)([exports.emstrong, strong_1.strong, emphasis_1.emphasis]))])));
6143
+ exports.emstrong = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('***'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('*'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), inline_1.inline)])))), (0, source_1.str)(/^\*{1,3}/), false, ([, bs, cs], rest, context) => {
6144
+ switch (cs[0]) {
6145
+ case '***':
6146
+ return [[(0, dom_1.html)('em', [(0, dom_1.html)('strong', (0, dom_1.defrag)(bs))])], rest];
6147
+ case '**':
6148
+ return (0, combinator_1.bind)(subemphasis, (ds, rest) => rest.slice(0, 1) === '*' ? [[(0, dom_1.html)('em', (0, array_1.unshift)([(0, dom_1.html)('strong', (0, dom_1.defrag)(bs))], (0, dom_1.defrag)(ds)))], rest.slice(1)] : [(0, array_1.unshift)(['*', (0, dom_1.html)('strong', (0, dom_1.defrag)(bs))], ds), rest])({
6149
+ source: rest,
6150
+ context
6151
+ }) ?? [['*', (0, dom_1.html)('strong', (0, dom_1.defrag)(bs))], rest];
6152
+ case '*':
6153
+ return (0, combinator_1.bind)(substrong, (ds, rest) => rest.slice(0, 2) === '**' ? [[(0, dom_1.html)('strong', (0, array_1.unshift)([(0, dom_1.html)('em', (0, dom_1.defrag)(bs))], (0, dom_1.defrag)(ds)))], rest.slice(2)] : [(0, array_1.unshift)(['**', (0, dom_1.html)('em', (0, dom_1.defrag)(bs))], ds), rest])({
6154
+ source: rest,
6155
+ context
6156
+ }) ?? [['**', (0, dom_1.html)('em', (0, dom_1.defrag)(bs))], rest];
6157
+ }
6158
+ }, ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6148
6159
 
6149
6160
  /***/ }),
6150
6161
 
@@ -6242,7 +6253,7 @@ function index(source, optional = false) {
6242
6253
  exports.index = index;
6243
6254
  function signature(source) {
6244
6255
  const target = source.cloneNode(true);
6245
- for (let es = target.querySelectorAll('code[data-src], .math[data-src], .label[data-label], .comment, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'), len = es.length, i = 0; i < len; ++i) {
6256
+ for (let es = target.querySelectorAll('code[data-src], .math[data-src], .label[data-label], .remark, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'), len = es.length, i = 0; i < len; ++i) {
6246
6257
  const el = es[i];
6247
6258
  switch (el.tagName) {
6248
6259
  case 'CODE':
@@ -6263,7 +6274,7 @@ function signature(source) {
6263
6274
  case 'label':
6264
6275
  el.replaceWith(`[$${el.getAttribute('data-label').replace('$', '')}]`);
6265
6276
  continue;
6266
- case 'comment':
6277
+ case 'remark':
6267
6278
  case 'checkbox':
6268
6279
  case 'annotation':
6269
6280
  case 'reference':
@@ -6276,7 +6287,7 @@ function signature(source) {
6276
6287
  exports.signature = signature;
6277
6288
  exports.text = (0, memoize_1.reduce)(source => {
6278
6289
  const target = source.cloneNode(true);
6279
- for (let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'), len = es.length, i = 0; i < len; ++i) {
6290
+ for (let es = target.querySelectorAll('code[data-src], .math[data-src], .remark, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'), len = es.length, i = 0; i < len; ++i) {
6280
6291
  const el = es[i];
6281
6292
  switch (el.tagName) {
6282
6293
  case 'CODE':
@@ -6294,7 +6305,7 @@ exports.text = (0, memoize_1.reduce)(source => {
6294
6305
  case 'math':
6295
6306
  el.replaceWith(el.getAttribute('data-src'));
6296
6307
  continue;
6297
- case 'comment':
6308
+ case 'remark':
6298
6309
  case 'checkbox':
6299
6310
  case 'annotation':
6300
6311
  case 'reference':
@@ -6826,6 +6837,30 @@ function attributes(ns) {
6826
6837
 
6827
6838
  /***/ }),
6828
6839
 
6840
+ /***/ 3217:
6841
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6842
+
6843
+ "use strict";
6844
+
6845
+
6846
+ Object.defineProperty(exports, "__esModule", ({
6847
+ value: true
6848
+ }));
6849
+ exports.remark = void 0;
6850
+ const combinator_1 = __webpack_require__(2087);
6851
+ const inline_1 = __webpack_require__(1160);
6852
+ const source_1 = __webpack_require__(6743);
6853
+ const memoize_1 = __webpack_require__(1808);
6854
+ const array_1 = __webpack_require__(8112);
6855
+ const dom_1 = __webpack_require__(3252);
6856
+ exports.remark = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('[%', (0, combinator_1.syntax)(0 /* Syntax.none */, 4, 1, 0 /* State.none */, (0, combinator_1.match)(/^\[(%+)\s/, (0, memoize_1.memoize)(([, fence]) => (0, combinator_1.surround)((0, combinator_1.open)((0, source_1.str)(`[${fence}`), (0, combinator_1.some)(source_1.text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true), (0, combinator_1.some)((0, combinator_1.union)([inline_1.inline]), new RegExp(String.raw`^\s+${fence}\]`), [[new RegExp(String.raw`^\s+${fence}\]`), 4]]), (0, combinator_1.close)((0, combinator_1.some)(source_1.text, /^\S/), (0, source_1.str)(`${fence}]`)), true, ([as, bs = [], cs], rest) => [[(0, dom_1.html)('span', {
6857
+ class: 'remark'
6858
+ }, [(0, dom_1.html)('input', {
6859
+ type: 'checkbox'
6860
+ }), (0, dom_1.html)('span', (0, dom_1.defrag)((0, array_1.push)((0, array_1.unshift)(as, bs), cs)))])], rest], ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest]), ([, fence]) => fence.length, [])))));
6861
+
6862
+ /***/ }),
6863
+
6829
6864
  /***/ 6705:
6830
6865
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6831
6866
 
@@ -6951,11 +6986,12 @@ Object.defineProperty(exports, "__esModule", ({
6951
6986
  exports.strong = void 0;
6952
6987
  const combinator_1 = __webpack_require__(2087);
6953
6988
  const inline_1 = __webpack_require__(1160);
6989
+ const emstrong_1 = __webpack_require__(6132);
6954
6990
  const source_1 = __webpack_require__(6743);
6955
6991
  const visibility_1 = __webpack_require__(7618);
6956
6992
  const array_1 = __webpack_require__(8112);
6957
6993
  const dom_1 = __webpack_require__(3252);
6958
- exports.strong = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('*', '*'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('*'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), exports.strong)])))), (0, source_1.str)('*'), false, ([, bs], rest) => [[(0, dom_1.html)('strong', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6994
+ exports.strong = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.str)('**', '*'), (0, combinator_1.syntax)(0 /* Syntax.none */, 1, 1, 0 /* State.none */, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('**'), [[/^\\?\n/, 9]]), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '*', [[/^\\?\n/, 9]]), (0, combinator_1.union)([emstrong_1.emstrong, exports.strong]))])))), (0, source_1.str)('**'), false, ([, bs], rest) => [[(0, dom_1.html)('strong', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest]));
6959
6995
 
6960
6996
  /***/ }),
6961
6997
 
@@ -7565,7 +7601,6 @@ exports.text = (0, combinator_1.creation)(1, false, ({
7565
7601
  }
7566
7602
  case '\n':
7567
7603
  return [[(0, dom_1.html)('br')], source.slice(1)];
7568
- case '_':
7569
7604
  case '*':
7570
7605
  case '+':
7571
7606
  case '~':
package/markdown.d.ts CHANGED
@@ -636,7 +636,7 @@ export namespace MarkdownParser {
636
636
  InlineParser.AnnotationParser,
637
637
  InlineParser.ReferenceParser,
638
638
  InlineParser.TemplateParser,
639
- InlineParser.CommentParser,
639
+ InlineParser.RemarkParser,
640
640
  InlineParser.MathParser,
641
641
  InlineParser.ExtensionParser,
642
642
  InlineParser.RubyParser,
@@ -647,6 +647,7 @@ export namespace MarkdownParser {
647
647
  InlineParser.InsertionParser,
648
648
  InlineParser.DeletionParser,
649
649
  InlineParser.MarkParser,
650
+ InlineParser.EmStrongParser,
650
651
  InlineParser.StrongParser,
651
652
  InlineParser.EmphasisParser,
652
653
  InlineParser.CodeParser,
@@ -714,9 +715,9 @@ export namespace MarkdownParser {
714
715
  ]> {
715
716
  }
716
717
  }
717
- export interface CommentParser extends
718
- // [% comment %]
719
- Inline<'comment'>,
718
+ export interface RemarkParser extends
719
+ // [% remark %]
720
+ Inline<'remark'>,
720
721
  Parser<HTMLElement | string, Context, [
721
722
  InlineParser,
722
723
  ]> {
@@ -1043,20 +1044,36 @@ export namespace MarkdownParser {
1043
1044
  MarkParser,
1044
1045
  ]> {
1045
1046
  }
1047
+ export interface EmStrongParser extends
1048
+ // ***abc***
1049
+ Inline<'emstrong'>,
1050
+ Parser<HTMLElement | string, Context, [
1051
+ InlineParser,
1052
+ InlineParser,
1053
+ ]> {
1054
+ }
1046
1055
  export interface StrongParser extends
1047
- // *abc*
1056
+ // **abc**
1048
1057
  Inline<'strong'>,
1049
1058
  Parser<HTMLElement | string, Context, [
1050
1059
  InlineParser,
1051
- StrongParser,
1060
+ Parser<HTMLElement | string, Context, [
1061
+ EmStrongParser,
1062
+ StrongParser,
1063
+ ]>,
1052
1064
  ]> {
1053
1065
  }
1054
1066
  export interface EmphasisParser extends
1055
- // _abc_
1067
+ // *abc*
1056
1068
  Inline<'emphasis'>,
1057
1069
  Parser<HTMLElement | string, Context, [
1070
+ StrongParser,
1058
1071
  InlineParser,
1059
- EmphasisParser,
1072
+ Parser<HTMLElement | string, Context, [
1073
+ EmStrongParser,
1074
+ StrongParser,
1075
+ EmphasisParser,
1076
+ ]>,
1060
1077
  ]> {
1061
1078
  }
1062
1079
  export interface CodeParser extends
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.276.5",
3
+ "version": "0.277.0",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -53,10 +53,10 @@ describe('Unit: parser/api/parse', () => {
53
53
  ['<p>&lt;wbr&gt;<br>a</p>']);
54
54
  assert.deepStrictEqual(
55
55
  [...parse('[%\n<wbr>\n%]').children].map(el => el.outerHTML),
56
- ['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>']);
56
+ ['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>']);
57
57
  assert.deepStrictEqual(
58
58
  [...parse('[%\n<wbr>\n%]\na').children].map(el => el.outerHTML),
59
- ['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>']);
59
+ ['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>']);
60
60
  });
61
61
 
62
62
  it('linebreak', () => {
@@ -68,7 +68,7 @@ describe('Unit: parser/block/dlist', () => {
68
68
  assert.deepStrictEqual(inspect(parser('~ a [|b]')), [['<dl><dt id="index::b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
69
69
  assert.deepStrictEqual(inspect(parser('~ a [|b]\\')), [['<dl><dt id="index::a_b">a <span class="invalid">b</span></dt><dd></dd></dl>'], '']);
70
70
  assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index::A">A</dt><dd></dd></dl>'], '']);
71
- assert.deepStrictEqual(inspect(parser('~ _A_')), [['<dl><dt id="index::A"><em>A</em></dt><dd></dd></dl>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('~ *A*')), [['<dl><dt id="index::A"><em>A</em></dt><dd></dd></dl>'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index::`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
73
73
  assert.deepStrictEqual(inspect(parser('~ ${A}$')), [['<dl><dt id="index::${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></dt><dd></dd></dl>'], '']);
74
74
  });
@@ -39,7 +39,7 @@ describe('Unit: parser/block/extension/fig', () => {
39
39
  assert.deepStrictEqual(inspect(parser('[$group-name]\n> ')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('[$group-name]\n> \n')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('[$group-name]\n>\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><pre><br>~~~</pre></blockquote></div></figure>'], '']);
42
- assert.deepStrictEqual(inspect(parser('[$group-name]\n!> _a_')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><section><p><em>a</em></p><h2>References</h2><ol class="references"></ol></section></blockquote></div></figure>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('[$group-name]\n!> *a*')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><section><p><em>a</em></p><h2>References</h2><ol class="references"></ol></section></blockquote></div></figure>'], '']);
43
43
  assert.deepStrictEqual(inspect(parser('[$group-name]\n![]{https://host}')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
44
44
  assert.deepStrictEqual(inspect(parser('[$group-name]\n![]{https://host}\n')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
45
45
  assert.deepStrictEqual(inspect(parser('[$group-name]\n!https://host\ncaption')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">caption</span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
@@ -36,7 +36,7 @@ describe('Unit: parser/block/heading', () => {
36
36
  assert.deepStrictEqual(inspect(parser('# a ')), [['<h1 id="index::a">a</h1>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('# a b c \n')), [['<h1 id="index::a_b_c">a b c</h1>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('# a\n')), [['<h1 id="index::a">a</h1>'], '']);
39
- assert.deepStrictEqual(inspect(parser('# _a_`b`${c}$')), [['<h1 id="index::a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('# *a*`b`${c}$')), [['<h1 id="index::a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index::a">a</h1>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index::a">a</h1>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index::\\">\\</h1>'], '']);
@@ -69,7 +69,7 @@ describe('Unit: parser/block/heading', () => {
69
69
  assert.deepStrictEqual(inspect(parser('# a [|b ]')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
70
70
  assert.deepStrictEqual(inspect(parser('# a [|b ]')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
71
71
  assert.deepStrictEqual(inspect(parser('# a [|b c]')), [['<h1 id="index::b_c">a<span class="indexer" data-index="b_c"></span></h1>'], '']);
72
- assert.deepStrictEqual(inspect(parser('# a [|_b_`c`${d}$]')), [['<h1 id="index::_b_`c`${d}$">a<span class="indexer" data-index="_b_`c`${d}$"></span></h1>'], '']);
72
+ assert.deepStrictEqual(inspect(parser('# a [|*b*`c`${d}$]')), [['<h1 id="index::*b*`c`${d}$">a<span class="indexer" data-index="*b*`c`${d}$"></span></h1>'], '']);
73
73
  assert.deepStrictEqual(inspect(parser('# a [|@a]')), [['<h1 id="index::@a">a<span class="indexer" data-index="@a"></span></h1>'], '']);
74
74
  assert.deepStrictEqual(inspect(parser('# a [|http://host]')), [['<h1 id="index::http://host">a<span class="indexer" data-index="http://host"></span></h1>'], '']);
75
75
  assert.deepStrictEqual(inspect(parser('# a [|!http://host]')), [['<h1 id="index::!http://host">a<span class="indexer" data-index="!http://host"></span></h1>'], '']);
@@ -27,8 +27,11 @@ describe('Unit: parser/block/paragraph', () => {
27
27
  assert.deepStrictEqual(inspect(parser('<wbr>\na')), [['<p>&lt;wbr&gt;<br>a</p>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('a\n<wbr>\n')), [['<p>a<br>&lt;wbr&gt;</p>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('a\n<wbr>\nb')), [['<p>a<br>&lt;wbr&gt;<br>b</p>'], '']);
30
- assert.deepStrictEqual(inspect(parser('_a\n<wbr>_\nb')), [['<p>_a<br><wbr>_<br>b</p>'], '']);
31
30
  assert.deepStrictEqual(inspect(parser('*a\n<wbr>*\nb')), [['<p>*a<br><wbr>*<br>b</p>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('**a\n<wbr>**\nb')), [['<p>**a<br><wbr>**<br>b</p>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('***a\n<wbr>***\nb')), [['<p>***a<br><wbr>***<br>b</p>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('***a*b\n<wbr>**\nc')), [['<p>**<em>a</em>b<br><wbr>**<br>c</p>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc')), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
32
35
  assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
33
36
  assert.deepStrictEqual(inspect(parser('http://host#\\')), [['<p><a class="url" href="http://host#\\" target="_blank">http://host#\\</a></p>'], '']);
34
37
  assert.deepStrictEqual(inspect(parser('a\nhttp://host#\\ \nb')), [['<p>a<br><a class="url" href="http://host#\\" target="_blank">http://host#\\</a><br>b</p>'], '']);
@@ -58,14 +61,14 @@ describe('Unit: parser/block/paragraph', () => {
58
61
  assert.deepStrictEqual(inspect(parser('あ>>1')), [['<p>あ<a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
59
62
  });
60
63
 
61
- it('comment', () => {
62
- assert.deepStrictEqual(inspect(parser('[% a %]')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
63
- assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
64
- assert.deepStrictEqual(inspect(parser('[% a %]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
65
- assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<p><span class="comment"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
66
- assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>'], '']);
67
- assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span>a</p>'], '']);
68
- assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>'], '']);
64
+ it('remark', () => {
65
+ assert.deepStrictEqual(inspect(parser('[% a %]')), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('[% a %]\nb')), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<p><span class="remark"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]')), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>'], '']);
70
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a')), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span>a</p>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na')), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>'], '']);
69
72
  });
70
73
 
71
74
  it('template', () => {
@@ -8,9 +8,6 @@ describe('Unit: parser/inline/autolink/email', () => {
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
- assert.deepStrictEqual(inspect(parser('a_b')), [['a'], '_b']);
12
- assert.deepStrictEqual(inspect(parser('a_b_c')), [['a'], '_b_c']);
13
- assert.deepStrictEqual(inspect(parser(`a_${'b'.repeat(255 - 2)}@`)), [[`a_${'b'.repeat(255 - 2)}@`], '']);
14
11
  assert.deepStrictEqual(inspect(parser('a@')), [['a@'], '']);
15
12
  assert.deepStrictEqual(inspect(parser('a@+')), [['a@'], '+']);
16
13
  assert.deepStrictEqual(inspect(parser('a@_')), [['a@'], '_']);
@@ -10,6 +10,7 @@ describe('Unit: parser/inline/autolink/hashnum', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
11
  assert.deepStrictEqual(inspect(parser('#')), [['#'], '']);
12
12
  assert.deepStrictEqual(inspect(parser('# ')), [['#'], ' ']);
13
+ assert.deepStrictEqual(inspect(parser('#1_')), [['#1_'], '']);
13
14
  assert.deepStrictEqual(inspect(parser('#1#')), [['#1#'], '']);
14
15
  assert.deepStrictEqual(inspect(parser('#1#2')), [['#1#2'], '']);
15
16
  assert.deepStrictEqual(inspect(parser('#1#2#3')), [['#1#2#3'], '']);
@@ -32,19 +33,18 @@ describe('Unit: parser/inline/autolink/hashnum', () => {
32
33
  assert.deepStrictEqual(inspect(parser('0##a')), [['0##a'], '']);
33
34
  assert.deepStrictEqual(inspect(parser('あ#1')), [['あ#1'], '']);
34
35
  assert.deepStrictEqual(inspect(parser(' #1')), undefined);
35
- assert.deepStrictEqual(inspect(parser('#12345678901234567')), [['#12345678901234567'], '']);
36
- assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(16)}a`)), [[`#${'1'.repeat(16)}a`], '']);
36
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(10)}`)), [[`#${'1'.repeat(10)}`], '']);
37
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(10)}a`)), [[`#${'1'.repeat(10)}a`], '']);
37
38
  });
38
39
 
39
40
  it('valid', () => {
40
41
  assert.deepStrictEqual(inspect(parser('#1')), [['<a class="hashnum">#1</a>'], '']);
41
- assert.deepStrictEqual(inspect(parser('#1_')), [['<a class="hashnum">#1</a>'], '_']);
42
42
  assert.deepStrictEqual(inspect(parser('#1 ')), [['<a class="hashnum">#1</a>'], ' ']);
43
43
  assert.deepStrictEqual(inspect(parser('#1\n')), [['<a class="hashnum">#1</a>'], '\n']);
44
44
  assert.deepStrictEqual(inspect(parser('#1\\')), [['<a class="hashnum">#1</a>'], '\\']);
45
45
  assert.deepStrictEqual(inspect(parser('#1\\ ')), [['<a class="hashnum">#1</a>'], '\\ ']);
46
46
  assert.deepStrictEqual(inspect(parser('#1\\\n')), [['<a class="hashnum">#1</a>'], '\\\n']);
47
- assert.deepStrictEqual(inspect(parser('#1234567890123456')), [['<a class="hashnum">#1234567890123456</a>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('#123456789')), [['<a class="hashnum">#123456789</a>'], '']);
48
48
  });
49
49
 
50
50
  });
@@ -8,7 +8,7 @@ import { define } from 'typed-dom/dom';
8
8
 
9
9
  export const hashnum: AutolinkParser.HashnumParser = lazy(() => fmap(rewrite(
10
10
  constraint(State.shortcut, false,
11
- open('#', str(new RegExp(/^[0-9]{1,16}(?![^\p{C}\p{S}\p{P}\s]|emoji|')/u.source.replace(/emoji/, emoji), 'u')))),
11
+ open('#', str(new RegExp(/^[0-9]{1,9}(?![^\p{C}\p{S}\p{P}\s]|emoji|['_])/u.source.replace(/emoji/, emoji), 'u')))),
12
12
  convert(
13
13
  source => `[${source}]{ ${source.slice(1)} }`,
14
14
  union([unsafelink]))),
@@ -20,8 +20,11 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
20
20
  assert.deepStrictEqual(inspect(parser('##')), [['##'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('##a')), [['##a'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('###a')), [['###a'], '']);
23
- assert.deepStrictEqual(inspect(parser('#_')), [['#'], '_']);
24
- assert.deepStrictEqual(inspect(parser('#_a')), [['#'], '_a']);
23
+ assert.deepStrictEqual(inspect(parser(`#'`)), [[`#'`], '']);
24
+ assert.deepStrictEqual(inspect(parser(`#'0`)), [[`#'0`], '']);
25
+ assert.deepStrictEqual(inspect(parser(`#'00`)), [[`#'00`], '']);
26
+ assert.deepStrictEqual(inspect(parser('#_')), [['#_'], '']);
27
+ assert.deepStrictEqual(inspect(parser('#_a')), [['#_a'], '']);
25
28
  assert.deepStrictEqual(inspect(parser('#(a)')), [['#'], '(a)']);
26
29
  assert.deepStrictEqual(inspect(parser('#{}')), [['#'], '{}']);
27
30
  assert.deepStrictEqual(inspect(parser('#{{}')), [['#'], '{{}']);
@@ -55,16 +58,14 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
55
58
  assert.deepStrictEqual(inspect(parser('#1a')), [['<a class="hashtag" href="/hashtags/1a">#1a</a>'], '']);
56
59
  assert.deepStrictEqual(inspect(parser('#1あ')), [['<a class="hashtag" href="/hashtags/1あ">#1あ</a>'], '']);
57
60
  assert.deepStrictEqual(inspect(parser('#1👩')), [['<a class="hashtag" href="/hashtags/1👩">#1👩</a>'], '']);
58
- assert.deepStrictEqual(inspect(parser(`#'0`)), [[`<a class="hashtag" href="/hashtags/'0">#'0</a>`], '']);
59
- assert.deepStrictEqual(inspect(parser(`#'00`)), [[`<a class="hashtag" href="/hashtags/'00">#'00</a>`], '']);
60
61
  assert.deepStrictEqual(inspect(parser(`#1'`)), [[`<a class="hashtag" href="/hashtags/1'">#1'</a>`], '']);
61
- assert.deepStrictEqual(inspect(parser(`#1''`)), [[`<a class="hashtag" href="/hashtags/1'">#1'</a>`], `'`]);
62
+ assert.deepStrictEqual(inspect(parser(`#1''`)), [[`<a class="hashtag" href="/hashtags/1''">#1''</a>`], '']);
62
63
  assert.deepStrictEqual(inspect(parser(`#a'`)), [[`<a class="hashtag" href="/hashtags/a'">#a'</a>`], '']);
63
- assert.deepStrictEqual(inspect(parser(`#a''`)), [[`<a class="hashtag" href="/hashtags/a'">#a'</a>`], `'`]);
64
+ assert.deepStrictEqual(inspect(parser(`#a''`)), [[`<a class="hashtag" href="/hashtags/a''">#a''</a>`], '']);
64
65
  assert.deepStrictEqual(inspect(parser(`#a'b`)), [[`<a class="hashtag" href="/hashtags/a'b">#a'b</a>`], '']);
65
66
  assert.deepStrictEqual(inspect(parser(`#a'_b`)), [[`<a class="hashtag" href="/hashtags/a'_b">#a'_b</a>`], '']);
66
67
  assert.deepStrictEqual(inspect(parser(`#a_'b`)), [[`<a class="hashtag" href="/hashtags/a_'b">#a_'b</a>`], '']);
67
- assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(15)}a`)), [[`<a class="hashtag" href="/hashtags/${'1'.repeat(15)}a">#${'1'.repeat(15)}a</a>`], '']);
68
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(9)}a`)), [[`<a class="hashtag" href="/hashtags/${'1'.repeat(9)}a">#${'1'.repeat(9)}a</a>`], '']);
68
69
  });
69
70
 
70
71
  });