securemark 0.235.3 → 0.237.1
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/dist/securemark.js +220 -114
- package/karma.conf.js +1 -1
- package/markdown.d.ts +11 -10
- package/package-lock.json +91 -54
- package/package.json +1 -1
- package/src/debug.test.ts +3 -1
- package/src/parser/api/bind.ts +7 -3
- package/src/parser/api/parse.test.ts +3 -3
- package/src/parser/api/parse.ts +8 -11
- package/src/parser/block/blockquote.test.ts +1 -1
- package/src/parser/block/codeblock.ts +2 -2
- package/src/parser/block/dlist.ts +1 -3
- package/src/parser/block/extension/aside.test.ts +1 -1
- package/src/parser/block/extension/aside.ts +3 -3
- package/src/parser/block/extension/example.test.ts +2 -2
- package/src/parser/block/extension/example.ts +3 -3
- package/src/parser/block/extension/fig.test.ts +22 -20
- package/src/parser/block/extension/figure.test.ts +33 -31
- package/src/parser/block/extension/figure.ts +33 -4
- package/src/parser/block/extension/message.ts +3 -3
- package/src/parser/block/extension/placeholder.ts +2 -2
- package/src/parser/block/extension/table.ts +6 -6
- package/src/parser/block/extension.ts +1 -1
- package/src/parser/block/heading.test.ts +1 -1
- package/src/parser/block/heading.ts +11 -7
- package/src/parser/block/ilist.ts +1 -1
- package/src/parser/block/mathblock.ts +2 -2
- package/src/parser/block/olist.test.ts +8 -0
- package/src/parser/block/olist.ts +7 -7
- package/src/parser/block/reply/cite.test.ts +4 -0
- package/src/parser/block/reply/cite.ts +1 -0
- package/src/parser/block/reply/quote.ts +1 -1
- package/src/parser/block/table.ts +1 -1
- package/src/parser/block/ulist.test.ts +8 -0
- package/src/parser/block/ulist.ts +7 -7
- package/src/parser/header.ts +1 -1
- package/src/parser/inline/extension/indexee.ts +8 -8
- package/src/parser/inline/extension/placeholder.ts +1 -1
- package/src/parser/inline/html.ts +7 -7
- package/src/parser/inline/htmlentity.ts +1 -1
- package/src/parser/inline/link.ts +4 -4
- package/src/parser/inline/math.ts +1 -1
- package/src/parser/inline/media.ts +3 -3
- package/src/parser/inline/reference.ts +1 -1
- package/src/parser/inline/ruby.ts +1 -1
- package/src/parser/inline.ts +2 -0
- package/src/parser/processor/figure.test.ts +72 -44
- package/src/parser/processor/figure.ts +79 -20
- package/src/parser/processor/footnote.ts +4 -4
- package/src/util/quote.ts +1 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Infinity, Map } from 'spica/global';
|
|
1
|
+
import { Infinity, Set, Map } from 'spica/global';
|
|
2
2
|
import { number as calculate, isFixed } from '../inline/extension/label';
|
|
3
3
|
import { define } from 'typed-dom';
|
|
4
4
|
import { MultiMap } from 'spica/multimap';
|
|
@@ -16,30 +16,68 @@ export function* figure(
|
|
|
16
16
|
footnotes?.annotations.querySelectorAll<HTMLAnchorElement>('a.label:not(.disabled)') ?? []),
|
|
17
17
|
footnotes?.references.querySelectorAll<HTMLAnchorElement>('a.label:not(.disabled)') ?? [])
|
|
18
18
|
.map(el => [el.getAttribute('data-label')!, el]));
|
|
19
|
+
const labels = new Set<string>();
|
|
19
20
|
const numbers = new Map<string, string>();
|
|
20
21
|
let base = '0';
|
|
21
22
|
let bases: readonly string[] = base.split('.');
|
|
22
23
|
let index: readonly string[] = bases;
|
|
23
24
|
// Bug: Firefox
|
|
24
|
-
//for (let defs = target.querySelectorAll(':scope > figure[data-label], :scope > h1, :scope > h2
|
|
25
|
+
//for (let defs = target.querySelectorAll(':scope > figure[data-label], :scope > h1, :scope > h2'), i = 0, len = defs.length; i < len; ++i) {
|
|
25
26
|
for (
|
|
26
|
-
let defs = target.querySelectorAll('figure[data-label], h1, h2
|
|
27
|
+
let defs = target.querySelectorAll('figure[data-label], h1, h2'),
|
|
27
28
|
i = 0, len = defs.length; i < len; ++i) {
|
|
28
29
|
yield;
|
|
29
30
|
const def = defs[i];
|
|
30
31
|
if (def.parentNode !== target) continue;
|
|
31
|
-
|
|
32
|
+
const { tagName, classList } = def;
|
|
33
|
+
if (bases.length === 1 && tagName[0] === 'H') continue;
|
|
32
34
|
assert(base === '0' || bases.length > 1);
|
|
33
|
-
const label =
|
|
35
|
+
const label = tagName === 'FIGURE'
|
|
34
36
|
? def.getAttribute('data-label')!
|
|
35
37
|
: `$-${increment(index, def as HTMLHeadingElement)}`;
|
|
36
38
|
if (label.endsWith('-')) continue;
|
|
37
|
-
if (label.endsWith('-0'))
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
if (label.endsWith('-0')) {
|
|
40
|
+
define(def, {
|
|
41
|
+
class: void classList.add('invalid'),
|
|
42
|
+
'data-invalid-syntax': 'figure',
|
|
43
|
+
'data-invalid-type': 'argument',
|
|
44
|
+
'data-invalid-message': 'Invalid base index',
|
|
45
|
+
hidden: null,
|
|
46
|
+
});
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (tagName === 'FIGURE' && label.endsWith('.0')) {
|
|
41
50
|
// $-x.x.0 is disabled.
|
|
42
|
-
if (label.lastIndexOf('.', label.length - 3)
|
|
51
|
+
if (label.lastIndexOf('.', label.length - 3) !== -1) {
|
|
52
|
+
define(def, {
|
|
53
|
+
class: void classList.add('invalid'),
|
|
54
|
+
'data-invalid-syntax': 'figure',
|
|
55
|
+
'data-invalid-type': 'argument',
|
|
56
|
+
'data-invalid-message': 'Base index must be $-x.0 format',
|
|
57
|
+
hidden: null,
|
|
58
|
+
});
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// $-x.0 after h1-h6.
|
|
62
|
+
if (!/^H[1-6]$/.test(def.previousElementSibling?.tagName ?? '')) {
|
|
63
|
+
define(def, {
|
|
64
|
+
class: void classList.add('invalid'),
|
|
65
|
+
'data-invalid-syntax': 'figure',
|
|
66
|
+
'data-invalid-type': 'position',
|
|
67
|
+
'data-invalid-message': 'Base index declarations must be after level 1 or 2 headings',
|
|
68
|
+
hidden: null,
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
classList.contains('invalid') && define(def, {
|
|
74
|
+
class: void classList.remove('invalid'),
|
|
75
|
+
'data-invalid-syntax': null,
|
|
76
|
+
'data-invalid-type': null,
|
|
77
|
+
'data-invalid-message': null,
|
|
78
|
+
hidden: '',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
43
81
|
}
|
|
44
82
|
const group = label.split('-', 1)[0];
|
|
45
83
|
assert(label && group);
|
|
@@ -52,31 +90,31 @@ export function* figure(
|
|
|
52
90
|
assert(def.matches('figure') || number.endsWith('.0'));
|
|
53
91
|
if (number.endsWith('.0')) {
|
|
54
92
|
assert(isFixed(label));
|
|
55
|
-
|
|
56
|
-
if (group !== '$' ||
|
|
93
|
+
assert(number.split('.').length <= 2);
|
|
94
|
+
if (group !== '$' || tagName === 'FIGURE' && def.firstChild) continue;
|
|
57
95
|
if (number.startsWith('0.')) {
|
|
58
96
|
assert(number.endsWith('.0'));
|
|
59
97
|
number = join(
|
|
60
98
|
index.slice(0)
|
|
61
|
-
.reduce((ns, _, i,
|
|
99
|
+
.reduce((ns, _, i, xs) => {
|
|
62
100
|
i === ns.length
|
|
63
|
-
?
|
|
64
|
-
: ns[i] = +ns[i] > +
|
|
101
|
+
? xs.length = i
|
|
102
|
+
: ns[i] = +ns[i] > +xs[i]
|
|
65
103
|
? ns[i]
|
|
66
104
|
: +ns[i] === 0
|
|
67
|
-
?
|
|
68
|
-
: `${+
|
|
105
|
+
? xs[i]
|
|
106
|
+
: `${+xs[i] + 1}`;
|
|
69
107
|
return ns;
|
|
70
108
|
}, number.split('.')),
|
|
71
109
|
'.');
|
|
72
110
|
}
|
|
73
111
|
base = number;
|
|
74
112
|
bases = index = base.split('.');
|
|
75
|
-
numbers.clear();
|
|
113
|
+
tagName !== 'FIGURE' && numbers.clear();
|
|
76
114
|
assert(def.tagName !== 'FIGURE' || !+def.setAttribute('data-number', number));
|
|
77
115
|
continue;
|
|
78
116
|
}
|
|
79
|
-
assert(def.matches('figure:not([
|
|
117
|
+
assert(def.matches('figure:not([hidden])'));
|
|
80
118
|
assert(number.split('.').pop() !== '0');
|
|
81
119
|
!isFixed(label) && numbers.set(group, number);
|
|
82
120
|
assert(!+def.setAttribute('data-number', number));
|
|
@@ -87,6 +125,27 @@ export function* figure(
|
|
|
87
125
|
define(
|
|
88
126
|
def.querySelector(':scope > figcaption > .figindex')!,
|
|
89
127
|
group === '$' ? figindex : `${figindex}. `);
|
|
128
|
+
if (labels.has(label)) {
|
|
129
|
+
if (classList.contains('invalid') &&
|
|
130
|
+
def.getAttribute('data-invalid-message') !== 'Duplicate label') continue;
|
|
131
|
+
define(def, {
|
|
132
|
+
id: null,
|
|
133
|
+
class: void classList.add('invalid'),
|
|
134
|
+
'data-invalid-syntax': 'figure',
|
|
135
|
+
'data-invalid-type': 'argument',
|
|
136
|
+
'data-invalid-message': 'Duplicate label',
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
labels.add(label);
|
|
142
|
+
define(def, {
|
|
143
|
+
class: void classList.remove('invalid'),
|
|
144
|
+
'data-invalid-syntax': null,
|
|
145
|
+
'data-invalid-type': null,
|
|
146
|
+
'data-invalid-message': null,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
90
149
|
for (const ref of refs.take(label, Infinity)) {
|
|
91
150
|
if (ref.hash.slice(1) === def.id && ref.innerText === figindex) continue;
|
|
92
151
|
yield define(ref,
|
|
@@ -100,7 +159,7 @@ export function* figure(
|
|
|
100
159
|
class: `${ref.className} disabled invalid`,
|
|
101
160
|
'data-invalid-syntax': 'label',
|
|
102
161
|
'data-invalid-type': 'reference',
|
|
103
|
-
'data-invalid-
|
|
162
|
+
'data-invalid-message': 'Missing the target figure',
|
|
104
163
|
});
|
|
105
164
|
}
|
|
106
165
|
yield ref;
|
|
@@ -53,10 +53,10 @@ function build(
|
|
|
53
53
|
style ??= abbr ? 'abbr' : 'count';
|
|
54
54
|
if (style === 'count' ? abbr : !abbr) {
|
|
55
55
|
define(ref, {
|
|
56
|
-
class:
|
|
56
|
+
class: void ref.classList.add('invalid'),
|
|
57
57
|
'data-invalid-syntax': syntax,
|
|
58
58
|
'data-invalid-type': 'style',
|
|
59
|
-
'data-invalid-
|
|
59
|
+
'data-invalid-message': `${syntax[0].toUpperCase() + syntax.slice(1)} style must be consistent`,
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
if (ref.firstElementChild?.getAttribute('hidden') !== '') {
|
|
@@ -96,7 +96,7 @@ function build(
|
|
|
96
96
|
class: void ref.classList.remove('invalid'),
|
|
97
97
|
'data-invalid-syntax': null,
|
|
98
98
|
'data-invalid-type': null,
|
|
99
|
-
'data-invalid-
|
|
99
|
+
'data-invalid-message': null,
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -110,7 +110,7 @@ function build(
|
|
|
110
110
|
: { class: void ref.classList.add('invalid'),
|
|
111
111
|
'data-invalid-syntax': syntax,
|
|
112
112
|
'data-invalid-type': 'content',
|
|
113
|
-
'data-invalid-
|
|
113
|
+
'data-invalid-message': 'Missing the content',
|
|
114
114
|
},
|
|
115
115
|
});
|
|
116
116
|
yield ref.appendChild(html('a', { href: refId && defId && `#${defId}` }, marker(defIndex, abbr)));
|
package/src/util/quote.ts
CHANGED