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' ;
42import { ParsingError , runParser } from '../parsers/ParsingError' ;
53import {
4+ BIND_TARGET_HLP ,
65 INLINE_BUTTON_DECLARATION_HLP ,
76 INPUT_FIELD_DECLARATION_HLP ,
87 VIEW_FIELD_DECLARATION_HLP ,
98} from '../parsers/HLPUtils' ;
109import { 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' ;
1114
1215export class Highlight {
1316 range : ParsingRange ;
@@ -20,28 +23,42 @@ export class Highlight {
2023}
2124
2225export class SyntaxHighlighting {
26+ str : string ;
2327 highlights : Highlight [ ] ;
2428 parsingError ?: ParsingError ;
2529
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 ) ;
2833 this . parsingError = parsingError ;
2934 }
3035
3136 getHighlights ( ) : Highlight [ ] {
3237 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+ } ;
3455 }
3556
3657 return [
3758 new Highlight (
3859 {
3960 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 ,
4562 } ,
4663 'error' ,
4764 ) ,
@@ -50,62 +67,56 @@ export class SyntaxHighlighting {
5067}
5168
5269export class SyntaxHighlightingAPI {
53- public readonly api : API ;
54- public readonly plugin : MetaBindPlugin ;
70+ public readonly api : IAPI ;
71+ public readonly plugin : IPlugin ;
5572
56- constructor ( plugin : MetaBindPlugin ) {
73+ constructor ( plugin : IPlugin ) {
5774 this . plugin = plugin ;
5875 this . api = plugin . api ;
5976 }
6077
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 ) ;
7280 }
7381
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 ) ;
8584 }
8685
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 ) ;
9888 }
9989
100- highlight ( str : string , mdrcType : InlineMDRCType ) : SyntaxHighlighting {
90+ highlight ( str : string , mdrcType : InlineMDRCType , trimWhiteSpace : boolean ) : SyntaxHighlighting {
10191 if ( mdrcType === InlineMDRCType . INPUT_FIELD ) {
102- return this . highlightInputFieldDeclaration ( str ) ;
92+ return this . highlightInputFieldDeclaration ( str , trimWhiteSpace ) ;
10393 } else if ( mdrcType === InlineMDRCType . VIEW_FIELD ) {
104- return this . highlightViewFieldDeclaration ( str ) ;
94+ return this . highlightViewFieldDeclaration ( str , trimWhiteSpace ) ;
10595 } else if ( mdrcType === InlineMDRCType . BUTTON ) {
106- return this . highlightInlineButtonDeclaration ( str ) ;
96+ return this . highlightInlineButtonDeclaration ( str , trimWhiteSpace ) ;
10797 }
10898
10999 throw new Error ( `Unknown MDRCType ${ mdrcType } ` ) ;
110100 }
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+ }
111122}
0 commit comments