securemark 0.294.10 → 0.295.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/design.md +5 -5
  3. package/dist/index.js +141 -127
  4. package/package.json +1 -1
  5. package/src/combinator/control/constraint/block.ts +1 -1
  6. package/src/combinator/control/constraint/contract.ts +5 -6
  7. package/src/combinator/control/constraint/line.ts +1 -2
  8. package/src/combinator/control/manipulation/convert.ts +1 -1
  9. package/src/combinator/control/manipulation/fallback.ts +1 -1
  10. package/src/combinator/control/manipulation/indent.ts +2 -2
  11. package/src/combinator/control/manipulation/lazy.ts +1 -1
  12. package/src/combinator/control/manipulation/match.ts +2 -5
  13. package/src/combinator/control/manipulation/recovery.ts +1 -1
  14. package/src/combinator/control/manipulation/reverse.ts +1 -1
  15. package/src/combinator/control/manipulation/scope.ts +3 -7
  16. package/src/combinator/control/manipulation/surround.ts +51 -62
  17. package/src/combinator/control/monad/bind.ts +7 -12
  18. package/src/combinator/control/monad/fmap.ts +4 -4
  19. package/src/combinator/data/parser/context.ts +12 -12
  20. package/src/combinator/data/parser/inits.ts +3 -6
  21. package/src/combinator/data/parser/sequence.ts +3 -6
  22. package/src/combinator/data/parser/some.ts +2 -2
  23. package/src/combinator/data/parser/subsequence.ts +1 -1
  24. package/src/combinator/data/parser/tails.ts +1 -1
  25. package/src/combinator/data/parser/union.ts +1 -1
  26. package/src/combinator/data/parser.ts +10 -9
  27. package/src/parser/api/body.test.ts +1 -1
  28. package/src/parser/api/header.test.ts +2 -2
  29. package/src/parser/api/normalize.test.ts +2 -0
  30. package/src/parser/api/normalize.ts +1 -1
  31. package/src/parser/context.ts +9 -6
  32. package/src/parser/header.test.ts +2 -2
  33. package/src/parser/header.ts +3 -3
  34. package/src/parser/inline/annotation.ts +1 -1
  35. package/src/parser/inline/autolink/account.ts +3 -3
  36. package/src/parser/inline/autolink/anchor.ts +1 -1
  37. package/src/parser/inline/autolink/email.ts +1 -1
  38. package/src/parser/inline/autolink/hashnum.ts +1 -1
  39. package/src/parser/inline/autolink/hashtag.ts +1 -1
  40. package/src/parser/inline/autolink/url.ts +9 -10
  41. package/src/parser/inline/bracket.ts +31 -19
  42. package/src/parser/inline/extension/index.ts +3 -3
  43. package/src/parser/inline/extension/indexee.ts +1 -1
  44. package/src/parser/inline/extension/label.ts +1 -1
  45. package/src/parser/inline/extension/placeholder.ts +1 -1
  46. package/src/parser/inline/htmlentity.ts +1 -1
  47. package/src/parser/inline/link.ts +12 -14
  48. package/src/parser/inline/math.ts +2 -2
  49. package/src/parser/inline/media.ts +15 -17
  50. package/src/parser/inline/reference.ts +9 -9
  51. package/src/parser/inline/ruby.ts +4 -4
  52. package/src/parser/inline/template.ts +6 -10
  53. package/src/parser/visibility.ts +2 -2
@@ -30,24 +30,22 @@ export const media: MediaParser = lazy(() => constraint(State.media, open(
30
30
  ]), ']')),
31
31
  ']',
32
32
  true,
33
- [3 | Backtrack.escbracket],
34
- ([, ns = new List()], context) =>
35
- context.linebreak === 0
36
- ? ns
37
- : undefined)),
33
+ [3 | Backtrack.escapable, 2 | Backtrack.ruby],
34
+ ([, ns = new List()], context) => {
35
+ if (context.linebreak !== 0) {
36
+ const head = context.position - context.range!;
37
+ return void setBacktrack(context, 2 | Backtrack.link | Backtrack.ruby, head);
38
+ }
39
+ return ns;
40
+ })),
38
41
  dup(surround(
39
42
  /{(?![{}])/y,
40
43
  inits([uri, some(option)]),
41
44
  / ?}/y,
42
- false,
43
- [3 | Backtrack.link],
45
+ false, [],
44
46
  undefined,
45
- ([as, bs], context) => {
46
- if (!bs) return;
47
- const head = context.position - context.range!;
48
- setBacktrack(context, [2 | Backtrack.link], head);
49
- return as.import(bs).push(new Data(Command.Cancel)) && as;
50
- })),
47
+ ([as, bs]) =>
48
+ bs && as.import(bs).push(new Data(Command.Cancel)) && as)),
51
49
  ]),
52
50
  nodes =>
53
51
  nodes.length === 1
@@ -111,13 +109,13 @@ export const media: MediaParser = lazy(() => constraint(State.media, open(
111
109
 
112
110
  const bracket: MediaParser.TextParser.BracketParser = lazy(() => recursion(Recursion.terminal, union([
113
111
  surround(str('('), some(union([unsafehtmlentity, bracket, txt]), ')'), str(')'),
114
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
112
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
115
113
  surround(str('['), some(union([unsafehtmlentity, bracket, txt]), ']'), str(']'),
116
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
114
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
117
115
  surround(str('{'), some(union([unsafehtmlentity, bracket, txt]), '}'), str('}'),
118
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
116
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
119
117
  surround(str('"'), precedence(2, some(union([unsafehtmlentity, txt]), '"')), str('"'),
120
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
118
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
121
119
  ])));
122
120
 
123
121
  const option: MediaParser.ParameterParser.OptionParser = lazy(() => union([
@@ -18,7 +18,7 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
18
18
  ]))),
19
19
  ']]',
20
20
  false,
21
- [1 | Backtrack.bracket, 3 | Backtrack.doublebracket],
21
+ [1 | Backtrack.common, 3 | Backtrack.doublebracket],
22
22
  ([, ns], context) => {
23
23
  const { position, range = 0, linebreak = 0 } = context;
24
24
  if (linebreak === 0) {
@@ -26,7 +26,7 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
26
26
  }
27
27
  else {
28
28
  const head = position - range;
29
- setBacktrack(context, [2 | Backtrack.link], head, 2);
29
+ setBacktrack(context, 2 | Backtrack.link, head, 2);
30
30
  }
31
31
  },
32
32
  ([as, bs], context) => {
@@ -34,10 +34,10 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
34
34
  const { source, position, range = 0, linebreak = 0, state = 0 } = context;
35
35
  const head = position - range;
36
36
  if (source[position] !== ']') {
37
- setBacktrack(context, [2 | Backtrack.bracket], head, 2);
37
+ setBacktrack(context, 2 | Backtrack.common, head, 2);
38
38
  }
39
39
  else if (linebreak !== 0) {
40
- setBacktrack(context, [2 | Backtrack.link], head, 2);
40
+ setBacktrack(context, 2 | Backtrack.link | Backtrack.ruby, head, 2);
41
41
  }
42
42
  else {
43
43
  assert(source[position] === ']');
@@ -47,22 +47,22 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
47
47
  context.position += 1;
48
48
  let result: ReturnType<typeof textlink>;
49
49
  if (source[context.position] !== '{') {
50
- setBacktrack(context, [2 | Backtrack.link], head + 1);
50
+ setBacktrack(context, 2 | Backtrack.link, head + 1);
51
51
  result = new List();
52
52
  }
53
53
  else {
54
- result = !isBacktrack(context, [1 | Backtrack.link])
54
+ result = !isBacktrack(context, 1 | Backtrack.link)
55
55
  ? textlink({ context })
56
56
  : undefined;
57
57
  context.range = range;
58
58
  if (!result) {
59
- setBacktrack(context, [2 | Backtrack.link], head + 1);
59
+ setBacktrack(context, 2 | Backtrack.link, head + 1);
60
60
  result = new List();
61
61
  }
62
62
  }
63
63
  assert(result);
64
64
  if (context.position === source.length) {
65
- setBacktrack(context, [2 | Backtrack.link], head);
65
+ setBacktrack(context, 2 | Backtrack.link, head);
66
66
  }
67
67
  else {
68
68
  assert(state ^ State.link);
@@ -74,7 +74,7 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
74
74
  ([, cs = new List(), ds]) =>
75
75
  cs.import(ds),
76
76
  ([, cs = new List()]) => {
77
- setBacktrack(context, [2 | Backtrack.link], head);
77
+ setBacktrack(context, 2 | Backtrack.link, head);
78
78
  return cs;
79
79
  })
80
80
  ({ context });
@@ -13,7 +13,7 @@ export const ruby: RubyParser = lazy(() => bind(
13
13
  dup(surround(
14
14
  '[', text, ']',
15
15
  false,
16
- [1 | Backtrack.bracket, 3 | Backtrack.ruby],
16
+ [1 | Backtrack.common, 3 | Backtrack.ruby],
17
17
  ([, ns]) => {
18
18
  ns && ns.last?.value === '' && ns.pop();
19
19
  return isTightNodeStart(ns) ? ns : undefined;
@@ -21,12 +21,12 @@ export const ruby: RubyParser = lazy(() => bind(
21
21
  dup(surround(
22
22
  '(', text, ')',
23
23
  false,
24
- [1 | Backtrack.bracket, 3 | Backtrack.ruby])),
24
+ [3 | Backtrack.ruby])),
25
25
  ]),
26
26
  ([{ value: texts }, { value: rubies = undefined } = {}], context) => {
27
27
  if (rubies === undefined) {
28
28
  const head = context.position - context.range!;
29
- return void setBacktrack(context, [2 | Backtrack.ruby], head);
29
+ return void setBacktrack(context, 2 | Backtrack.ruby, head);
30
30
  }
31
31
  switch (true) {
32
32
  case texts.length >= rubies.length:
@@ -62,7 +62,7 @@ export const ruby: RubyParser = lazy(() => bind(
62
62
  }
63
63
  }));
64
64
 
65
- const delimiter = /[$"`\[\](){}<>()[]{}]|\\?\n/y;
65
+ const delimiter = /[$"`\[\](){}<>()[]{}|]|\\?\n/y;
66
66
 
67
67
  const text: RubyParser.TextParser = input => {
68
68
  const { context } = input;
@@ -11,8 +11,7 @@ export const template: TemplateParser = lazy(() => surround(
11
11
  precedence(1,
12
12
  some(union([bracket, escsource]), '}')),
13
13
  str('}}'),
14
- true,
15
- [3 | Backtrack.doublebracket, 3 | Backtrack.escbracket],
14
+ true, [],
16
15
  ([as, bs = new List(), cs]) => new List([
17
16
  new Data(html('span', { class: 'template' }, defrag(unwrap(as.import(bs as List<Data<string>>).import(cs)))))
18
17
  ]),
@@ -28,20 +27,17 @@ export const template: TemplateParser = lazy(() => surround(
28
27
 
29
28
  const bracket: TemplateParser.BracketParser = lazy(() => union([
30
29
  surround(str('('), recursion(Recursion.terminal, some(union([bracket, escsource]), ')')), str(')'),
31
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
30
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
32
31
  surround(str('['), recursion(Recursion.terminal, some(union([bracket, escsource]), ']')), str(']'),
33
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
32
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
34
33
  surround(str('{'), recursion(Recursion.terminal, some(union([bracket, escsource]), '}')), str('}'),
35
- true, [3 | Backtrack.escbracket], undefined, () => new List()),
34
+ true, [3 | Backtrack.escapable], undefined, () => new List()),
36
35
  surround(
37
36
  str('"'),
38
37
  precedence(2, recursion(Recursion.terminal, some(escsource, /["\n]/y, [['"', 2], ['\n', 3]]))),
39
38
  str('"'),
40
39
  true,
41
- [3 | Backtrack.escbracket],
42
- ([as, bs = new List(), cs], context) =>
43
- context.linebreak === 0
44
- ? as.import(bs as List<Data<string>>).import(cs)
45
- : (context.position -= 1, as.import(bs as List<Data<string>>)),
40
+ [3 | Backtrack.escapable],
41
+ undefined,
46
42
  ([as, bs]) => bs && as.import(bs as List<Data<string>>)),
47
43
  ]));
@@ -50,7 +50,7 @@ export function blankWith(starts: '' | '\n', delimiter?: string | RegExp): RegEx
50
50
  // return isTightStart({ source: source.replace(blank.start, ''), context }, except);
51
51
  //}, ({ source }, except = '') => `${source}${Command.Separator}${except}`);
52
52
 
53
- export function tightStart<P extends Parser<unknown>>(parser: P, except?: string): P;
53
+ export function tightStart<P extends Parser>(parser: P, except?: string): P;
54
54
  export function tightStart<N>(parser: Parser<N>, except?: string): Parser<N> {
55
55
  return input =>
56
56
  isTightStart(input, except)
@@ -140,7 +140,7 @@ export function trimBlank<P extends Parser<HTMLElement | string>>(parser: P): P;
140
140
  export function trimBlank<N extends HTMLElement | string>(parser: Parser<N>): Parser<N> {
141
141
  return trimBlankStart(trimBlankEnd(parser));
142
142
  }
143
- export function trimBlankStart<P extends Parser<unknown>>(parser: P): P;
143
+ export function trimBlankStart<P extends Parser>(parser: P): P;
144
144
  export function trimBlankStart<N>(parser: Parser<N>): Parser<N> {
145
145
  return failsafe(input => {
146
146
  const { context } = input;