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.
- package/CHANGELOG.md +8 -0
- package/design.md +4 -3
- package/dist/index.js +529 -484
- 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 +66 -66
- 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 +15 -5
- 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 +16 -55
- 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;
|