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.
Files changed (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/securemark.js +220 -114
  3. package/karma.conf.js +1 -1
  4. package/markdown.d.ts +11 -10
  5. package/package-lock.json +91 -54
  6. package/package.json +1 -1
  7. package/src/debug.test.ts +3 -1
  8. package/src/parser/api/bind.ts +7 -3
  9. package/src/parser/api/parse.test.ts +3 -3
  10. package/src/parser/api/parse.ts +8 -11
  11. package/src/parser/block/blockquote.test.ts +1 -1
  12. package/src/parser/block/codeblock.ts +2 -2
  13. package/src/parser/block/dlist.ts +1 -3
  14. package/src/parser/block/extension/aside.test.ts +1 -1
  15. package/src/parser/block/extension/aside.ts +3 -3
  16. package/src/parser/block/extension/example.test.ts +2 -2
  17. package/src/parser/block/extension/example.ts +3 -3
  18. package/src/parser/block/extension/fig.test.ts +22 -20
  19. package/src/parser/block/extension/figure.test.ts +33 -31
  20. package/src/parser/block/extension/figure.ts +33 -4
  21. package/src/parser/block/extension/message.ts +3 -3
  22. package/src/parser/block/extension/placeholder.ts +2 -2
  23. package/src/parser/block/extension/table.ts +6 -6
  24. package/src/parser/block/extension.ts +1 -1
  25. package/src/parser/block/heading.test.ts +1 -1
  26. package/src/parser/block/heading.ts +11 -7
  27. package/src/parser/block/ilist.ts +1 -1
  28. package/src/parser/block/mathblock.ts +2 -2
  29. package/src/parser/block/olist.test.ts +8 -0
  30. package/src/parser/block/olist.ts +7 -7
  31. package/src/parser/block/reply/cite.test.ts +4 -0
  32. package/src/parser/block/reply/cite.ts +1 -0
  33. package/src/parser/block/reply/quote.ts +1 -1
  34. package/src/parser/block/table.ts +1 -1
  35. package/src/parser/block/ulist.test.ts +8 -0
  36. package/src/parser/block/ulist.ts +7 -7
  37. package/src/parser/header.ts +1 -1
  38. package/src/parser/inline/extension/indexee.ts +8 -8
  39. package/src/parser/inline/extension/placeholder.ts +1 -1
  40. package/src/parser/inline/html.ts +7 -7
  41. package/src/parser/inline/htmlentity.ts +1 -1
  42. package/src/parser/inline/link.ts +4 -4
  43. package/src/parser/inline/math.ts +1 -1
  44. package/src/parser/inline/media.ts +3 -3
  45. package/src/parser/inline/reference.ts +1 -1
  46. package/src/parser/inline/ruby.ts +1 -1
  47. package/src/parser/inline.ts +2 -0
  48. package/src/parser/processor/figure.test.ts +72 -44
  49. package/src/parser/processor/figure.ts +79 -20
  50. package/src/parser/processor/footnote.ts +4 -4
  51. 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, :scope > h3'), i = 0, len = defs.length; i < len; ++i) {
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, h3'),
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
- if (bases.length === 1 && def.tagName[0] === 'H') continue;
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 = def.tagName === 'FIGURE'
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')) continue;
38
- if (def.tagName === 'FIGURE' && label.endsWith('.0')) {
39
- // $-x.0 after h1 or h2.
40
- if (label.lastIndexOf('.', label.length - 3) < 0 && !(+def.previousElementSibling?.tagName[1]! <= 2)) continue;
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) > 0) continue;
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
- if (number.split('.').length > 2) continue;
56
- if (group !== '$' || def.tagName === 'FIGURE' && def.firstChild) continue;
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, bs) => {
99
+ .reduce((ns, _, i, xs) => {
62
100
  i === ns.length
63
- ? bs.length = i
64
- : ns[i] = +ns[i] > +bs[i]
101
+ ? xs.length = i
102
+ : ns[i] = +ns[i] > +xs[i]
65
103
  ? ns[i]
66
104
  : +ns[i] === 0
67
- ? bs[i]
68
- : `${+bs[i] + 1}`;
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([style])'));
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-description': 'Missing the reference.',
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: `${ref.className} invalid`,
56
+ class: void ref.classList.add('invalid'),
57
57
  'data-invalid-syntax': syntax,
58
58
  'data-invalid-type': 'style',
59
- 'data-invalid-description': `${syntax[0].toUpperCase() + syntax.slice(1)} style must be consistent.`,
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-description': null,
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-description': 'Missing the content.',
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
@@ -1,3 +1,4 @@
1
+ import { Element } from 'spica/global';
1
2
  import { exec } from '../combinator/data/parser';
2
3
  import { cite } from '../parser/block/reply/cite';
3
4
  import { define } from 'typed-dom';