securemark 0.239.0 → 0.240.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 +12 -0
- package/design.md +2 -2
- package/dist/securemark.js +126 -59
- package/gulpfile.js +1 -1
- package/markdown.d.ts +3 -3
- package/package-lock.json +201 -142
- package/package.json +6 -6
- package/src/combinator/data/parser/some.ts +28 -6
- package/src/combinator/data/parser/subsequence.ts +1 -1
- package/src/combinator/data/parser.ts +21 -16
- package/src/parser/api/header.test.ts +1 -1
- package/src/parser/api/header.ts +3 -3
- package/src/parser/api/parse.test.ts +13 -7
- package/src/parser/block/blockquote.test.ts +1 -1
- package/src/parser/block/extension/aside.test.ts +1 -1
- package/src/parser/block/extension/example.test.ts +2 -2
- package/src/parser/block/extension/fig.test.ts +21 -21
- package/src/parser/block/extension/figure.test.ts +37 -33
- package/src/parser/block/extension/figure.ts +36 -6
- package/src/parser/block/olist.ts +2 -2
- package/src/parser/header.test.ts +4 -4
- package/src/parser/header.ts +7 -5
- package/src/parser/inline/annotation.ts +1 -1
- package/src/parser/inline/bracket.test.ts +5 -1
- package/src/parser/inline/bracket.ts +2 -2
- package/src/parser/inline/comment.ts +1 -1
- package/src/parser/inline/reference.test.ts +7 -7
- package/src/parser/inline/reference.ts +2 -2
- package/src/parser/inline.test.ts +4 -0
- package/src/parser/processor/figure.test.ts +79 -79
|
@@ -46,7 +46,7 @@ export const segment: FigureParser.SegmentParser = block(match(
|
|
|
46
46
|
]),
|
|
47
47
|
]),
|
|
48
48
|
closer),
|
|
49
|
-
([, fence]) => fence.length)));
|
|
49
|
+
([, fence]) => fence.length, [])));
|
|
50
50
|
|
|
51
51
|
export const figure: FigureParser = block(rewrite(segment, fmap(
|
|
52
52
|
convert(source => source.slice(source.search(/[[$]/), source.trimEnd().lastIndexOf('\n')),
|
|
@@ -76,10 +76,10 @@ export const figure: FigureParser = block(rewrite(segment, fmap(
|
|
|
76
76
|
html('figure',
|
|
77
77
|
attributes(label.getAttribute('data-label')!, param, content, caption),
|
|
78
78
|
[
|
|
79
|
-
html('div', [content]),
|
|
80
79
|
html('figcaption', unshift(
|
|
81
80
|
[html('span', { class: 'figindex' })],
|
|
82
81
|
defrag(caption))),
|
|
82
|
+
html('div', [content]),
|
|
83
83
|
])
|
|
84
84
|
])));
|
|
85
85
|
|
|
@@ -89,6 +89,7 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
|
|
|
89
89
|
switch (type || content.tagName) {
|
|
90
90
|
case 'UL':
|
|
91
91
|
case 'OL':
|
|
92
|
+
case 'checklist':
|
|
92
93
|
type = 'list';
|
|
93
94
|
break;
|
|
94
95
|
case 'TABLE':
|
|
@@ -118,16 +119,45 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
|
|
|
118
119
|
'data-invalid-type': 'argument',
|
|
119
120
|
'data-invalid-message': 'Invalid argument',
|
|
120
121
|
} ||
|
|
121
|
-
group === '$' && (
|
|
122
|
-
'data-invalid-type': '
|
|
123
|
-
'data-invalid-message': '
|
|
122
|
+
group === '$' && (type !== 'math' || caption.length > 0) && {
|
|
123
|
+
'data-invalid-type': 'label',
|
|
124
|
+
'data-invalid-message': '"$" label group must be used to math formulas with no caption',
|
|
125
|
+
} ||
|
|
126
|
+
type === 'media' && {} ||
|
|
127
|
+
['fig', 'figure'].includes(group) && {
|
|
128
|
+
'data-invalid-type': 'label',
|
|
129
|
+
'data-invalid-message': '"fig" and "figure" label groups must be used to media',
|
|
130
|
+
} ||
|
|
131
|
+
group === 'table' && type !== group && {
|
|
132
|
+
'data-invalid-type': 'label',
|
|
133
|
+
'data-invalid-message': '"table" label group must be used to tables',
|
|
134
|
+
} ||
|
|
135
|
+
group === 'list' && type !== group && {
|
|
136
|
+
'data-invalid-type': 'label',
|
|
137
|
+
'data-invalid-message': '"list" label group must be used to lists',
|
|
138
|
+
} ||
|
|
139
|
+
group === 'quote' && type !== group && {
|
|
140
|
+
'data-invalid-type': 'label',
|
|
141
|
+
'data-invalid-message': '"quote" label group must be used to blockquotes',
|
|
142
|
+
} ||
|
|
143
|
+
group === 'text' && type !== group && {
|
|
144
|
+
'data-invalid-type': 'label',
|
|
145
|
+
'data-invalid-message': '"text" label group must be used to codeblocks with no language',
|
|
146
|
+
} ||
|
|
147
|
+
group === 'code' && type !== group && {
|
|
148
|
+
'data-invalid-type': 'label',
|
|
149
|
+
'data-invalid-message': '"code" label group must be used to codeblocks with any language',
|
|
150
|
+
} ||
|
|
151
|
+
group === 'example' && type !== group && {
|
|
152
|
+
'data-invalid-type': 'label',
|
|
153
|
+
'data-invalid-message': '"example" label group must be used to examples',
|
|
124
154
|
} ||
|
|
125
155
|
undefined;
|
|
126
156
|
return {
|
|
127
157
|
'data-type': type,
|
|
128
158
|
'data-label': label,
|
|
129
159
|
'data-group': group,
|
|
130
|
-
...invalid && {
|
|
160
|
+
...invalid?.['data-invalid-type'] && {
|
|
131
161
|
class: 'invalid',
|
|
132
162
|
'data-invalid-syntax': 'figure',
|
|
133
163
|
...invalid,
|
|
@@ -25,10 +25,10 @@ export const olist: OListParser = lazy(() => block(validate(
|
|
|
25
25
|
export const olist_: OListParser = lazy(() => block(union([
|
|
26
26
|
match(
|
|
27
27
|
new RegExp(`^(?=${openers['.'].source.replace('?:', '')})`),
|
|
28
|
-
memoize(ms => list(type(ms[1]), '.'), ms => type(ms[1]))),
|
|
28
|
+
memoize(ms => list(type(ms[1]), '.'), ms => type(ms[1]).charCodeAt(0) || 0, [])),
|
|
29
29
|
match(
|
|
30
30
|
new RegExp(`^(?=${openers['('].source.replace('?:', '')})`),
|
|
31
|
-
memoize(ms => list(type(ms[1]), '('), ms => type(ms[1]))),
|
|
31
|
+
memoize(ms => list(type(ms[1]), '('), ms => type(ms[1]).charCodeAt(0) || 0, [])),
|
|
32
32
|
])));
|
|
33
33
|
|
|
34
34
|
const list = (type: string, delim: string): OListParser.ListParser => fmap(
|
|
@@ -24,10 +24,10 @@ describe('Unit: parser/header', () => {
|
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
it('basic', () => {
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\n---')), [['<
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\n---\n')), [['<
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\nC:
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('--- \r\na: b \r\n--- \r\n \r\n \r\na')), [['<
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\n---')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\n---\n')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\nC: D e\n---\n')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span><span class="field" data-name="c" data-value="D e"><span class="field-name">C</span>: <span class="field-value">D e</span>\n</span></details></aside>'], '']);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('--- \r\na: b \r\n--- \r\n \r\n \r\na')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], ' \r\na']);
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
});
|
package/src/parser/header.ts
CHANGED
|
@@ -20,10 +20,12 @@ export const header: MarkdownParser.HeaderParser = lazy(() => validate(
|
|
|
20
20
|
fmap(
|
|
21
21
|
some(union([field])),
|
|
22
22
|
es => [
|
|
23
|
-
html('
|
|
24
|
-
html('
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
html('aside', { class: 'header' }, [
|
|
24
|
+
html('details', { open: '' }, defrag([
|
|
25
|
+
html('summary', 'Header'),
|
|
26
|
+
...es,
|
|
27
|
+
])),
|
|
28
|
+
]),
|
|
27
29
|
])))),
|
|
28
30
|
source => [[
|
|
29
31
|
html('pre', {
|
|
@@ -42,7 +44,7 @@ const field: MarkdownParser.HeaderParser.FieldParser = line(source => {
|
|
|
42
44
|
const name = source.slice(0, source.indexOf(':'));
|
|
43
45
|
const value = source.slice(name.length + 1).trim();
|
|
44
46
|
return [[
|
|
45
|
-
html('span', { class: 'field', 'data-name': name, 'data-value': value }, [
|
|
47
|
+
html('span', { class: 'field', 'data-name': name.toLowerCase(), 'data-value': value }, [
|
|
46
48
|
html('span', { class: 'field-name' }, name),
|
|
47
49
|
': ',
|
|
48
50
|
html('span', { class: 'field-value' }, value),
|
|
@@ -19,7 +19,7 @@ export const annotation: AnnotationParser = lazy(() => creator(validate('((', ')
|
|
|
19
19
|
//label: true,
|
|
20
20
|
//link: true,
|
|
21
21
|
//autolink: true,
|
|
22
|
-
}}, state: undefined },
|
|
22
|
+
}}, state: undefined, delimiters: undefined },
|
|
23
23
|
trimSpaceStart(union([some(inline, ')', /^\\?\n/)]))))),
|
|
24
24
|
'))'),
|
|
25
25
|
ns => [html('sup', { class: 'annotation' }, trimNodeEnd(defrag(ns)))]))));
|
|
@@ -16,12 +16,16 @@ describe('Unit: parser/inline/bracket', () => {
|
|
|
16
16
|
assert.deepStrictEqual(inspect(parser('(1)')), [['(', '1', ')'], '']);
|
|
17
17
|
assert.deepStrictEqual(inspect(parser('(10)')), [['(', '10', ')'], '']);
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('(2000)')), [['(', '2000', ')'], '']);
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('(
|
|
19
|
+
assert.deepStrictEqual(inspect(parser('(1, 2)')), [['(', '1, 2', ')'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser('(0-1)')), [['(', '0-1', ')'], '']);
|
|
20
21
|
assert.deepStrictEqual(inspect(parser('(0)-1')), [['(', '0', ')'], '-1']);
|
|
21
22
|
assert.deepStrictEqual(inspect(parser('(0.1)')), [['(', '0.1', ')'], '']);
|
|
22
23
|
assert.deepStrictEqual(inspect(parser('(0.1.2)')), [['(', '0.1.2', ')'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('(1.1, 1.2-1.3, 1.4)')), [['(', '1.1, 1.2-1.3, 1.4', ')'], '']);
|
|
23
25
|
assert.deepStrictEqual(inspect(parser('(a)')), [['(', 'a', ')'], '']);
|
|
24
26
|
assert.deepStrictEqual(inspect(parser('(A)')), [['(', 'A', ')'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('(1,2)')), [['(', '1,2', ')'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('(0-1)')), [['(', '0-1', ')'], '']);
|
|
25
29
|
assert.deepStrictEqual(inspect(parser('(0.1)(A)')), [['(', '0.1', ')', '(', 'A', ')'], '']);
|
|
26
30
|
});
|
|
27
31
|
|
|
@@ -6,14 +6,14 @@ import { str } from '../source';
|
|
|
6
6
|
import { html, defrag } from 'typed-dom';
|
|
7
7
|
import { unshift, push } from 'spica/array';
|
|
8
8
|
|
|
9
|
-
const index = /^(?:[0-9]+(
|
|
9
|
+
const index = /^(?:[0-9]+(?:(?:[.-]|, )[0-9]+)*|[A-Za-z])/;
|
|
10
10
|
|
|
11
11
|
export const bracket: BracketParser = lazy(() => creator(union([
|
|
12
12
|
surround(str('('), str(index), str(')')),
|
|
13
13
|
surround(str('('), some(inline, ')'), str(')'), true,
|
|
14
14
|
([as, bs = [], cs], rest) => [[html('span', { class: 'paren' }, defrag(push(unshift(as, bs), cs)))], rest],
|
|
15
15
|
([as, bs = []], rest) => [unshift(as, bs), rest]),
|
|
16
|
-
surround(str('('), str(new RegExp(index.source.replace(/[09AZaz
|
|
16
|
+
surround(str('('), str(new RegExp(index.source.replace(/[09AZaz., ]|\-(?!\w)/g, c => c.trimStart() && String.fromCharCode(c.charCodeAt(0) + 0xFEE0)))), str(')')),
|
|
17
17
|
surround(str('('), some(inline, ')'), str(')'), true,
|
|
18
18
|
([as, bs = [], cs], rest) => [[html('span', { class: 'paren' }, defrag(push(unshift(as, bs), cs)))], rest],
|
|
19
19
|
([as, bs = []], rest) => [unshift(as, bs), rest]),
|
|
@@ -64,16 +64,16 @@ describe('Unit: parser/inline/reference', () => {
|
|
|
64
64
|
assert.deepStrictEqual(inspect(parser('[[^a|]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
65
65
|
assert.deepStrictEqual(inspect(parser('[[^a,|]]')), [['<sup class="reference" data-abbr="a,"></sup>'], '']);
|
|
66
66
|
assert.deepStrictEqual(inspect(parser('[[^a |]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
67
|
-
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="
|
|
67
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('[[^a|<wbr>]]')), [['<sup class="invalid">^a|</sup>'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('[[^a|<wbr>b]]')), [['<sup class="invalid">^a|<wbr>b</sup>'], '']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser('[[^a|^b]]')), [['<sup class="reference" data-abbr="a">^b</sup>'], '']);
|
|
68
74
|
assert.deepStrictEqual(inspect(parser('[[^a| ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
69
75
|
assert.deepStrictEqual(inspect(parser('[[^a| b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
72
76
|
assert.deepStrictEqual(inspect(parser('[[^a| ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('[[^a| <wbr>]]')), [['<sup class="invalid">^a|</sup>'], '']);
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('[[^a| <wbr>b]]')), [['<sup class="invalid">^a| <wbr>b</sup>'], '']);
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('[[^a| ^b]]')), [['<sup class="reference" data-abbr="a">^b</sup>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('[[^1]]')), [['<sup class="invalid">^1</sup>'], '']);
|
|
78
78
|
assert.deepStrictEqual(inspect(parser('[[^1a]]')), [['<sup class="reference" data-abbr="1a"></sup>'], '']);
|
|
79
79
|
assert.deepStrictEqual(inspect(parser('[[^1 ]]')), [['<sup class="invalid">^1</sup>'], '']);
|
|
@@ -19,7 +19,7 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
|
|
|
19
19
|
//label: true,
|
|
20
20
|
//link: true,
|
|
21
21
|
//autolink: true,
|
|
22
|
-
}}, state: undefined },
|
|
22
|
+
}}, state: undefined, delimiters: undefined },
|
|
23
23
|
subsequence([
|
|
24
24
|
abbr,
|
|
25
25
|
focus(/^\^[^\S\n]*/, source => [['', source], '']),
|
|
@@ -31,7 +31,7 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
|
|
|
31
31
|
const abbr: ReferenceParser.AbbrParser = creator(fmap(verify(surround(
|
|
32
32
|
'^',
|
|
33
33
|
union([str(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]),
|
|
34
|
-
/^\|?(?=]])|^\|[^\S\n]
|
|
34
|
+
/^\|?(?=]])|^\|[^\S\n]*/),
|
|
35
35
|
(_, rest, context) => isStartLoose(rest, context)),
|
|
36
36
|
([source]) => [html('abbr', source)]));
|
|
37
37
|
|
|
@@ -144,6 +144,7 @@ describe('Unit: parser/inline', () => {
|
|
|
144
144
|
assert.deepStrictEqual(inspect(parser('(((a))')), [['(', '<sup class="annotation">a</sup>'], '']);
|
|
145
145
|
assert.deepStrictEqual(inspect(parser('((((a))')), [['(', '(', '<sup class="annotation">a</sup>'], '']);
|
|
146
146
|
assert.deepStrictEqual(inspect(parser('((((a))))')), [['<sup class="annotation"><span class="paren">((a))</span></sup>'], '']);
|
|
147
|
+
assert.deepStrictEqual(inspect(parser('"((""))')), [['"', '<sup class="annotation">""</sup>'], '']);
|
|
147
148
|
assert.deepStrictEqual(inspect(parser('[[[a]]')), [['[', '<sup class="reference">a</sup>'], '']);
|
|
148
149
|
assert.deepStrictEqual(inspect(parser('[[[[a]]')), [['[', '[', '<sup class="reference">a</sup>'], '']);
|
|
149
150
|
assert.deepStrictEqual(inspect(parser('[[[[a]]]]')), [['<sup class="reference">[[a]]</sup>'], '']);
|
|
@@ -151,6 +152,7 @@ describe('Unit: parser/inline', () => {
|
|
|
151
152
|
assert.deepStrictEqual(inspect(parser('[[[]{a}]]')), [['<sup class="reference"><a href="a">a</a></sup>'], '']);
|
|
152
153
|
assert.deepStrictEqual(inspect(parser('[[[a]{b}]]')), [['<sup class="reference"><a href="b">a</a></sup>'], '']);
|
|
153
154
|
assert.deepStrictEqual(inspect(parser('[(([a]{#}))]{#}')), [['<a href="#"><span class="paren">(<span class="paren">([a]{#})</span>)</span></a>'], '']);
|
|
155
|
+
assert.deepStrictEqual(inspect(parser('"[[""]]')), [['"', '<sup class="reference">""</sup>'], '']);
|
|
154
156
|
assert.deepStrictEqual(inspect(parser('<http://host>')), [['<', '<a href="http://host" target="_blank">http://host</a>', '>'], '']);
|
|
155
157
|
assert.deepStrictEqual(inspect(parser('<<small>a<</small>')), [['<', '<small>a<</small>'], '']);
|
|
156
158
|
assert.deepStrictEqual(inspect(parser('<sup><sub>a</sub>')), [['<', 'sup', '>', '<sub>a</sub>'], '']);
|
|
@@ -162,6 +164,8 @@ describe('Unit: parser/inline', () => {
|
|
|
162
164
|
assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a href="/hashtags/a" class="hashtag">#a</a>', '<em>b<br>c</em>', ']'], '']);
|
|
163
165
|
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<em>a<br>b</em>', ']', '<a href="/">/</a>'], '']);
|
|
164
166
|
assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<em>a<br>b</em>', ']', ']'], '']);
|
|
167
|
+
assert.deepStrictEqual(inspect(parser('"[# *"*"*')), [['"', '[#', ' ', '*', '"', '*', '"', '*'], '']);
|
|
168
|
+
assert.deepStrictEqual(inspect(parser('"[# "*"* #]')), [['"', '[#', ' ', '"', '*', '"', '*', ' ', '#', ']'], '']);
|
|
165
169
|
});
|
|
166
170
|
|
|
167
171
|
it('uri', () => {
|