securemark 0.295.0 → 0.295.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.
Files changed (169) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/design.md +4 -3
  3. package/dist/index.js +529 -484
  4. package/markdown.d.ts +13 -28
  5. package/package.json +1 -1
  6. package/src/combinator/control/constraint/block.test.ts +6 -8
  7. package/src/combinator/control/constraint/contract.ts +7 -7
  8. package/src/combinator/control/constraint/line.test.ts +7 -9
  9. package/src/combinator/control/constraint/line.ts +0 -1
  10. package/src/combinator/control/manipulation/clear.ts +2 -2
  11. package/src/combinator/control/manipulation/convert.ts +3 -3
  12. package/src/combinator/control/manipulation/duplicate.ts +4 -4
  13. package/src/combinator/control/manipulation/fallback.ts +2 -2
  14. package/src/combinator/control/manipulation/fence.ts +3 -3
  15. package/src/combinator/control/manipulation/indent.test.ts +20 -22
  16. package/src/combinator/control/manipulation/indent.ts +2 -2
  17. package/src/combinator/control/manipulation/recovery.ts +3 -3
  18. package/src/combinator/control/manipulation/reverse.ts +2 -2
  19. package/src/combinator/control/manipulation/scope.ts +2 -4
  20. package/src/combinator/control/manipulation/surround.ts +66 -66
  21. package/src/combinator/control/monad/bind.ts +6 -6
  22. package/src/combinator/control/monad/fmap.ts +6 -6
  23. package/src/combinator/data/data.ts +2 -2
  24. package/src/combinator/data/{parser/context/delimiter.ts → delimiter.ts} +4 -4
  25. package/src/combinator/data/parser/context.test.ts +12 -11
  26. package/src/combinator/data/parser/context.ts +13 -14
  27. package/src/combinator/data/parser/inits.ts +5 -5
  28. package/src/combinator/data/parser/sequence.test.ts +12 -13
  29. package/src/combinator/data/parser/sequence.ts +5 -5
  30. package/src/combinator/data/parser/some.test.ts +15 -16
  31. package/src/combinator/data/parser/some.ts +5 -6
  32. package/src/combinator/data/parser/subsequence.test.ts +16 -17
  33. package/src/combinator/data/parser/subsequence.ts +3 -3
  34. package/src/combinator/data/parser/tails.ts +3 -3
  35. package/src/combinator/data/parser/union.test.ts +12 -13
  36. package/src/combinator/data/parser/union.ts +3 -3
  37. package/src/combinator/data/parser.ts +55 -32
  38. package/src/debug.test.ts +5 -3
  39. package/src/parser/api/bind.ts +8 -6
  40. package/src/parser/api/header.ts +4 -4
  41. package/src/parser/api/normalize.ts +2 -1
  42. package/src/parser/api/parse.test.ts +7 -6
  43. package/src/parser/api/parse.ts +9 -8
  44. package/src/parser/autolink.test.ts +18 -18
  45. package/src/parser/block/blockquote.test.ts +79 -79
  46. package/src/parser/block/blockquote.ts +5 -5
  47. package/src/parser/block/codeblock.test.ts +57 -57
  48. package/src/parser/block/codeblock.ts +3 -3
  49. package/src/parser/block/dlist.test.ts +57 -57
  50. package/src/parser/block/dlist.ts +6 -6
  51. package/src/parser/block/extension/aside.test.ts +9 -9
  52. package/src/parser/block/extension/aside.ts +5 -5
  53. package/src/parser/block/extension/example.test.ts +19 -19
  54. package/src/parser/block/extension/example.ts +6 -6
  55. package/src/parser/block/extension/fig.test.ts +36 -36
  56. package/src/parser/block/extension/figbase.test.ts +16 -16
  57. package/src/parser/block/extension/figbase.ts +2 -2
  58. package/src/parser/block/extension/figure.test.ts +63 -63
  59. package/src/parser/block/extension/figure.ts +3 -3
  60. package/src/parser/block/extension/message.test.ts +14 -14
  61. package/src/parser/block/extension/message.ts +5 -5
  62. package/src/parser/block/extension/placeholder.test.ts +13 -13
  63. package/src/parser/block/extension/placeholder.ts +2 -2
  64. package/src/parser/block/extension/table.test.ts +76 -76
  65. package/src/parser/block/extension/table.ts +14 -14
  66. package/src/parser/block/extension.test.ts +24 -24
  67. package/src/parser/block/heading.test.ts +59 -59
  68. package/src/parser/block/heading.ts +7 -7
  69. package/src/parser/block/ilist.test.ts +8 -12
  70. package/src/parser/block/ilist.ts +6 -6
  71. package/src/parser/block/mathblock.test.ts +32 -32
  72. package/src/parser/block/mathblock.ts +3 -3
  73. package/src/parser/block/mediablock.ts +3 -3
  74. package/src/parser/block/olist.test.ts +103 -103
  75. package/src/parser/block/olist.ts +5 -5
  76. package/src/parser/block/pagebreak.test.ts +16 -16
  77. package/src/parser/block/pagebreak.ts +2 -2
  78. package/src/parser/block/paragraph.test.ts +58 -58
  79. package/src/parser/block/paragraph.ts +2 -2
  80. package/src/parser/block/reply/cite.test.ts +40 -40
  81. package/src/parser/block/reply/cite.ts +6 -6
  82. package/src/parser/block/reply/quote.test.ts +51 -51
  83. package/src/parser/block/reply/quote.ts +3 -3
  84. package/src/parser/block/reply.test.ts +20 -20
  85. package/src/parser/block/reply.ts +3 -3
  86. package/src/parser/block/sidefence.test.ts +48 -48
  87. package/src/parser/block/sidefence.ts +4 -4
  88. package/src/parser/block/table.test.ts +50 -50
  89. package/src/parser/block/table.ts +12 -12
  90. package/src/parser/block/ulist.test.ts +53 -53
  91. package/src/parser/block/ulist.ts +6 -6
  92. package/src/parser/block.ts +6 -4
  93. package/src/parser/context.ts +39 -0
  94. package/src/parser/header.test.ts +23 -23
  95. package/src/parser/header.ts +5 -5
  96. package/src/parser/inline/annotation.test.ts +43 -43
  97. package/src/parser/inline/annotation.ts +15 -5
  98. package/src/parser/inline/autolink/account.test.ts +33 -33
  99. package/src/parser/inline/autolink/account.ts +9 -9
  100. package/src/parser/inline/autolink/anchor.test.ts +22 -22
  101. package/src/parser/inline/autolink/anchor.ts +4 -4
  102. package/src/parser/inline/autolink/channel.test.ts +15 -15
  103. package/src/parser/inline/autolink/email.test.ts +37 -37
  104. package/src/parser/inline/autolink/email.ts +2 -2
  105. package/src/parser/inline/autolink/hashnum.test.ts +33 -33
  106. package/src/parser/inline/autolink/hashnum.ts +6 -5
  107. package/src/parser/inline/autolink/hashtag.test.ts +60 -60
  108. package/src/parser/inline/autolink/hashtag.ts +4 -4
  109. package/src/parser/inline/autolink/url.test.ts +75 -75
  110. package/src/parser/inline/autolink/url.ts +4 -4
  111. package/src/parser/inline/bracket.test.ts +70 -70
  112. package/src/parser/inline/bracket.ts +35 -32
  113. package/src/parser/inline/code.test.ts +31 -31
  114. package/src/parser/inline/code.ts +4 -4
  115. package/src/parser/inline/deletion.test.ts +28 -28
  116. package/src/parser/inline/deletion.ts +4 -4
  117. package/src/parser/inline/emphasis.test.ts +40 -40
  118. package/src/parser/inline/emphasis.ts +3 -3
  119. package/src/parser/inline/emstrong.test.ts +101 -101
  120. package/src/parser/inline/emstrong.ts +23 -23
  121. package/src/parser/inline/extension/index.test.ts +92 -92
  122. package/src/parser/inline/extension/index.ts +5 -5
  123. package/src/parser/inline/extension/indexee.ts +5 -5
  124. package/src/parser/inline/extension/indexer.test.ts +24 -24
  125. package/src/parser/inline/extension/indexer.ts +2 -2
  126. package/src/parser/inline/extension/label.test.ts +33 -33
  127. package/src/parser/inline/extension/label.ts +2 -2
  128. package/src/parser/inline/extension/placeholder.test.ts +43 -43
  129. package/src/parser/inline/extension/placeholder.ts +4 -4
  130. package/src/parser/inline/html.test.ts +108 -108
  131. package/src/parser/inline/html.ts +10 -10
  132. package/src/parser/inline/htmlentity.test.ts +38 -38
  133. package/src/parser/inline/htmlentity.ts +5 -5
  134. package/src/parser/inline/insertion.test.ts +28 -28
  135. package/src/parser/inline/insertion.ts +4 -4
  136. package/src/parser/inline/italic.test.ts +55 -55
  137. package/src/parser/inline/italic.ts +4 -4
  138. package/src/parser/inline/link.test.ts +186 -187
  139. package/src/parser/inline/link.ts +16 -17
  140. package/src/parser/inline/mark.test.ts +31 -31
  141. package/src/parser/inline/mark.ts +5 -5
  142. package/src/parser/inline/math.test.ts +132 -132
  143. package/src/parser/inline/math.ts +2 -2
  144. package/src/parser/inline/media.test.ts +91 -91
  145. package/src/parser/inline/media.ts +15 -15
  146. package/src/parser/inline/reference.test.ts +109 -109
  147. package/src/parser/inline/reference.ts +16 -55
  148. package/src/parser/inline/remark.test.ts +50 -50
  149. package/src/parser/inline/remark.ts +5 -5
  150. package/src/parser/inline/ruby.test.ts +45 -45
  151. package/src/parser/inline/ruby.ts +17 -17
  152. package/src/parser/inline/shortmedia.test.ts +10 -10
  153. package/src/parser/inline/strong.test.ts +37 -37
  154. package/src/parser/inline/strong.ts +3 -3
  155. package/src/parser/inline/template.test.ts +23 -23
  156. package/src/parser/inline/template.ts +5 -5
  157. package/src/parser/inline.test.ts +224 -223
  158. package/src/parser/segment.ts +2 -2
  159. package/src/parser/source/escapable.test.ts +24 -24
  160. package/src/parser/source/escapable.ts +8 -8
  161. package/src/parser/source/line.test.ts +18 -18
  162. package/src/parser/source/str.ts +2 -2
  163. package/src/parser/source/text.test.ts +85 -85
  164. package/src/parser/source/text.ts +5 -5
  165. package/src/parser/source/unescapable.test.ts +24 -24
  166. package/src/parser/source/unescapable.ts +5 -5
  167. package/src/parser/util.ts +10 -11
  168. package/src/parser/visibility.ts +8 -9
  169. package/src/util/quote.ts +2 -1
package/markdown.d.ts CHANGED
@@ -1,32 +1,17 @@
1
- import { Parser, List, Data, Ctx, CtxOptions } from './src/combinator/data/parser';
2
- import { Dict } from 'spica/dict';
1
+ import { Parser, List, Node } from './src/combinator/data/parser';
2
+ import { Context } from './src/parser/context';
3
3
 
4
4
  declare abstract class Markdown<T> {
5
5
  private parser?: T;
6
6
  }
7
7
  export interface MarkdownParser extends
8
8
  Markdown<'markdown'>,
9
- Parser<DocumentFragment, MarkdownParser.Context, [
9
+ Parser<DocumentFragment, Context, [
10
10
  MarkdownParser.HeaderParser,
11
11
  MarkdownParser.BlockParser,
12
12
  ]> {
13
13
  }
14
14
  export namespace MarkdownParser {
15
- export interface Context extends Ctx, Options {
16
- buffer?: List<Data<(string | HTMLElement)>>;
17
- sequential?: boolean;
18
- }
19
- export interface Options extends CtxOptions {
20
- readonly host?: URL;
21
- readonly url?: URL;
22
- readonly id?: string;
23
- readonly header?: boolean;
24
- readonly caches?: {
25
- readonly code?: Dict<string, HTMLElement>;
26
- readonly math?: Dict<string, HTMLElement>;
27
- readonly media?: Dict<string, HTMLElement>;
28
- };
29
- }
30
15
  export interface SegmentParser extends
31
16
  Markdown<'segment'>,
32
17
  Parser<string, Context, [
@@ -434,7 +419,7 @@ export namespace MarkdownParser {
434
419
  }
435
420
  export interface RowParser extends
436
421
  Block<'extension/table/row'>,
437
- Parser<List<Data<[string[], string[]?] | HTMLTableCellElement>>, Context, [
422
+ Parser<List<Node<[string[], string[]?] | HTMLTableCellElement>>, Context, [
438
423
  Parser<[string[], string[]?], Context, [
439
424
  AlignParser,
440
425
  ]>,
@@ -791,7 +776,7 @@ export namespace MarkdownParser {
791
776
  export interface TextLinkParser extends
792
777
  Inline<'link/textlink'>,
793
778
  Parser<HTMLAnchorElement | HTMLSpanElement, Context, [
794
- Parser<List<Data<string | HTMLElement>>, Context, [
779
+ Parser<List<Node<string | HTMLElement>>, Context, [
795
780
  InlineParser,
796
781
  ]>,
797
782
  LinkParser.ParameterParser,
@@ -800,7 +785,7 @@ export namespace MarkdownParser {
800
785
  export interface MediaLinkParser extends
801
786
  Inline<'link/medialink'>,
802
787
  Parser<HTMLAnchorElement | HTMLSpanElement, Context, [
803
- Parser<List<Data<HTMLElement>>, Context, [
788
+ Parser<List<Node<HTMLElement>>, Context, [
804
789
  MediaParser,
805
790
  ShortMediaParser,
806
791
  ]>,
@@ -809,7 +794,7 @@ export namespace MarkdownParser {
809
794
  }
810
795
  export interface ContentParser extends
811
796
  Inline<'link/content'>,
812
- Parser<List<Data<string | HTMLElement>>, Context, [
797
+ Parser<List<Node<string | HTMLElement>>, Context, [
813
798
  MediaParser,
814
799
  ShortMediaParser,
815
800
  InlineParser,
@@ -817,13 +802,13 @@ export namespace MarkdownParser {
817
802
  }
818
803
  export interface TextParser extends
819
804
  Inline<'link/text'>,
820
- Parser<List<Data<string>>, Context, [
805
+ Parser<List<Node<string>>, Context, [
821
806
  SourceParser.UnescapableSourceParser,
822
807
  ]> {
823
808
  }
824
809
  export interface ParameterParser extends
825
810
  Inline<'link/parameter'>,
826
- Parser<List<Data<string>>, Context, [
811
+ Parser<List<Node<string>>, Context, [
827
812
  LinkParser.ParameterParser.UriParser,
828
813
  LinkParser.ParameterParser.OptionParser,
829
814
  ]> {
@@ -858,7 +843,7 @@ export namespace MarkdownParser {
858
843
  export namespace MediaParser {
859
844
  export interface TextParser extends
860
845
  Inline<'media/text'>,
861
- Parser<List<Data<string>>, Context, [
846
+ Parser<List<Node<string>>, Context, [
862
847
  UnsafeHTMLEntityParser,
863
848
  TextParser.BracketParser,
864
849
  SourceParser.TxtParser,
@@ -892,7 +877,7 @@ export namespace MarkdownParser {
892
877
  }
893
878
  export interface ParameterParser extends
894
879
  Inline<'media/parameter'>,
895
- Parser<List<Data<string>>, Context, [
880
+ Parser<List<Node<string>>, Context, [
896
881
  LinkParser.ParameterParser.UriParser,
897
882
  ParameterParser.OptionParser,
898
883
  ]> {
@@ -911,8 +896,8 @@ export namespace MarkdownParser {
911
896
  // [AB](a b)
912
897
  Inline<'ruby'>,
913
898
  Parser<HTMLElement, Context, [
914
- Parser<List<Data<string>>, Context, []>,
915
- Parser<List<Data<string>>, Context, []>,
899
+ Parser<List<Node<string>>, Context, []>,
900
+ Parser<List<Node<string>>, Context, []>,
916
901
  ]> {
917
902
  }
918
903
  export namespace RubyParser {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.295.0",
3
+ "version": "0.295.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",
@@ -1,20 +1,18 @@
1
1
  import { block } from './block';
2
- import { List, Data, input } from '../../data/parser';
2
+ import { List, Node, Context, input } from '../../data/parser';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/block', () => {
6
6
  describe('block', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('invalid', () => {
10
- assert.throws(() => block(_ => new List<Data<string>>())(input(' \n', ctx)));
8
+ assert.throws(() => block(_ => new List<Node<string>>())(input(' \n', new Context())));
11
9
  });
12
10
 
13
11
  it('valid', () => {
14
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n', ctx)), ctx), [[], '']);
15
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
16
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '']);
17
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length - 1; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '\n']);
12
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n', new Context())), [[], '']);
13
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
14
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '']);
15
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length - 1; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '\n']);
18
16
  });
19
17
 
20
18
  });
@@ -1,4 +1,4 @@
1
- import { Parser, Input, List, Data, Ctx, Node, Context, failsafe } from '../../data/parser';
1
+ import { Parser, Input, List, Node, Context, failsafe } from '../../data/parser';
2
2
  import { matcher } from '../../../combinator';
3
3
 
4
4
  //export function contract<P extends Parser>(patterns: string | RegExp | (string | RegExp)[], parser: P, cond: (nodes: readonly Data<P>[], rest: string) => boolean): P;
@@ -7,8 +7,8 @@ import { matcher } from '../../../combinator';
7
7
  //}
8
8
 
9
9
  export function validate<P extends Parser>(pattern: string | RegExp, parser: P): P;
10
- export function validate<P extends Parser>(cond: ((input: Input<Context<P>>) => boolean), parser: P): P;
11
- export function validate<N>(pattern: string | RegExp | ((input: Input<Ctx>) => boolean), parser: Parser<N>): Parser<N> {
10
+ export function validate<P extends Parser>(cond: ((input: Input<Parser.Context<P>>) => boolean), parser: P): P;
11
+ export function validate<N>(pattern: string | RegExp | ((input: Input<Context>) => boolean), parser: Parser<N>): Parser<N> {
12
12
  if (typeof pattern === 'function') return guard(pattern, parser);
13
13
  const match = matcher(pattern, false);
14
14
  return input => {
@@ -20,16 +20,16 @@ export function validate<N>(pattern: string | RegExp | ((input: Input<Ctx>) => b
20
20
  };
21
21
  }
22
22
 
23
- function guard<P extends Parser>(f: (input: Input<Context<P>>) => boolean, parser: P): P;
24
- function guard<N>(f: (input: Input<Ctx>) => boolean, parser: Parser<N>): Parser<N> {
23
+ function guard<P extends Parser>(f: (input: Input<Parser.Context<P>>) => boolean, parser: P): P;
24
+ function guard<N>(f: (input: Input<Context>) => boolean, parser: Parser<N>): Parser<N> {
25
25
  return input =>
26
26
  f(input)
27
27
  ? parser(input)
28
28
  : undefined;
29
29
  }
30
30
 
31
- export function verify<P extends Parser>(parser: P, cond: (nodes: List<Data<Node<P>>>, context: Context<P>) => boolean): P;
32
- export function verify<N>(parser: Parser<N>, cond: (nodes: List<Data<N>>, context: Ctx) => boolean): Parser<N> {
31
+ export function verify<P extends Parser>(parser: P, cond: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => boolean): P;
32
+ export function verify<N>(parser: Parser<N>, cond: (nodes: List<Node<N>>, context: Context) => boolean): Parser<N> {
33
33
  assert(parser);
34
34
  return failsafe(input => {
35
35
  const { context } = input;
@@ -1,21 +1,19 @@
1
- import { List, Data, input } from '../../data/parser';
1
+ import { List, Node, Context, input } from '../../data/parser';
2
2
  import { line } from './line';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/line', () => {
6
6
  describe('line', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('invalid', () => {
10
- assert.deepStrictEqual(inspect(line(_ => new List<Data<string>>())(input('', ctx)), ctx), undefined);
8
+ assert.deepStrictEqual(inspect(line(_ => new List<Node<string>>()), input('', new Context())), undefined);
11
9
  });
12
10
 
13
11
  it('valid', () => {
14
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' ', ctx)), ctx), [[], '']);
15
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n', ctx)), ctx), [[], '']);
16
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '\n']);
17
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
18
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length - 1; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
12
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' ', new Context())), [[], '']);
13
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n', new Context())), [[], '']);
14
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '\n']);
15
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
16
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length - 1; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
19
17
  });
20
18
 
21
19
  });
@@ -7,7 +7,6 @@ export function line<N>(parser: Parser<N>): Parser<N> {
7
7
  const { source, position } = context;
8
8
  if (position === source.length) return;
9
9
  const line = firstline(source, position);
10
- context.offset ??= 0;
11
10
  context.offset += position;
12
11
  const result = parser(input(line, context));
13
12
  context.position += position;
@@ -1,5 +1,5 @@
1
- import { Parser, List, Ctx } from '../../data/parser';
1
+ import { Parser, List, Context } from '../../data/parser';
2
2
 
3
- export function clear<D extends Parser<unknown, C>[], C extends Ctx>(parser: Parser<unknown, C, D>): Parser<never, C, D> {
3
+ export function clear<D extends Parser<unknown, C>[], C extends Context>(parser: Parser<unknown, C, D>): Parser<never, C, D> {
4
4
  return input => parser(input) && new List();
5
5
  }
@@ -1,7 +1,7 @@
1
- import { Parser, List, Ctx, Context, subinput, failsafe } from '../../data/parser';
1
+ import { Parser, List, Context, subinput, failsafe } from '../../data/parser';
2
2
 
3
- export function convert<P extends Parser>(conv: (source: string, context: Context<P>) => string, parser: P, empty?: boolean): P;
4
- export function convert<N>(conv: (source: string, context: Ctx) => string, parser: Parser<N>, empty = false): Parser<N> {
3
+ export function convert<P extends Parser>(conv: (source: string, context: Parser.Context<P>) => string, parser: P, empty?: boolean): P;
4
+ export function convert<N>(conv: (source: string, context: Context) => string, parser: Parser<N>, empty = false): Parser<N> {
5
5
  assert(parser);
6
6
  return failsafe(input => {
7
7
  const { context } = input;
@@ -1,7 +1,7 @@
1
- import { Parser, List, Data, Ctx } from '../../data/parser';
1
+ import { Parser, List, Node, Context } from '../../data/parser';
2
2
  import { fmap } from '../monad/fmap';
3
3
 
4
- export function dup<N, C extends Ctx, D extends Parser<unknown, C>[]>(parser: Parser<N, C, D>): Parser<List<Data<N>>, C, D>;
5
- export function dup<N>(parser: Parser<N>): Parser<List<Data<N>>> {
6
- return fmap(parser, nodes => new List([new Data(nodes)]));
4
+ export function dup<N, C extends Context, D extends Parser<unknown, C>[]>(parser: Parser<N, C, D>): Parser<List<Node<N>>, C, D>;
5
+ export function dup<N>(parser: Parser<N>): Parser<List<Node<N>>> {
6
+ return fmap(parser, nodes => new List([new Node(nodes)]));
7
7
  }
@@ -1,7 +1,7 @@
1
- import { Parser, Node, Context } from '../../data/parser';
1
+ import { Parser } from '../../data/parser';
2
2
  import { union } from '../../data/parser/union';
3
3
 
4
- export function fallback<P extends Parser>(parser: P, otherwise: Parser<Node<P>, Context<P>>): P;
4
+ export function fallback<P extends Parser>(parser: P, otherwise: Parser<Parser.Node<P>, Parser.Context<P>>): P;
5
5
  export function fallback<N>(parser: Parser<N>, otherwise: Parser<N>): Parser<N> {
6
6
  return union([parser, otherwise]);
7
7
  }
@@ -1,9 +1,9 @@
1
- import { Parser, List, Data, Ctx, failsafe } from '../../data/parser';
1
+ import { Parser, List, Node, Context, failsafe } from '../../data/parser';
2
2
  import { consume } from '../../../combinator';
3
3
  import { firstline, isBlankline } from '../constraint/line';
4
4
  import { push } from 'spica/array';
5
5
 
6
- export function fence<C extends Ctx, D extends Parser<unknown, C>[]>(opener: RegExp, limit: number, separation = true): Parser<string, C, D> {
6
+ export function fence<C extends Context, D extends Parser<unknown, C>[]>(opener: RegExp, limit: number, separation = true): Parser<string, C, D> {
7
7
  assert(!opener.flags.match(/[gm]/) && opener.sticky && !opener.source.startsWith('^'));
8
8
  return failsafe(input => {
9
9
  const { context } = input;
@@ -49,6 +49,6 @@ export function fence<C extends Ctx, D extends Parser<unknown, C>[]>(opener: Reg
49
49
  }
50
50
  context.position += line.length;
51
51
  }
52
- return new List(push([block, overflow, closer], matches).map(str => new Data(str)));
52
+ return new List(push([block, overflow, closer], matches).map(str => new Node(str)));
53
53
  });
54
54
  }
@@ -1,31 +1,29 @@
1
1
  import { indent } from './indent';
2
- import { List, Data, input } from '../../data/parser';
2
+ import { List, Node, Context, input } from '../../data/parser';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/indent', () => {
6
6
  describe('indent', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('valid', () => {
10
- const parser = indent(({ context }) => { context.position = context.source.length; return new List([new Data(context.source)]); });
11
- assert.deepStrictEqual(inspect(parser(input('', ctx)), ctx), undefined);
12
- assert.deepStrictEqual(inspect(parser(input(' ', ctx)), ctx), undefined);
13
- assert.deepStrictEqual(inspect(parser(input(' ', ctx)), ctx), undefined);
14
- assert.deepStrictEqual(inspect(parser(input('a ', ctx)), ctx), undefined);
15
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
16
- assert.deepStrictEqual(inspect(parser(input(' a ', ctx)), ctx), [['a '], '']);
17
- assert.deepStrictEqual(inspect(parser(input(' a\n', ctx)), ctx), [['a'], '']);
18
- assert.deepStrictEqual(inspect(parser(input(' a \n', ctx)), ctx), [['a '], '']);
19
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
20
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
21
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
22
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [[' a'], '']);
23
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\na'], '']);
24
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\n a'], '']);
25
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\n a'], '']);
26
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a'], ' a']);
27
- assert.deepStrictEqual(inspect(parser(input(' \ta', ctx)), ctx), [['\ta'], '']);
28
- assert.deepStrictEqual(inspect(parser(input('\ta', ctx)), ctx), [['a'], '']);
8
+ const parser = indent(({ context }) => { context.position = context.source.length; return new List([new Node(context.source)]); });
9
+ assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
10
+ assert.deepStrictEqual(inspect(parser, input(' ', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input(' ', new Context())), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('a ', new Context())), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
14
+ assert.deepStrictEqual(inspect(parser, input(' a ', new Context())), [['a '], '']);
15
+ assert.deepStrictEqual(inspect(parser, input(' a\n', new Context())), [['a'], '']);
16
+ assert.deepStrictEqual(inspect(parser, input(' a \n', new Context())), [['a '], '']);
17
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
18
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
19
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
20
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [[' a'], '']);
21
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\na'], '']);
22
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\n a'], '']);
23
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\n a'], '']);
24
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a'], ' a']);
25
+ assert.deepStrictEqual(inspect(parser, input(' \ta', new Context())), [['\ta'], '']);
26
+ assert.deepStrictEqual(inspect(parser, input('\ta', new Context())), [['a'], '']);
29
27
  });
30
28
 
31
29
  });
@@ -1,4 +1,4 @@
1
- import { Parser, List, Data, subinput, failsafe } from '../../data/parser';
1
+ import { Parser, List, Node, subinput, failsafe } from '../../data/parser';
2
2
  import { some } from '../../data/parser/some';
3
3
  import { block } from '../constraint/block';
4
4
  import { line } from '../constraint/line';
@@ -24,7 +24,7 @@ export function indent<N>(opener: RegExp | Parser<N>, parser: Parser<N> | boolea
24
24
  some(line(open(indent, ({ context }) => {
25
25
  const { source, position } = context;
26
26
  context.position = source.length;
27
- return new List([new Data(source.slice(position))]);
27
+ return new List([new Node(source.slice(position))]);
28
28
  }))),
29
29
  ([indent]) => indent.length * 2 + -(indent[0] === ' '), [], 2 ** 4 - 1)), separation),
30
30
  (lines, context) =>
@@ -1,7 +1,7 @@
1
- import { Parser, Input, Result, Ctx, Node, Context } from '../../data/parser';
1
+ import { Parser, Input, Result, Context } from '../../data/parser';
2
2
 
3
- export function recover<P extends Parser>(parser: P, fallback: (input: Input<Context<P>>, reason: unknown) => Result<Node<P>>): P;
4
- export function recover<N>(parser: Parser<N>, fallback: (input: Input<Ctx>, reason: unknown) => Result<N>): Parser<N> {
3
+ export function recover<P extends Parser>(parser: P, fallback: (input: Input<Parser.Context<P>>, reason: unknown) => Result<Parser.Node<P>>): P;
4
+ export function recover<N>(parser: Parser<N>, fallback: (input: Input<Context>, reason: unknown) => Result<N>): Parser<N> {
5
5
  return input => {
6
6
  const { context } = input;
7
7
  const { source, position } = context;
@@ -1,8 +1,8 @@
1
- import { Parser, List, Data } from '../../data/parser';
1
+ import { Parser, List, Node } from '../../data/parser';
2
2
  import { fmap } from '../monad/fmap';
3
3
 
4
4
  export function reverse<P extends Parser>(parser: P): P;
5
5
  export function reverse<N>(parser: Parser<N>): Parser<N> {
6
- return fmap(parser, nodes => nodes.foldr((node, acc) => acc.push(nodes.delete(node)) && acc, new List<Data<N>>()));
6
+ return fmap(parser, nodes => nodes.foldr((node, acc) => acc.push(nodes.delete(node)) && acc, new List<Node<N>>()));
7
7
  }
8
8
 
@@ -1,4 +1,4 @@
1
- import { Parser, Context, input, failsafe } from '../../data/parser';
1
+ import { Parser, input, failsafe } from '../../data/parser';
2
2
  import { matcher } from '../../../combinator';
3
3
 
4
4
  export function focus<P extends Parser>(scope: string | RegExp, parser: P, slice?: boolean): P;
@@ -18,7 +18,6 @@ export function focus<N>(scope: string | RegExp, parser: Parser<N>, slice = true
18
18
  context.position += result && context.position === position ? range : 0;
19
19
  return result;
20
20
  }
21
- context.offset ??= 0;
22
21
  context.offset += position;
23
22
  const result = parser(input(src, context));
24
23
  context.position += position;
@@ -30,7 +29,7 @@ export function focus<N>(scope: string | RegExp, parser: Parser<N>, slice = true
30
29
  }
31
30
 
32
31
  //export function rewrite<N, C extends Ctx, D extends Parser<unknown, C>[]>(scope: Parser<unknown, C, D>, parser: Parser<N, C, never>): Parser<N, C, D>;
33
- export function rewrite<P extends Parser>(scope: Parser<unknown, Context<P>>, parser: P, slice?: boolean): P;
32
+ export function rewrite<P extends Parser>(scope: Parser<unknown, Parser.Context<P>>, parser: P, slice?: boolean): P;
34
33
  export function rewrite<N>(scope: Parser, parser: Parser<N>, slice = true): Parser<N> {
35
34
  assert(scope);
36
35
  assert(parser);
@@ -51,7 +50,6 @@ export function rewrite<N>(scope: Parser, parser: Parser<N>, slice = true): Pars
51
50
  const src = source.slice(position, context.position);
52
51
  assert(src !== '');
53
52
  assert(source.startsWith(src, position));
54
- context.offset ??= 0;
55
53
  context.offset += position;
56
54
  const res2 = parser(input(src, context));
57
55
  context.position += position;