securemark 0.283.7 → 0.284.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/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.284.0
4
+
5
+ - Add italic syntax.
6
+
3
7
  ## 0.283.7
4
8
 
5
9
  - 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/...)
@@ -65,16 +65,16 @@ Secure markdown renderer working on browsers for user input data.
65
65
 
66
66
  ## Operator precedence
67
67
 
68
- |P| Operators |
69
- |-|------------------------|
70
- |9| \n, \\\n |
71
- |8| ` |
72
- |6| (()), [[]], {{}}, ${}$ |
73
- |5| [% %] |
74
- |4| \<tag>\</tag> |
75
- |3| $, " |
76
- |2| (), [], {} |
77
- |1| *, **, ==, ++, ~~ |
68
+ |P| Operators |
69
+ |-|------------------------------|
70
+ |9| \n, \\\n |
71
+ |6| ` |
72
+ |5| ${}$ |
73
+ |4| [% %] |
74
+ |3| \<tag>\</tag> |
75
+ |2| $, " |
76
+ |1| (), [], {}, (()), [[]], {{}} |
77
+ |0| *, **, ///, ==, ++, ~~ |
78
78
 
79
79
  ## Dependencies
80
80
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.283.7 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.284.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"));
@@ -2426,7 +2426,7 @@ exports.math = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('$', (0,
2426
2426
  'data-invalid-type': 'content',
2427
2427
  'data-invalid-message': `"${source.match(forbiddenCommand)[0]}" command is forbidden`
2428
2428
  }, source)], '']))));
2429
- const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(0, 6 /* Recursion.terminal */, (0, combinator_1.surround)((0, source_1.str)('{'), (0, combinator_1.some)((0, combinator_1.union)([bracket, (0, combinator_1.some)(source_1.escsource, /^(?:[{}$]|\\?\n)/)])), (0, source_1.str)('}'), true)));
2429
+ const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(0, 6 /* Recursion.terminal */, (0, combinator_1.surround)((0, source_1.str)('{'), (0, combinator_1.some)((0, combinator_1.union)([bracket, (0, combinator_1.some)(source_1.escsource, /^[{}$\n]/)])), (0, source_1.str)('}'), true)));
2430
2430
 
2431
2431
  /***/ },
2432
2432
 
@@ -3917,6 +3917,28 @@ MultiHeap.min = Heap.min;
3917
3917
 
3918
3918
  /***/ },
3919
3919
 
3920
+ /***/ 3744
3921
+ (__unused_webpack_module, exports, __webpack_require__) {
3922
+
3923
+ "use strict";
3924
+
3925
+
3926
+ Object.defineProperty(exports, "__esModule", ({
3927
+ value: true
3928
+ }));
3929
+ exports.italic = void 0;
3930
+ const combinator_1 = __webpack_require__(3484);
3931
+ const inline_1 = __webpack_require__(7973);
3932
+ const source_1 = __webpack_require__(8745);
3933
+ const visibility_1 = __webpack_require__(6364);
3934
+ const array_1 = __webpack_require__(6876);
3935
+ const dom_1 = __webpack_require__(394);
3936
+ // 斜体は単語に使うとかえって見づらく読み飛ばしやすくなるため使わないべきであり
3937
+ // ある程度の長さのある文に使うのが望ましい。
3938
+ exports.italic = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(1, 4 /* Recursion.inline */, (0, combinator_1.surround)((0, source_1.str)('///', '/'), (0, combinator_1.precedence)(0, (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, (0, visibility_1.blankWith)('///')), (0, combinator_1.open)((0, combinator_1.some)(inline_1.inline, '/'), exports.italic)])))), (0, source_1.str)('///'), false, ([, bs], rest) => [[(0, dom_1.html)('i', (0, dom_1.defrag)(bs))], rest], ([as, bs], rest) => [(0, array_1.unshift)(as, bs), rest])));
3939
+
3940
+ /***/ },
3941
+
3920
3942
  /***/ 3770
3921
3943
  (__unused_webpack_module, exports, __webpack_require__) {
3922
3944
 
@@ -4959,7 +4981,7 @@ const dom_1 = __webpack_require__(394);
4959
4981
  exports.template = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(1, 0 /* Recursion.ignore */, (0, combinator_1.surround)('{{', (0, combinator_1.precedence)(1, (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), '}')), '}}', true, ([, ns = []], rest) => [[(0, dom_1.html)('span', {
4960
4982
  class: 'template'
4961
4983
  }, `{{${ns.join('')}}}`)], rest], undefined, 3 | 28 /* Backtrack.template */)));
4962
- const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(0, 6 /* Recursion.terminal */, (0, combinator_1.union)([(0, combinator_1.surround)((0, source_1.str)('('), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), ')'), (0, source_1.str)(')'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('['), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), ']'), (0, source_1.str)(']'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('{'), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), '}'), (0, source_1.str)('}'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('"'), (0, combinator_1.precedence)(2, (0, combinator_1.some)(source_1.escsource, /^"|^\\?\n/)), (0, source_1.str)('"'), true, undefined, undefined, 3 | 28 /* Backtrack.template */)])));
4984
+ const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creation)(0, 6 /* Recursion.terminal */, (0, combinator_1.union)([(0, combinator_1.surround)((0, source_1.str)('('), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), ')'), (0, source_1.str)(')'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('['), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), ']'), (0, source_1.str)(']'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('{'), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.escsource]), '}'), (0, source_1.str)('}'), true, undefined, ([as, bs = []], rest) => [(0, array_1.unshift)(as, bs), rest], 3 | 28 /* Backtrack.template */), (0, combinator_1.surround)((0, source_1.str)('"'), (0, combinator_1.precedence)(2, (0, combinator_1.some)(source_1.escsource, /^["\n]/)), (0, source_1.str)('"'), true, undefined, undefined, 3 | 28 /* Backtrack.template */)])));
4963
4985
 
4964
4986
  /***/ },
4965
4987
 
@@ -5435,6 +5457,7 @@ exports.text = (0, combinator_1.creation)(1, 0 /* Recursion.ignore */, ({
5435
5457
  case '\n':
5436
5458
  return [[(0, dom_1.html)('br')], source.slice(1)];
5437
5459
  case '*':
5460
+ case '/':
5438
5461
  case '+':
5439
5462
  case '~':
5440
5463
  case '=':
@@ -7674,6 +7697,7 @@ const mark_1 = __webpack_require__(5381);
7674
7697
  const emstrong_1 = __webpack_require__(365);
7675
7698
  const strong_1 = __webpack_require__(6591);
7676
7699
  const emphasis_1 = __webpack_require__(1354);
7700
+ const italic_1 = __webpack_require__(3744);
7677
7701
  const math_1 = __webpack_require__(2962);
7678
7702
  const code_1 = __webpack_require__(3481);
7679
7703
  const htmlentity_1 = __webpack_require__(470);
@@ -7708,6 +7732,8 @@ exports.inline = (0, combinator_1.lazy)(() => (0, combinator_1.union)([input =>
7708
7732
  return (0, deletion_1.deletion)(input);
7709
7733
  case '==':
7710
7734
  return (0, mark_1.mark)(input);
7735
+ case '//':
7736
+ return (0, italic_1.italic)(input);
7711
7737
  }
7712
7738
  switch (source[0]) {
7713
7739
  case '[':
package/markdown.d.ts CHANGED
@@ -661,6 +661,7 @@ export namespace MarkdownParser {
661
661
  InlineParser.EmStrongParser,
662
662
  InlineParser.StrongParser,
663
663
  InlineParser.EmphasisParser,
664
+ InlineParser.ItalicParser,
664
665
  InlineParser.MathParser,
665
666
  InlineParser.CodeParser,
666
667
  InlineParser.HTMLEntityParser,
@@ -1066,6 +1067,14 @@ export namespace MarkdownParser {
1066
1067
  ]>,
1067
1068
  ]> {
1068
1069
  }
1070
+ export interface ItalicParser extends
1071
+ // ///abc///
1072
+ Inline<'italic'>,
1073
+ Parser<HTMLElement | string, Context, [
1074
+ InlineParser,
1075
+ ItalicParser,
1076
+ ]> {
1077
+ }
1069
1078
  export interface MathParser extends
1070
1079
  // $expr$
1071
1080
  // ${expr}$
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.283.7",
3
+ "version": "0.284.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",
@@ -16,7 +16,7 @@ describe('Unit: parser/inline/autolink/url', () => {
16
16
  assert.deepStrictEqual(inspect(parser('Http://host')), [['Http'], '://host']);
17
17
  //assert.deepStrictEqual(inspect(parser('http://[::ffff:0:0%1]')), [['<a class="invalid">http://[::ffff:0:0%1]</a>'], '']);
18
18
  //assert.deepStrictEqual(inspect(parser('http://[::ffff:0:0/96]')), [['<a class="invalid">http://[::ffff:0:0/96]</a>'], '']);
19
- assert.deepStrictEqual(inspect(parser(' http://a')), undefined);
19
+ assert.deepStrictEqual(inspect(parser(' http://host')), undefined);
20
20
  });
21
21
 
22
22
  it('basic', () => {
@@ -0,0 +1,53 @@
1
+ import { italic } from './italic';
2
+ import { some } from '../../combinator';
3
+ import { inspect } from '../../debug.test';
4
+
5
+ describe('Unit: parser/inline/italic', () => {
6
+ describe('italic', () => {
7
+ const parser = (source: string) => some(italic)({ source, context: {} });
8
+
9
+ it('invalid', () => {
10
+ assert.deepStrictEqual(inspect(parser('///')), undefined);
11
+ assert.deepStrictEqual(inspect(parser('///a')), [['///', 'a'], '']);
12
+ assert.deepStrictEqual(inspect(parser('///a ///')), [['///', 'a'], ' ///']);
13
+ assert.deepStrictEqual(inspect(parser('///a ///')), [['///', 'a', ' '], ' ///']);
14
+ assert.deepStrictEqual(inspect(parser('///a\n///')), [['///', 'a'], '\n///']);
15
+ assert.deepStrictEqual(inspect(parser('///a\\ ///')), [['///', 'a'], '\\ ///']);
16
+ assert.deepStrictEqual(inspect(parser('///a\\\n///')), [['///', 'a'], '\\\n///']);
17
+ assert.deepStrictEqual(inspect(parser('///a/b')), [['///', 'a', '/', 'b'], '']);
18
+ assert.deepStrictEqual(inspect(parser('///a//b')), [['///', 'a', '//', 'b'], '']);
19
+ assert.deepStrictEqual(inspect(parser('///a*b///')), [['///', 'a', '*', 'b', '///'], '']);
20
+ assert.deepStrictEqual(inspect(parser('/// ///')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('/// a///')), undefined);
22
+ assert.deepStrictEqual(inspect(parser('/// a ///')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('///\n///')), undefined);
24
+ assert.deepStrictEqual(inspect(parser('///\na///')), undefined);
25
+ assert.deepStrictEqual(inspect(parser('///\\ a///')), undefined);
26
+ assert.deepStrictEqual(inspect(parser('///\\\na///')), undefined);
27
+ assert.deepStrictEqual(inspect(parser('///<wbr>a///')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('////a////')), undefined);
29
+ assert.deepStrictEqual(inspect(parser('/////a/////')), undefined);
30
+ assert.deepStrictEqual(inspect(parser(' ///a///')), undefined);
31
+ });
32
+
33
+ it('basic', () => {
34
+ assert.deepStrictEqual(inspect(parser('///a///')), [['<i>a</i>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('///ab///')), [['<i>ab</i>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('///a////')), [['<i>a</i>'], '/']);
37
+ assert.deepStrictEqual(inspect(parser('///a\nb///')), [['<i>a<br>b</i>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('///a\\\nb///')), [['<i>a<br>b</i>'], '']);
39
+ });
40
+
41
+ it('nest', () => {
42
+ assert.deepStrictEqual(inspect(parser('///a ///b//////')), [['<i>a <i>b</i></i>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('///a\\ ///b//////')), [['<i>a <i>b</i></i>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('///a&Tab;///b//////')), [['<i>a\t<i>b</i></i>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('///a<wbr>///b//////')), [['<i>a<wbr><i>b</i></i>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('///`a`///')), [['<i><code data-src="`a`">a</code></i>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('///(///a///)///')), [['<i><span class="paren">(<i>a</i>)</span></i>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('///{http://host/}///')), [['<i><a class="url" href="http://host/" target="_blank">http://host/</a></i>'], '']);
49
+ });
50
+
51
+ });
52
+
53
+ });
@@ -0,0 +1,21 @@
1
+ import { ItalicParser } from '../inline';
2
+ import { Recursion } from '../context';
3
+ import { union, some, creation, precedence, surround, open, lazy } from '../../combinator';
4
+ import { inline } from '../inline';
5
+ import { str } from '../source';
6
+ import { startTight, blankWith } from '../visibility';
7
+ import { unshift } from 'spica/array';
8
+ import { html, defrag } from 'typed-dom/dom';
9
+
10
+ // 斜体は単語に使うとかえって見づらく読み飛ばしやすくなるため使わないべきであり
11
+ // ある程度の長さのある文に使うのが望ましい。
12
+ export const italic: ItalicParser = lazy(() => creation(1, Recursion.inline, surround(
13
+ str('///', '/'),
14
+ precedence(0,
15
+ startTight(some(union([
16
+ some(inline, blankWith('///')),
17
+ open(some(inline, '/'), italic),
18
+ ])))),
19
+ str('///'), false,
20
+ ([, bs], rest) => [[html('i', defrag(bs))], rest],
21
+ ([as, bs], rest) => [unshift(as, bs), rest])));
@@ -36,7 +36,7 @@ const bracket: MathParser.BracketParser = lazy(() => creation(0, Recursion.termi
36
36
  str('{'),
37
37
  some(union([
38
38
  bracket,
39
- some(escsource, /^(?:[{}$]|\\?\n)/),
39
+ some(escsource, /^[{}$\n]/),
40
40
  ])),
41
41
  str('}'),
42
42
  true)));
@@ -20,6 +20,6 @@ const bracket: TemplateParser.BracketParser = lazy(() => creation(0, Recursion.t
20
20
  undefined, ([as, bs = []], rest) => [unshift(as, bs), rest], 3 | Backtrack.template),
21
21
  surround(str('{'), some(union([bracket, escsource]), '}'), str('}'), true,
22
22
  undefined, ([as, bs = []], rest) => [unshift(as, bs), rest], 3 | Backtrack.template),
23
- surround(str('"'), precedence(2, some(escsource, /^"|^\\?\n/)), str('"'), true,
23
+ surround(str('"'), precedence(2, some(escsource, /^["\n]/)), str('"'), true,
24
24
  undefined, undefined, 3 | Backtrack.template),
25
25
  ])));
@@ -96,6 +96,7 @@ describe('Unit: parser/inline', () => {
96
96
  assert.deepStrictEqual(inspect(parser('***a****')), [['<em><strong>a</strong></em>', '*'], '']);
97
97
  assert.deepStrictEqual(inspect(parser('****a***')), [['****', 'a', '***'], '']);
98
98
  assert.deepStrictEqual(inspect(parser('****a****')), [['****', 'a', '****'], '']);
99
+ assert.deepStrictEqual(inspect(parser('//////a//////')), [['//////', 'a', '//////'], '']);
99
100
  assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
100
101
  assert.deepStrictEqual(inspect(parser('**(**a**)**')), [['<strong><span class="paren">(<strong>a</strong>)</span></strong>'], '']);
101
102
  assert.deepStrictEqual(inspect(parser('*++ ++*')), [['<em><ins> </ins></em>'], '']);
@@ -175,13 +176,13 @@ describe('Unit: parser/inline', () => {
175
176
  assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '<span class="remark"><input type="checkbox"><span>[% "*"* %]</span></span>'], '']);
176
177
  assert.deepStrictEqual(inspect(parser('"{{""}}')), [['"', '{', '{', '"', '"', '}', '}'], '']);
177
178
  assert.deepStrictEqual(inspect(parser('[#http://host/(<bdi>)]</bdi>')), [['<a class="index" href="#index::http://host/(&lt;bdi&gt;)">http://host/(&lt;bdi&gt;)</a>', '<', '/', 'bdi', '>'], '']);
178
- assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>')), [[ '[', '#@a/http', ':', '/', '/', 'host', '/', '(', '<bdi>)]</bdi>' ], '']);
179
+ assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>')), [[ '[', '#@a/http', ':', '//', 'host', '/', '(', '<bdi>)]</bdi>' ], '']);
179
180
  });
180
181
 
181
182
  it('uri', () => {
182
183
  assert.deepStrictEqual(inspect(parser('\nhttp://host')), [['<br>', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
183
- assert.deepStrictEqual(inspect(parser('0http://host')), [['0http', ':', '/', '/', 'host'], '']);
184
- assert.deepStrictEqual(inspect(parser('0aAhttp://host')), [['0aAhttp', ':', '/', '/', 'host'], '']);
184
+ assert.deepStrictEqual(inspect(parser('0http://host')), [['0http', ':', '//', 'host'], '']);
185
+ assert.deepStrictEqual(inspect(parser('0aAhttp://host')), [['0aAhttp', ':', '//', 'host'], '']);
185
186
  assert.deepStrictEqual(inspect(parser('?http://host')), [['?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
186
187
  assert.deepStrictEqual(inspect(parser('0!http://host')), [['0', '!', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
187
188
  assert.deepStrictEqual(inspect(parser('0?http://host')), [['0', '?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
@@ -14,6 +14,7 @@ import { mark } from './inline/mark';
14
14
  import { emstrong } from './inline/emstrong';
15
15
  import { strong } from './inline/strong';
16
16
  import { emphasis } from './inline/emphasis';
17
+ import { italic } from './inline/italic';
17
18
  import { math } from './inline/math';
18
19
  import { code } from './inline/code';
19
20
  import { htmlentity } from './inline/htmlentity';
@@ -36,6 +37,7 @@ export import MarkParser = InlineParser.MarkParser;
36
37
  export import EmStrongParser = InlineParser.EmStrongParser;
37
38
  export import StrongParser = InlineParser.StrongParser;
38
39
  export import EmphasisParser = InlineParser.EmphasisParser;
40
+ export import ItalicParser = InlineParser.ItalicParser;
39
41
  export import MathParser = InlineParser.MathParser;
40
42
  export import CodeParser = InlineParser.CodeParser;
41
43
  export import MediaParser = InlineParser.MediaParser;
@@ -75,6 +77,8 @@ export const inline: InlineParser = lazy(() => union([
75
77
  return deletion(input);
76
78
  case '==':
77
79
  return mark(input);
80
+ case '//':
81
+ return italic(input);
78
82
  }
79
83
  switch (source[0]) {
80
84
  case '[':
@@ -34,6 +34,7 @@ export const text: TextParser = creation(1, Recursion.ignore, ({ source, context
34
34
  case '\n':
35
35
  return [[html('br')], source.slice(1)];
36
36
  case '*':
37
+ case '/':
37
38
  case '+':
38
39
  case '~':
39
40
  case '=':