securemark 0.237.1 → 0.237.2

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.237.2
4
+
5
+ - Refactoring.
6
+
3
7
  ## 0.237.1
4
8
 
5
9
  - Refactoring.
@@ -1,4 +1,4 @@
1
- /*! securemark v0.237.1 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
1
+ /*! securemark v0.237.2 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
2
2
  require = function () {
3
3
  function r(e, n, t) {
4
4
  function o(i, f) {
@@ -4753,41 +4753,49 @@ require = function () {
4753
4753
  const parser_1 = _dereq_('../../combinator/data/parser');
4754
4754
  const combinator_1 = _dereq_('../../combinator');
4755
4755
  const autolink_1 = _dereq_('../autolink');
4756
- const source_1 = _dereq_('../source');
4757
4756
  const typed_dom_1 = _dereq_('typed-dom');
4758
- const array_1 = _dereq_('spica/array');
4759
- const opener = /^(`{3,})(?!`)(\S*)([^\n]*)(?:$|\n)/;
4760
- const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/;
4757
+ const opener = /^(`{3,})(?!`)([^\n]*)(?:$|\n)/;
4758
+ const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/i;
4761
4759
  exports.segment = (0, combinator_1.block)((0, combinator_1.validate)('```', (0, combinator_1.clear)((0, combinator_1.fence)(opener, 300))));
4762
4760
  exports.segment_ = (0, combinator_1.block)((0, combinator_1.validate)('```', (0, combinator_1.clear)((0, combinator_1.fence)(opener, 300, false))), false);
4763
- exports.codeblock = (0, combinator_1.block)((0, combinator_1.validate)('```', (0, combinator_1.fmap)((0, combinator_1.fence)(opener, 300), ([body, closer, opener, delim, lang, param], _, context) => {
4764
- var _a, _b, _c, _d;
4765
- [lang, param] = language.test(lang) ? [
4766
- lang,
4767
- param
4768
- ] : [
4769
- '',
4770
- lang + param
4771
- ];
4772
- param = param.trim();
4773
- const path = (0, array_1.join)((0, parser_1.eval)((0, combinator_1.some)(source_1.escsource, /^\s/)(param, context), []));
4774
- if (!closer || param !== path)
4761
+ exports.codeblock = (0, combinator_1.block)((0, combinator_1.validate)('```', (0, combinator_1.fmap)((0, combinator_1.fence)(opener, 300), ([body, closer, opener, delim, param], _, context) => {
4762
+ var _a, _b, _c, _d, _e, _f;
4763
+ const params = (_b = (_a = param.match(/(?:\\.?|\S)+/g)) === null || _a === void 0 ? void 0 : _a.reduce((params, value, i) => {
4764
+ var _a, _b, _c;
4765
+ let name;
4766
+ switch (true) {
4767
+ case i === 0 && value[0] === param[0] && language.test(value):
4768
+ name = 'lang';
4769
+ value = value.toLowerCase();
4770
+ break;
4771
+ case /^\d+(?:[,-]\d+)*$/.test(value):
4772
+ name = 'line';
4773
+ break;
4774
+ default:
4775
+ name = 'path';
4776
+ if (!params.lang) {
4777
+ const file = (_a = value.split('/').pop()) !== null && _a !== void 0 ? _a : '';
4778
+ params.lang = file && file.includes('.', 1) ? (_c = (_b = file.split('.').pop()) === null || _b === void 0 ? void 0 : _b.match(language)) === null || _c === void 0 ? void 0 : _c[0].toLowerCase() : params.lang;
4779
+ }
4780
+ }
4781
+ name in params ? params.invalid = `Duplicate ${ name } value` : params[name] = value;
4782
+ return params;
4783
+ }, {})) !== null && _b !== void 0 ? _b : {};
4784
+ if (!closer || params.invalid)
4775
4785
  return [(0, typed_dom_1.html)('pre', {
4776
4786
  class: 'invalid',
4777
4787
  translate: 'no',
4778
4788
  'data-invalid-syntax': 'codeblock',
4779
4789
  'data-invalid-type': !closer ? 'fence' : 'argument',
4780
- 'data-invalid-message': !closer ? `Missing the closing delimiter "${ delim }"` : 'Invalid argument'
4790
+ 'data-invalid-message': !closer ? `Missing the closing delimiter "${ delim }"` : params.invalid
4781
4791
  }, `${ opener }${ body }${ closer }`)];
4782
- const file = (_a = path.split('/').pop()) !== null && _a !== void 0 ? _a : '';
4783
- const ext = file && file.includes('.', 1) ? file.split('.').pop() : '';
4784
- lang = language.test(lang || ext) ? lang || ext : lang && 'invalid';
4785
4792
  const el = (0, typed_dom_1.html)('pre', {
4786
- class: lang ? `code language-${ lang }` : 'text',
4793
+ class: params.lang ? `code language-${ params.lang }` : 'text',
4787
4794
  translate: 'no',
4788
- 'data-lang': lang || global_1.undefined,
4789
- 'data-path': path || global_1.undefined
4790
- }, lang ? ((_d = (_c = (_b = context.caches) === null || _b === void 0 ? void 0 : _b.code) === null || _c === void 0 ? void 0 : _c.get(`${ lang }\n${ body.slice(0, -1) }`)) === null || _d === void 0 ? void 0 : _d.cloneNode(true).childNodes) || body.slice(0, -1) || global_1.undefined : (0, typed_dom_1.defrag)((0, parser_1.eval)((0, combinator_1.some)(autolink_1.autolink)(body.slice(0, -1), context), [])));
4795
+ 'data-lang': params.lang || global_1.undefined,
4796
+ 'data-line': params.line || global_1.undefined,
4797
+ 'data-path': params.path || global_1.undefined
4798
+ }, params.lang ? ((_f = (_d = (_c = context.caches) === null || _c === void 0 ? void 0 : _c.code) === null || _d === void 0 ? void 0 : _d.get(`${ (_e = params.lang) !== null && _e !== void 0 ? _e : '' }\n${ body.slice(0, -1) }`)) === null || _f === void 0 ? void 0 : _f.cloneNode(true).childNodes) || body.slice(0, -1) || global_1.undefined : (0, typed_dom_1.defrag)((0, parser_1.eval)((0, combinator_1.some)(autolink_1.autolink)(body.slice(0, -1), context), [])));
4791
4799
  return [el];
4792
4800
  })));
4793
4801
  },
@@ -4795,8 +4803,6 @@ require = function () {
4795
4803
  '../../combinator': 27,
4796
4804
  '../../combinator/data/parser': 47,
4797
4805
  '../autolink': 62,
4798
- '../source': 128,
4799
- 'spica/array': 6,
4800
4806
  'spica/global': 15,
4801
4807
  'typed-dom': 26
4802
4808
  }
@@ -6740,7 +6746,7 @@ require = function () {
6740
6746
  ], ([as, bs = []], rest) => [
6741
6747
  (0, array_1.unshift)(as, bs),
6742
6748
  rest
6743
- ]), ([, fence]) => fence)))));
6749
+ ]), ([, fence]) => fence.length)))));
6744
6750
  },
6745
6751
  {
6746
6752
  '../../combinator': 27,
@@ -8216,7 +8222,7 @@ require = function () {
8216
8222
  class: void classList.add('invalid'),
8217
8223
  'data-invalid-syntax': 'figure',
8218
8224
  'data-invalid-type': 'position',
8219
- 'data-invalid-message': 'Base index declarations must be after level 1 or 2 headings',
8225
+ 'data-invalid-message': 'Base index declarations must be after level 1 to 6 headings',
8220
8226
  hidden: null
8221
8227
  });
8222
8228
  continue;
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.237.1",
3
+ "version": "0.237.2",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.237.1",
3
+ "version": "0.237.2",
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",
@@ -47,7 +47,7 @@ describe('Unit: parser/block/codeblock', () => {
47
47
  it('attribute', () => {
48
48
  assert.deepStrictEqual(inspect(parser('```0\n```')), [['<pre class="code language-0" translate="no" data-lang="0"></pre>'], '']);
49
49
  assert.deepStrictEqual(inspect(parser('```a\n```')), [['<pre class="code language-a" translate="no" data-lang="a"></pre>'], '']);
50
- assert.deepStrictEqual(inspect(parser('```A\n```')), [['<pre class="text" translate="no" data-path="A"></pre>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('```A\n```')), [['<pre class="code language-a" translate="no" data-lang="a"></pre>'], '']);
51
51
  assert.deepStrictEqual(inspect(parser('```a-b\n```')), [['<pre class="code language-a-b" translate="no" data-lang="a-b"></pre>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('```a-b0\n```')), [['<pre class="code language-a-b0" translate="no" data-lang="a-b0"></pre>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('```a--b\n```')), [['<pre class="text" translate="no" data-path="a--b"></pre>'], '']);
@@ -62,7 +62,10 @@ describe('Unit: parser/block/codeblock', () => {
62
62
  assert.deepStrictEqual(inspect(parser('```.b\n```')), [['<pre class="text" translate="no" data-path=".b"></pre>'], '']);
63
63
  assert.deepStrictEqual(inspect(parser('```b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-path="b.c"></pre>'], '']);
64
64
  assert.deepStrictEqual(inspect(parser('```a b.c\n```')), [['<pre class="code language-a" translate="no" data-lang="a" data-path="b.c"></pre>'], '']);
65
- assert.deepStrictEqual(inspect(parser('```A b.c\n```')), [['<pre class="invalid" translate="no">```A b.c\n```</pre>'], '']);
65
+ assert.deepStrictEqual(inspect(parser('```a 1\n```')), [['<pre class="code language-a" translate="no" data-lang="a" data-line="1"></pre>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('``` 1\n```')), [['<pre class="text" translate="no" data-line="1"></pre>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('``` 1,2-3\n```')), [['<pre class="text" translate="no" data-line="1,2-3"></pre>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('``` 1 b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-line="1" data-path="b.c"></pre>'], '']);
66
69
  });
67
70
 
68
71
  });
@@ -3,12 +3,10 @@ import { CodeBlockParser } from '../block';
3
3
  import { eval } from '../../combinator/data/parser';
4
4
  import { some, block, validate, fence, clear, fmap } from '../../combinator';
5
5
  import { autolink } from '../autolink';
6
- import { escsource } from '../source';
7
6
  import { html, defrag } from 'typed-dom';
8
- import { join } from 'spica/array';
9
7
 
10
- const opener = /^(`{3,})(?!`)(\S*)([^\n]*)(?:$|\n)/;
11
- const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/;
8
+ const opener = /^(`{3,})(?!`)([^\n]*)(?:$|\n)/;
9
+ const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/i;
12
10
 
13
11
  export const segment: CodeBlockParser.SegmentParser = block(validate('```',
14
12
  clear(fence(opener, 300))));
@@ -19,35 +17,55 @@ export const segment_: CodeBlockParser.SegmentParser = block(validate('```',
19
17
  export const codeblock: CodeBlockParser = block(validate('```', fmap(
20
18
  fence(opener, 300),
21
19
  // Bug: Type mismatch between outer and inner.
22
- ([body, closer, opener, delim, lang, param]: string[], _, context) => {
23
- [lang, param] = language.test(lang)
24
- ? [lang, param]
25
- : ['', lang + param];
26
- param = param.trim();
27
- const path = join(eval(some(escsource, /^\s/)(param, context), []));
28
- if (!closer || param !== path) return [html('pre', {
20
+ ([body, closer, opener, delim, param]: string[], _, context) => {
21
+ const params = param.match(/(?:\\.?|\S)+/g)?.reduce<{
22
+ lang?: string;
23
+ path?: string;
24
+ line?: string;
25
+ invalid?: string;
26
+ }>((params, value, i) => {
27
+ let name: string;
28
+ switch (true) {
29
+ case i === 0
30
+ && value[0] === param[0]
31
+ && language.test(value):
32
+ name = 'lang';
33
+ value = value.toLowerCase();
34
+ break;
35
+ case /^\d+(?:[,-]\d+)*$/.test(value):
36
+ name = 'line';
37
+ break;
38
+ default:
39
+ name = 'path';
40
+ if (!params.lang) {
41
+ const file = value.split('/').pop() ?? '';
42
+ params.lang = file && file.includes('.', 1)
43
+ ? file.split('.').pop()?.match(language)?.[0].toLowerCase()
44
+ : params.lang;
45
+ }
46
+ }
47
+ name in params
48
+ ? params.invalid = `Duplicate ${name} value`
49
+ : params[name] = value;
50
+ return params;
51
+ }, {}) ?? {};
52
+ if (!closer || params.invalid) return [html('pre', {
29
53
  class: 'invalid',
30
54
  translate: 'no',
31
55
  'data-invalid-syntax': 'codeblock',
32
56
  'data-invalid-type': !closer ? 'fence' : 'argument',
33
- 'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` : 'Invalid argument',
57
+ 'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` : params.invalid,
34
58
  }, `${opener}${body}${closer}`)];
35
- const file = path.split('/').pop() ?? '';
36
- const ext = file && file.includes('.', 1)
37
- ? file.split('.').pop()!
38
- : '';
39
- lang = language.test(lang || ext)
40
- ? lang || ext
41
- : lang && 'invalid';
42
59
  const el = html('pre',
43
60
  {
44
- class: lang ? `code language-${lang}` : 'text',
61
+ class: params.lang ? `code language-${params.lang}` : 'text',
45
62
  translate: 'no',
46
- 'data-lang': lang || undefined,
47
- 'data-path': path || undefined,
63
+ 'data-lang': params.lang || undefined,
64
+ 'data-line': params.line || undefined,
65
+ 'data-path': params.path || undefined,
48
66
  },
49
- lang
50
- ? context.caches?.code?.get(`${lang}\n${body.slice(0, -1)}`)?.cloneNode(true).childNodes ||
67
+ params.lang
68
+ ? context.caches?.code?.get(`${params.lang ?? ''}\n${body.slice(0, -1)}`)?.cloneNode(true).childNodes ||
51
69
  body.slice(0, -1) || undefined
52
70
  : defrag(eval(some(autolink)(body.slice(0, -1), context), [])));
53
71
  return [el];
@@ -21,4 +21,4 @@ export const comment: CommentParser = lazy(() => creator(validate('[#', match(
21
21
  ]),
22
22
  ], rest],
23
23
  ([as, bs = []], rest) => [unshift(as, bs), rest]),
24
- ([, fence]) => fence)))));
24
+ ([, fence]) => fence.length)))));
@@ -181,7 +181,7 @@ describe('Unit: parser/processor/figure', () => {
181
181
  '<h2 id="index:0">0</h2>',
182
182
  '<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
183
183
  '<figure data-type="quote" data-label="fig-d" data-group="fig" data-number="4.1" id="label:fig-d"><div><blockquote></blockquote></div><figcaption><span class="figindex">Fig. 4.1. </span></figcaption></figure>',
184
- '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 or 2 headings"></figure>',
184
+ '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
185
185
  '<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
186
186
  '<figure data-label="$-0.4.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
187
187
  '<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
@@ -232,17 +232,17 @@ describe('Unit: parser/processor/figure', () => {
232
232
  assert.deepStrictEqual(
233
233
  [...target.children].map(el => normalize(el.outerHTML)),
234
234
  [
235
- '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 or 2 headings"></figure>',
235
+ '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
236
236
  '<h2 id="index:0">0</h2>',
237
237
  '<figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure>',
238
238
  '<figure data-type="quote" data-label="fig-a" data-group="fig" data-number="0.1" id="label:fig-a"><div><blockquote></blockquote></div><figcaption><span class="figindex">Fig. 0.1. </span></figcaption></figure>',
239
- '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 or 2 headings"></figure>',
239
+ '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
240
240
  '<h2 id="index:0">0</h2>',
241
241
  '<figure data-type="quote" data-label="fig-b" data-group="fig" data-number="1.1" id="label:fig-b"><div><blockquote></blockquote></div><figcaption><span class="figindex">Fig. 1.1. </span></figcaption></figure>',
242
- '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 or 2 headings"></figure>',
242
+ '<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
243
243
  '<h3 id="index:0">0</h3>',
244
244
  '<figure data-type="quote" data-label="fig-c" data-group="fig" data-number="1.2" id="label:fig-c"><div><blockquote></blockquote></div><figcaption><span class="figindex">Fig. 1.2. </span></figcaption></figure>',
245
- '<figure data-label="$-1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 or 2 headings"></figure>',
245
+ '<figure data-label="$-1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
246
246
  '<h2 id="index:0">0</h2>',
247
247
  '<figure data-label="$-0.0" data-group="$" hidden="" data-number="2.0"></figure>',
248
248
  '<figure data-type="quote" data-label="fig-d" data-group="fig" data-number="2.1" id="label:fig-d"><div><blockquote></blockquote></div><figcaption><span class="figindex">Fig. 2.1. </span></figcaption></figure>',
@@ -64,7 +64,7 @@ export function* figure(
64
64
  class: void classList.add('invalid'),
65
65
  'data-invalid-syntax': 'figure',
66
66
  'data-invalid-type': 'position',
67
- 'data-invalid-message': 'Base index declarations must be after level 1 or 2 headings',
67
+ 'data-invalid-message': 'Base index declarations must be after level 1 to 6 headings',
68
68
  hidden: null,
69
69
  });
70
70
  continue;