11import { injectable } from "inversify" ;
2- import { generateRandomSprottyId } from "../../utils" ;
32
43export interface Constraint {
5- id : string ;
64 name : string ;
75 constraint : string ;
86}
@@ -12,46 +10,18 @@ export class ConstraintRegistry {
1210 private constraints : Constraint [ ] = [ ] ;
1311 private updateCallbacks : ( ( ) => void ) [ ] = [ ] ;
1412
15- public setConstraints ( constraints : string ) : void {
16- this . constraints = ConstraintRegistry . splitToConstraintTexts ( constraints ) . map ( ( t ) =>
17- this . constraintFromText ( t . text ) ,
18- ) ;
19- //this.constraintListChanged();
13+ public setConstraints ( constraints : string [ ] ) : void {
14+ this . constraints = this . splitIntoConstraintTexts ( constraints ) . map ( ( c ) => this . mapToConstraint ( c ) ) ;
2015 }
2116
2217 public setConstraintsFromArray ( constraints : Constraint [ ] ) : void {
2318 this . constraints = constraints . map ( ( c ) => ( {
24- id : c . id || generateRandomSprottyId ( ) ,
2519 name : c . name ,
2620 constraint : c . constraint ,
2721 } ) ) ;
2822 this . constraintListChanged ( ) ;
2923 }
3024
31- private constraintFromText ( text : string ) : Constraint {
32- const parts = text . split ( " " ) ;
33- if ( parts . length < 2 ) {
34- return {
35- id : generateRandomSprottyId ( ) ,
36- name : "" ,
37- constraint : "" ,
38- } ;
39- }
40- const name = parts [ 1 ] . endsWith ( ":" ) ? parts [ 1 ] . slice ( 0 , - 1 ) : parts [ 1 ] ;
41- if ( parts . length < 3 ) {
42- return {
43- id : generateRandomSprottyId ( ) ,
44- name : name ,
45- constraint : "" ,
46- } ;
47- }
48- return {
49- id : generateRandomSprottyId ( ) ,
50- name : name ,
51- constraint : parts . slice ( 2 ) . join ( " " ) ,
52- } ;
53- }
54-
5525 public clearConstraints ( ) : void {
5626 this . constraints = [ ] ;
5727 this . constraintListChanged ( ) ;
@@ -73,26 +43,41 @@ export class ConstraintRegistry {
7343 return this . constraints ;
7444 }
7545
76- public static splitToConstraintTexts ( text : string ) : { text : string ; line : number } [ ] {
77- if ( text === "" ) {
78- return [ ] ;
79- }
80- const lines = text . split ( / \r ? \n / gm) ;
46+ private splitIntoConstraintTexts ( text : string [ ] ) : string [ ] {
47+ const constraints : string [ ] = [ ] ;
8148 let currentConstraint = "" ;
82- const constraints : { text : string ; line : number } [ ] = [ ] ;
83- let lastStart = 0 ;
84- for ( let i = 0 ; i < lines . length ; i ++ ) {
85- const line = lines [ i ] . trim ( ) ;
86- if ( line . startsWith ( "-" ) ) {
87- if ( currentConstraint ) {
88- constraints . push ( { text : currentConstraint , line : lastStart } ) ;
49+ for ( const line of text ) {
50+ if ( line . startsWith ( "- " ) ) {
51+ if ( currentConstraint !== "" ) {
52+ constraints . push ( currentConstraint ) ;
8953 }
90- lastStart = i ;
9154 currentConstraint = line ;
9255 } else {
9356 currentConstraint += `\n${ line } ` ;
9457 }
9558 }
96- return currentConstraint ? [ ...constraints , { text : currentConstraint , line : lastStart } ] : constraints ;
59+ if ( currentConstraint !== "" ) {
60+ constraints . push ( currentConstraint ) ;
61+ }
62+ return constraints ;
63+ }
64+
65+ private mapToConstraint ( constraint : string ) : Constraint {
66+ // the brackets ensure its a capturing split
67+ const parts = constraint . split ( / ( \s + ) / ) ;
68+ // if less than 3 parts are present no name or constraint can be extracted (e.g. "- " -> ["-", " "])
69+ if ( parts . length < 3 ) {
70+ return { name : "" , constraint : "" } ;
71+ }
72+ let name = parts [ 2 ] ;
73+ if ( name . endsWith ( ":" ) ) {
74+ name = name . slice ( 0 , - 1 ) ;
75+ }
76+ let constraintText = "" ;
77+ // the first 4 parts are "- ", whitespace, `${name}:`, whitespace --> Thus the constraint starts at index 4
78+ for ( let i = 4 ; i < parts . length ; i ++ ) {
79+ constraintText += parts [ i ] ;
80+ }
81+ return { name, constraint : constraintText } ;
9782 }
9883}
0 commit comments