securemark 0.295.1 → 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.
- package/CHANGELOG.md +4 -0
- package/design.md +4 -3
- package/dist/index.js +514 -459
- package/markdown.d.ts +13 -28
- package/package.json +1 -1
- package/src/combinator/control/constraint/block.test.ts +6 -8
- package/src/combinator/control/constraint/contract.ts +7 -7
- package/src/combinator/control/constraint/line.test.ts +7 -9
- package/src/combinator/control/constraint/line.ts +0 -1
- package/src/combinator/control/manipulation/clear.ts +2 -2
- package/src/combinator/control/manipulation/convert.ts +3 -3
- package/src/combinator/control/manipulation/duplicate.ts +4 -4
- package/src/combinator/control/manipulation/fallback.ts +2 -2
- package/src/combinator/control/manipulation/fence.ts +3 -3
- package/src/combinator/control/manipulation/indent.test.ts +20 -22
- package/src/combinator/control/manipulation/indent.ts +2 -2
- package/src/combinator/control/manipulation/recovery.ts +3 -3
- package/src/combinator/control/manipulation/reverse.ts +2 -2
- package/src/combinator/control/manipulation/scope.ts +2 -4
- package/src/combinator/control/manipulation/surround.ts +32 -32
- package/src/combinator/control/monad/bind.ts +6 -6
- package/src/combinator/control/monad/fmap.ts +6 -6
- package/src/combinator/data/data.ts +2 -2
- package/src/combinator/data/{parser/context/delimiter.ts → delimiter.ts} +4 -4
- package/src/combinator/data/parser/context.test.ts +12 -11
- package/src/combinator/data/parser/context.ts +13 -14
- package/src/combinator/data/parser/inits.ts +5 -5
- package/src/combinator/data/parser/sequence.test.ts +12 -13
- package/src/combinator/data/parser/sequence.ts +5 -5
- package/src/combinator/data/parser/some.test.ts +15 -16
- package/src/combinator/data/parser/some.ts +5 -6
- package/src/combinator/data/parser/subsequence.test.ts +16 -17
- package/src/combinator/data/parser/subsequence.ts +3 -3
- package/src/combinator/data/parser/tails.ts +3 -3
- package/src/combinator/data/parser/union.test.ts +12 -13
- package/src/combinator/data/parser/union.ts +3 -3
- package/src/combinator/data/parser.ts +55 -32
- package/src/debug.test.ts +5 -3
- package/src/parser/api/bind.ts +8 -6
- package/src/parser/api/header.ts +4 -4
- package/src/parser/api/normalize.ts +2 -1
- package/src/parser/api/parse.test.ts +7 -6
- package/src/parser/api/parse.ts +9 -8
- package/src/parser/autolink.test.ts +18 -18
- package/src/parser/block/blockquote.test.ts +79 -79
- package/src/parser/block/blockquote.ts +5 -5
- package/src/parser/block/codeblock.test.ts +57 -57
- package/src/parser/block/codeblock.ts +3 -3
- package/src/parser/block/dlist.test.ts +57 -57
- package/src/parser/block/dlist.ts +6 -6
- package/src/parser/block/extension/aside.test.ts +9 -9
- package/src/parser/block/extension/aside.ts +5 -5
- package/src/parser/block/extension/example.test.ts +19 -19
- package/src/parser/block/extension/example.ts +6 -6
- package/src/parser/block/extension/fig.test.ts +36 -36
- package/src/parser/block/extension/figbase.test.ts +16 -16
- package/src/parser/block/extension/figbase.ts +2 -2
- package/src/parser/block/extension/figure.test.ts +63 -63
- package/src/parser/block/extension/figure.ts +3 -3
- package/src/parser/block/extension/message.test.ts +14 -14
- package/src/parser/block/extension/message.ts +5 -5
- package/src/parser/block/extension/placeholder.test.ts +13 -13
- package/src/parser/block/extension/placeholder.ts +2 -2
- package/src/parser/block/extension/table.test.ts +76 -76
- package/src/parser/block/extension/table.ts +14 -14
- package/src/parser/block/extension.test.ts +24 -24
- package/src/parser/block/heading.test.ts +59 -59
- package/src/parser/block/heading.ts +7 -7
- package/src/parser/block/ilist.test.ts +8 -12
- package/src/parser/block/ilist.ts +6 -6
- package/src/parser/block/mathblock.test.ts +32 -32
- package/src/parser/block/mathblock.ts +3 -3
- package/src/parser/block/mediablock.ts +3 -3
- package/src/parser/block/olist.test.ts +103 -103
- package/src/parser/block/olist.ts +5 -5
- package/src/parser/block/pagebreak.test.ts +16 -16
- package/src/parser/block/pagebreak.ts +2 -2
- package/src/parser/block/paragraph.test.ts +58 -58
- package/src/parser/block/paragraph.ts +2 -2
- package/src/parser/block/reply/cite.test.ts +40 -40
- package/src/parser/block/reply/cite.ts +6 -6
- package/src/parser/block/reply/quote.test.ts +51 -51
- package/src/parser/block/reply/quote.ts +3 -3
- package/src/parser/block/reply.test.ts +20 -20
- package/src/parser/block/reply.ts +3 -3
- package/src/parser/block/sidefence.test.ts +48 -48
- package/src/parser/block/sidefence.ts +4 -4
- package/src/parser/block/table.test.ts +50 -50
- package/src/parser/block/table.ts +12 -12
- package/src/parser/block/ulist.test.ts +53 -53
- package/src/parser/block/ulist.ts +6 -6
- package/src/parser/block.ts +6 -4
- package/src/parser/context.ts +39 -0
- package/src/parser/header.test.ts +23 -23
- package/src/parser/header.ts +5 -5
- package/src/parser/inline/annotation.test.ts +43 -43
- package/src/parser/inline/annotation.ts +14 -4
- package/src/parser/inline/autolink/account.test.ts +33 -33
- package/src/parser/inline/autolink/account.ts +9 -9
- package/src/parser/inline/autolink/anchor.test.ts +22 -22
- package/src/parser/inline/autolink/anchor.ts +4 -4
- package/src/parser/inline/autolink/channel.test.ts +15 -15
- package/src/parser/inline/autolink/email.test.ts +37 -37
- package/src/parser/inline/autolink/email.ts +2 -2
- package/src/parser/inline/autolink/hashnum.test.ts +33 -33
- package/src/parser/inline/autolink/hashnum.ts +6 -5
- package/src/parser/inline/autolink/hashtag.test.ts +60 -60
- package/src/parser/inline/autolink/hashtag.ts +4 -4
- package/src/parser/inline/autolink/url.test.ts +75 -75
- package/src/parser/inline/autolink/url.ts +4 -4
- package/src/parser/inline/bracket.test.ts +70 -70
- package/src/parser/inline/bracket.ts +35 -32
- package/src/parser/inline/code.test.ts +31 -31
- package/src/parser/inline/code.ts +4 -4
- package/src/parser/inline/deletion.test.ts +28 -28
- package/src/parser/inline/deletion.ts +4 -4
- package/src/parser/inline/emphasis.test.ts +40 -40
- package/src/parser/inline/emphasis.ts +3 -3
- package/src/parser/inline/emstrong.test.ts +101 -101
- package/src/parser/inline/emstrong.ts +23 -23
- package/src/parser/inline/extension/index.test.ts +92 -92
- package/src/parser/inline/extension/index.ts +5 -5
- package/src/parser/inline/extension/indexee.ts +5 -5
- package/src/parser/inline/extension/indexer.test.ts +24 -24
- package/src/parser/inline/extension/indexer.ts +2 -2
- package/src/parser/inline/extension/label.test.ts +33 -33
- package/src/parser/inline/extension/label.ts +2 -2
- package/src/parser/inline/extension/placeholder.test.ts +43 -43
- package/src/parser/inline/extension/placeholder.ts +4 -4
- package/src/parser/inline/html.test.ts +108 -108
- package/src/parser/inline/html.ts +10 -10
- package/src/parser/inline/htmlentity.test.ts +38 -38
- package/src/parser/inline/htmlentity.ts +5 -5
- package/src/parser/inline/insertion.test.ts +28 -28
- package/src/parser/inline/insertion.ts +4 -4
- package/src/parser/inline/italic.test.ts +55 -55
- package/src/parser/inline/italic.ts +4 -4
- package/src/parser/inline/link.test.ts +186 -187
- package/src/parser/inline/link.ts +16 -17
- package/src/parser/inline/mark.test.ts +31 -31
- package/src/parser/inline/mark.ts +5 -5
- package/src/parser/inline/math.test.ts +132 -132
- package/src/parser/inline/math.ts +2 -2
- package/src/parser/inline/media.test.ts +91 -91
- package/src/parser/inline/media.ts +15 -15
- package/src/parser/inline/reference.test.ts +109 -109
- package/src/parser/inline/reference.ts +15 -54
- package/src/parser/inline/remark.test.ts +50 -50
- package/src/parser/inline/remark.ts +5 -5
- package/src/parser/inline/ruby.test.ts +45 -45
- package/src/parser/inline/ruby.ts +17 -17
- package/src/parser/inline/shortmedia.test.ts +10 -10
- package/src/parser/inline/strong.test.ts +37 -37
- package/src/parser/inline/strong.ts +3 -3
- package/src/parser/inline/template.test.ts +23 -23
- package/src/parser/inline/template.ts +5 -5
- package/src/parser/inline.test.ts +224 -223
- package/src/parser/segment.ts +2 -2
- package/src/parser/source/escapable.test.ts +24 -24
- package/src/parser/source/escapable.ts +8 -8
- package/src/parser/source/line.test.ts +18 -18
- package/src/parser/source/str.ts +2 -2
- package/src/parser/source/text.test.ts +85 -85
- package/src/parser/source/text.ts +5 -5
- package/src/parser/source/unescapable.test.ts +24 -24
- package/src/parser/source/unescapable.ts +5 -5
- package/src/parser/util.ts +10 -11
- package/src/parser/visibility.ts +8 -9
- package/src/util/quote.ts +2 -1
package/markdown.d.ts
CHANGED
|
@@ -1,32 +1,17 @@
|
|
|
1
|
-
import { Parser, List,
|
|
2
|
-
import {
|
|
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,
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
915
|
-
Parser<List<
|
|
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,20 +1,18 @@
|
|
|
1
1
|
import { block } from './block';
|
|
2
|
-
import { List,
|
|
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<
|
|
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<
|
|
15
|
-
assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<
|
|
16
|
-
assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<
|
|
17
|
-
assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length - 1; return new List<
|
|
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,
|
|
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<
|
|
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<
|
|
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<
|
|
32
|
-
export function verify<N>(parser: Parser<N>, cond: (nodes: List<
|
|
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,
|
|
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<
|
|
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<
|
|
15
|
-
assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<
|
|
16
|
-
assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<
|
|
17
|
-
assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<
|
|
18
|
-
assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length - 1; return new List<
|
|
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,
|
|
1
|
+
import { Parser, List, Context } from '../../data/parser';
|
|
2
2
|
|
|
3
|
-
export function clear<D extends Parser<unknown, C>[], C extends
|
|
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,
|
|
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:
|
|
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,
|
|
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
|
|
5
|
-
export function dup<N>(parser: Parser<N>): Parser<List<
|
|
6
|
-
return fmap(parser, nodes => new List([new
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
11
|
-
assert.deepStrictEqual(inspect(parser
|
|
12
|
-
assert.deepStrictEqual(inspect(parser
|
|
13
|
-
assert.deepStrictEqual(inspect(parser
|
|
14
|
-
assert.deepStrictEqual(inspect(parser
|
|
15
|
-
assert.deepStrictEqual(inspect(parser
|
|
16
|
-
assert.deepStrictEqual(inspect(parser
|
|
17
|
-
assert.deepStrictEqual(inspect(parser
|
|
18
|
-
assert.deepStrictEqual(inspect(parser
|
|
19
|
-
assert.deepStrictEqual(inspect(parser
|
|
20
|
-
assert.deepStrictEqual(inspect(parser
|
|
21
|
-
assert.deepStrictEqual(inspect(parser
|
|
22
|
-
assert.deepStrictEqual(inspect(parser
|
|
23
|
-
assert.deepStrictEqual(inspect(parser
|
|
24
|
-
assert.deepStrictEqual(inspect(parser
|
|
25
|
-
assert.deepStrictEqual(inspect(parser
|
|
26
|
-
assert.deepStrictEqual(inspect(parser
|
|
27
|
-
assert.deepStrictEqual(inspect(parser
|
|
28
|
-
assert.deepStrictEqual(inspect(parser
|
|
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,
|
|
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
|
|
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,
|
|
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<
|
|
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,
|
|
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<
|
|
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,
|
|
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;
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { Parser, Result, List,
|
|
1
|
+
import { Parser, Result, List, Node, Context, failsafe } from '../../data/parser';
|
|
2
2
|
import { matcher, clear } from '../../../combinator';
|
|
3
3
|
|
|
4
4
|
export function surround<P extends Parser, S = string>(
|
|
5
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: IntermediateParser<P>, closer: string | RegExp | Parser<S, Context<P>>,
|
|
5
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: Parser.IntermediateParser<P>, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
6
6
|
optional?: false,
|
|
7
7
|
backtracks?: readonly number[],
|
|
8
|
-
f?: (rss: [List<
|
|
9
|
-
g?: (rss: [List<
|
|
8
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
9
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
10
10
|
): P;
|
|
11
11
|
export function surround<P extends Parser, S = string>(
|
|
12
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: IntermediateParser<P>, closer: string | RegExp | Parser<S, Context<P>>,
|
|
12
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: Parser.IntermediateParser<P>, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
13
13
|
optional?: boolean,
|
|
14
14
|
backtracks?: readonly number[],
|
|
15
|
-
f?: (rss: [List<
|
|
16
|
-
g?: (rss: [List<
|
|
15
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
16
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
17
17
|
): P;
|
|
18
18
|
export function surround<P extends Parser, S = string>(
|
|
19
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: P, closer: string | RegExp | Parser<S, Context<P>>,
|
|
19
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
20
20
|
optional?: false,
|
|
21
21
|
backtracks?: readonly number[],
|
|
22
|
-
f?: (rss: [List<
|
|
23
|
-
g?: (rss: [List<
|
|
22
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
23
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
24
24
|
): P;
|
|
25
25
|
export function surround<P extends Parser, S = string>(
|
|
26
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: P, closer: string | RegExp | Parser<S, Context<P>>,
|
|
26
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
27
27
|
optional?: boolean,
|
|
28
28
|
backtracks?: readonly number[],
|
|
29
|
-
f?: (rss: [List<
|
|
30
|
-
g?: (rss: [List<
|
|
29
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
30
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
31
31
|
): P;
|
|
32
32
|
export function surround<P extends Parser<string>, S = string>(
|
|
33
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Context<P>>,
|
|
33
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
34
34
|
optional?: false,
|
|
35
35
|
backtracks?: readonly number[],
|
|
36
|
-
f?: (rss: [List<
|
|
37
|
-
g?: (rss: [List<
|
|
36
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
37
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
38
38
|
): P;
|
|
39
39
|
export function surround<P extends Parser<string>, S = string>(
|
|
40
|
-
opener: string | RegExp | Parser<S, Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Context<P>>,
|
|
40
|
+
opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
|
|
41
41
|
optional?: boolean,
|
|
42
42
|
backtracks?: readonly number[],
|
|
43
|
-
f?: (rss: [List<
|
|
44
|
-
g?: (rss: [List<
|
|
43
|
+
f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
44
|
+
g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
|
|
45
45
|
): P;
|
|
46
46
|
export function surround<N>(
|
|
47
47
|
opener: string | RegExp | Parser<N>, parser: string | RegExp | Parser<N>, closer: string | RegExp | Parser<N>,
|
|
48
48
|
optional: boolean = false,
|
|
49
49
|
backtracks: readonly number[] = [],
|
|
50
|
-
f?: (rss: [List<
|
|
51
|
-
g?: (rss: [List<
|
|
50
|
+
f?: (rss: [List<Node<N>>, List<Node<N>>, List<Node<N>>], context: Context) => Result<N>,
|
|
51
|
+
g?: (rss: [List<Node<N>>, List<Node<N>> | undefined], context: Context) => Result<N>,
|
|
52
52
|
): Parser<N> {
|
|
53
53
|
switch (typeof opener) {
|
|
54
54
|
case 'string':
|
|
@@ -110,19 +110,19 @@ export function surround<N>(
|
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
export function open<P extends Parser>(
|
|
113
|
-
opener: string | RegExp | Parser<Node<P>, Context<P>>,
|
|
113
|
+
opener: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
|
|
114
114
|
parser: P,
|
|
115
115
|
optional?: boolean,
|
|
116
116
|
backtracks?: readonly number[],
|
|
117
117
|
): P;
|
|
118
118
|
export function open<P extends Parser<string>>(
|
|
119
|
-
opener: string | RegExp | Parser<Node<P>, Context<P>>,
|
|
119
|
+
opener: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
|
|
120
120
|
parser: string | RegExp | P,
|
|
121
121
|
optional?: boolean,
|
|
122
122
|
backtracks?: readonly number[],
|
|
123
123
|
): P;
|
|
124
124
|
export function open<N>(
|
|
125
|
-
opener: string | RegExp | Parser<N,
|
|
125
|
+
opener: string | RegExp | Parser<N, Context>,
|
|
126
126
|
parser: string | RegExp | Parser<N>,
|
|
127
127
|
optional?: boolean,
|
|
128
128
|
backtracks: readonly number[] = [],
|
|
@@ -131,19 +131,19 @@ export function open<N>(
|
|
|
131
131
|
}
|
|
132
132
|
export function close<P extends Parser>(
|
|
133
133
|
parser: P,
|
|
134
|
-
closer: string | RegExp | Parser<Node<P>, Context<P>>,
|
|
134
|
+
closer: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
|
|
135
135
|
optional?: boolean,
|
|
136
136
|
backtracks?: readonly number[],
|
|
137
137
|
): P;
|
|
138
138
|
export function close<P extends Parser<string>>(
|
|
139
139
|
parser: string | RegExp | P,
|
|
140
|
-
closer: string | RegExp | Parser<Node<P>, Context<P>>,
|
|
140
|
+
closer: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
|
|
141
141
|
optional?: boolean,
|
|
142
142
|
backtracks?: readonly number[],
|
|
143
143
|
): P;
|
|
144
144
|
export function close<N>(
|
|
145
145
|
parser: string | RegExp | Parser<N>,
|
|
146
|
-
closer: string | RegExp | Parser<N,
|
|
146
|
+
closer: string | RegExp | Parser<N, Context>,
|
|
147
147
|
optional?: boolean,
|
|
148
148
|
backtracks: readonly number[] = [],
|
|
149
149
|
): Parser<N> {
|
|
@@ -152,7 +152,7 @@ export function close<N>(
|
|
|
152
152
|
|
|
153
153
|
const commandsize = 2;
|
|
154
154
|
export function isBacktrack(
|
|
155
|
-
context:
|
|
155
|
+
context: Context,
|
|
156
156
|
backtrack: number,
|
|
157
157
|
position: number = context.position,
|
|
158
158
|
length: number = 1,
|
|
@@ -160,14 +160,14 @@ export function isBacktrack(
|
|
|
160
160
|
assert(1 & backtrack);
|
|
161
161
|
assert(backtrack >>> commandsize);
|
|
162
162
|
assert(0 < length && length < 3);
|
|
163
|
-
const { backtracks
|
|
163
|
+
const { backtracks, offset } = context;
|
|
164
164
|
for (let i = 0; i < length; ++i) {
|
|
165
165
|
if (backtracks[position + i + offset] & backtrack >>> commandsize) return true;
|
|
166
166
|
}
|
|
167
167
|
return false;
|
|
168
168
|
}
|
|
169
169
|
export function setBacktrack(
|
|
170
|
-
context:
|
|
170
|
+
context: Context,
|
|
171
171
|
backtrack: number,
|
|
172
172
|
position: number,
|
|
173
173
|
length: number = 1,
|
|
@@ -176,7 +176,7 @@ export function setBacktrack(
|
|
|
176
176
|
assert(2 & backtrack);
|
|
177
177
|
assert(backtrack >>> commandsize);
|
|
178
178
|
assert(0 < length && length < 3);
|
|
179
|
-
const { backtracks
|
|
179
|
+
const { backtracks, offset } = context;
|
|
180
180
|
for (let i = 0; i < length; ++i) {
|
|
181
181
|
backtracks[position + i + offset] |= backtrack >>> commandsize;
|
|
182
182
|
}
|
|
@@ -202,6 +202,6 @@ function reduce(backtracks: readonly number[]): readonly [number, number, number
|
|
|
202
202
|
return [len, rbs, wbs];
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
function revert(context:
|
|
205
|
+
function revert(context: Context, linebreak: number): void {
|
|
206
206
|
context.linebreak = linebreak;
|
|
207
207
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Parser, Result, List,
|
|
1
|
+
import { Parser, Result, List, Node, Context, failsafe } from '../../data/parser';
|
|
2
2
|
|
|
3
|
-
export function bind<P extends Parser>(parser: IntermediateParser<P>, f: (nodes: List<
|
|
4
|
-
export function bind<P extends Parser>(parser: P, f: (nodes: List<
|
|
5
|
-
export function bind<N, P extends Parser>(parser: Parser<N, Context<P>, SubParsers<P>>, f: (nodes: List<
|
|
6
|
-
export function bind<U, P extends Parser>(parser: P, f: (nodes: List<
|
|
7
|
-
export function bind<N, U>(parser: Parser<N>, f: (nodes: List<
|
|
3
|
+
export function bind<P extends Parser>(parser: Parser.IntermediateParser<P>, f: (nodes: List<Node<Parser.SubNode<P>>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
|
|
4
|
+
export function bind<P extends Parser>(parser: P, f: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
|
|
5
|
+
export function bind<N, P extends Parser>(parser: Parser<N, Parser.Context<P>, Parser.SubParsers<P>>, f: (nodes: List<Node<N>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
|
|
6
|
+
export function bind<U, P extends Parser>(parser: P, f: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => Result<U, Parser.Context<P>, Parser.SubParsers<P>>): Parser<U, Parser.Context<P>, Parser.SubParsers<P>>;
|
|
7
|
+
export function bind<N, U>(parser: Parser<N>, f: (nodes: List<Node<N>>, context: Context) => Result<U>): Parser<U> {
|
|
8
8
|
assert(parser);
|
|
9
9
|
return failsafe(input => {
|
|
10
10
|
const { context } = input;
|