1
- import { type ParsingRange } from '@lemons_dev/parsinom/lib/HelperTypes' ;
2
- import { type API } from './API' ;
3
- import type MetaBindPlugin from '../main' ;
1
+ import { type ParsingPosition , type ParsingRange } from '@lemons_dev/parsinom/lib/HelperTypes' ;
4
2
import { ParsingError , runParser } from '../parsers/ParsingError' ;
5
3
import {
4
+ BIND_TARGET_HLP ,
6
5
INLINE_BUTTON_DECLARATION_HLP ,
7
6
INPUT_FIELD_DECLARATION_HLP ,
8
7
VIEW_FIELD_DECLARATION_HLP ,
9
8
} from '../parsers/HLPUtils' ;
10
9
import { InlineMDRCType } from '../utils/InlineMDRCUtils' ;
10
+ import { type IPlugin } from '../IPlugin' ;
11
+ import { type IAPI } from './IAPI' ;
12
+ import { P_UTILS } from '@lemons_dev/parsinom/lib/ParserUtils' ;
13
+ import { type Parser } from '@lemons_dev/parsinom/lib/Parser' ;
11
14
12
15
export class Highlight {
13
16
range : ParsingRange ;
@@ -20,28 +23,42 @@ export class Highlight {
20
23
}
21
24
22
25
export class SyntaxHighlighting {
26
+ str : string ;
23
27
highlights : Highlight [ ] ;
24
28
parsingError ?: ParsingError ;
25
29
26
- constructor ( highlights : Highlight [ ] , parsingError ?: ParsingError ) {
27
- this . highlights = highlights ;
30
+ constructor ( str : string , highlights : Highlight [ ] , parsingError ?: ParsingError ) {
31
+ this . str = str ;
32
+ this . highlights = highlights . filter ( x => x . range . from . index !== x . range . to . index ) ;
28
33
this . parsingError = parsingError ;
29
34
}
30
35
31
36
getHighlights ( ) : Highlight [ ] {
32
37
if ( this . parsingError === undefined ) {
33
- return this . highlights . filter ( x => x . range . from . index !== x . range . to . index ) ;
38
+ return this . highlights ;
39
+ }
40
+
41
+ let errorTo : ParsingPosition ;
42
+
43
+ if ( this . str [ this . parsingError . parseFailure . furthest . index ] === '\n' ) {
44
+ errorTo = {
45
+ index : this . parsingError . parseFailure . furthest . index + 1 ,
46
+ column : 1 ,
47
+ line : this . parsingError . parseFailure . furthest . line + 1 ,
48
+ } ;
49
+ } else {
50
+ errorTo = {
51
+ index : this . parsingError . parseFailure . furthest . index + 1 ,
52
+ column : this . parsingError . parseFailure . furthest . column + 1 ,
53
+ line : this . parsingError . parseFailure . furthest . line ,
54
+ } ;
34
55
}
35
56
36
57
return [
37
58
new Highlight (
38
59
{
39
60
from : this . parsingError . parseFailure . furthest ,
40
- to : {
41
- line : this . parsingError . parseFailure . furthest . line ,
42
- column : this . parsingError . parseFailure . furthest . column + 1 ,
43
- index : this . parsingError . parseFailure . furthest . index + 1 ,
44
- } ,
61
+ to : errorTo ,
45
62
} ,
46
63
'error' ,
47
64
) ,
@@ -50,62 +67,56 @@ export class SyntaxHighlighting {
50
67
}
51
68
52
69
export class SyntaxHighlightingAPI {
53
- public readonly api : API ;
54
- public readonly plugin : MetaBindPlugin ;
70
+ public readonly api : IAPI ;
71
+ public readonly plugin : IPlugin ;
55
72
56
- constructor ( plugin : MetaBindPlugin ) {
73
+ constructor ( plugin : IPlugin ) {
57
74
this . plugin = plugin ;
58
75
this . api = plugin . api ;
59
76
}
60
77
61
- highlightInputFieldDeclaration ( str : string ) : SyntaxHighlighting {
62
- try {
63
- return new SyntaxHighlighting ( runParser ( INPUT_FIELD_DECLARATION_HLP , str ) ) ;
64
- } catch ( e ) {
65
- if ( e instanceof ParsingError ) {
66
- return new SyntaxHighlighting ( [ ] , e ) ;
67
- } else {
68
- console . error ( e ) ;
69
- return new SyntaxHighlighting ( [ ] ) ;
70
- }
71
- }
78
+ highlightInputFieldDeclaration ( str : string , trimWhiteSpace : boolean ) : SyntaxHighlighting {
79
+ return this . highlightWithParser ( str , trimWhiteSpace , INPUT_FIELD_DECLARATION_HLP ) ;
72
80
}
73
81
74
- highlightViewFieldDeclaration ( str : string ) : SyntaxHighlighting {
75
- try {
76
- return new SyntaxHighlighting ( runParser ( VIEW_FIELD_DECLARATION_HLP , str ) ) ;
77
- } catch ( e ) {
78
- if ( e instanceof ParsingError ) {
79
- return new SyntaxHighlighting ( [ ] , e ) ;
80
- } else {
81
- console . error ( e ) ;
82
- return new SyntaxHighlighting ( [ ] ) ;
83
- }
84
- }
82
+ highlightViewFieldDeclaration ( str : string , trimWhiteSpace : boolean ) : SyntaxHighlighting {
83
+ return this . highlightWithParser ( str , trimWhiteSpace , VIEW_FIELD_DECLARATION_HLP ) ;
85
84
}
86
85
87
- highlightInlineButtonDeclaration ( str : string ) : SyntaxHighlighting {
88
- try {
89
- return new SyntaxHighlighting ( runParser ( INLINE_BUTTON_DECLARATION_HLP , str ) ) ;
90
- } catch ( e ) {
91
- if ( e instanceof ParsingError ) {
92
- return new SyntaxHighlighting ( [ ] , e ) ;
93
- } else {
94
- console . error ( e ) ;
95
- return new SyntaxHighlighting ( [ ] ) ;
96
- }
97
- }
86
+ highlightInlineButtonDeclaration ( str : string , trimWhiteSpace : boolean ) : SyntaxHighlighting {
87
+ return this . highlightWithParser ( str , trimWhiteSpace , INLINE_BUTTON_DECLARATION_HLP ) ;
98
88
}
99
89
100
- highlight ( str : string , mdrcType : InlineMDRCType ) : SyntaxHighlighting {
90
+ highlight ( str : string , mdrcType : InlineMDRCType , trimWhiteSpace : boolean ) : SyntaxHighlighting {
101
91
if ( mdrcType === InlineMDRCType . INPUT_FIELD ) {
102
- return this . highlightInputFieldDeclaration ( str ) ;
92
+ return this . highlightInputFieldDeclaration ( str , trimWhiteSpace ) ;
103
93
} else if ( mdrcType === InlineMDRCType . VIEW_FIELD ) {
104
- return this . highlightViewFieldDeclaration ( str ) ;
94
+ return this . highlightViewFieldDeclaration ( str , trimWhiteSpace ) ;
105
95
} else if ( mdrcType === InlineMDRCType . BUTTON ) {
106
- return this . highlightInlineButtonDeclaration ( str ) ;
96
+ return this . highlightInlineButtonDeclaration ( str , trimWhiteSpace ) ;
107
97
}
108
98
109
99
throw new Error ( `Unknown MDRCType ${ mdrcType } ` ) ;
110
100
}
101
+
102
+ highlightBindTarget ( str : string , trimWhiteSpace : boolean ) : SyntaxHighlighting {
103
+ return this . highlightWithParser ( str , trimWhiteSpace , BIND_TARGET_HLP ) ;
104
+ }
105
+
106
+ private highlightWithParser ( str : string , trimWhiteSpace : boolean , parser : Parser < Highlight [ ] > ) : SyntaxHighlighting {
107
+ try {
108
+ if ( trimWhiteSpace ) {
109
+ return new SyntaxHighlighting ( str , runParser ( parser . trim ( P_UTILS . optionalWhitespace ( ) ) . thenEof ( ) , str ) ) ;
110
+ } else {
111
+ return new SyntaxHighlighting ( str , runParser ( parser . thenEof ( ) , str ) ) ;
112
+ }
113
+ } catch ( e ) {
114
+ if ( e instanceof ParsingError ) {
115
+ return new SyntaxHighlighting ( str , [ ] , e ) ;
116
+ } else {
117
+ console . error ( e ) ;
118
+ return new SyntaxHighlighting ( str , [ ] ) ;
119
+ }
120
+ }
121
+ }
111
122
}
0 commit comments