@@ -2,43 +2,54 @@ import { getAttr } from "../lib";
2
2
import { EvaluateOptions } from "../types" ;
3
3
4
4
export const evaluateTemplate = ( template : string , options : EvaluateOptions ) => {
5
- const evaluatedTemplateArr : Array < String > = [ ] ;
5
+ const evaluatedTemplateArr : string [ ] = [ ] ;
6
6
7
7
const templateContext = {
8
8
...options . endpointParams ,
9
9
...options . referenceRecord ,
10
10
} as Record < string , string > ;
11
11
12
- for ( let i = 0 ; i < template . length ; i ++ ) {
13
- const char = template [ i ] ;
14
- const nextChar = template [ i + 1 ] ;
12
+ let currentIndex = 0 ;
13
+ while ( true ) {
14
+ const openingBraceIndex = template . indexOf ( "{" , currentIndex ) ;
15
15
16
- if ( char === "{" ) {
17
- if ( nextChar === "{" ) {
18
- // Escaped expression, skip next char
19
- i ++ ;
20
- evaluatedTemplateArr . push ( char ) ;
21
- } else {
22
- const closingBraceIndex = template . indexOf ( "}" , i ) ;
23
- const parameterName = template . substring ( i + 1 , closingBraceIndex ) ;
16
+ if ( openingBraceIndex === - 1 ) {
17
+ // No more opening braces, add the rest of the template and break
18
+ evaluatedTemplateArr . push ( template . slice ( currentIndex ) ) ;
19
+ break ;
20
+ } else {
21
+ evaluatedTemplateArr . push ( template . slice ( currentIndex , openingBraceIndex ) ) ;
22
+ const closingBraceIndex = template . indexOf ( "}" , openingBraceIndex ) ;
24
23
25
- if ( parameterName . includes ( "#" ) ) {
26
- const [ refName , attrName ] = parameterName . split ( "#" ) ;
27
- evaluatedTemplateArr . push ( getAttr ( templateContext [ refName ] , attrName ) as string ) ;
28
- } else {
29
- evaluatedTemplateArr . push ( templateContext [ parameterName ] ) ;
30
- }
24
+ if ( closingBraceIndex === - 1 ) {
25
+ // Invalid template, but pass as it is.
26
+ evaluatedTemplateArr . push ( template . slice ( openingBraceIndex ) ) ;
27
+ break ;
28
+ }
31
29
32
- i = closingBraceIndex ;
30
+ if ( closingBraceIndex === openingBraceIndex + 1 ) {
31
+ // Empty parameter, pass as it is.
32
+ evaluatedTemplateArr . push ( template . slice ( openingBraceIndex , closingBraceIndex + 1 ) ) ;
33
+ currentIndex = closingBraceIndex + 1 ;
34
+ continue ;
33
35
}
34
- } else if ( char === "}" ) {
35
- if ( nextChar === "}" ) {
36
- // Escaped expression, skip next char
37
- i ++ ;
36
+
37
+ if ( template [ openingBraceIndex + 1 ] === "{" && template [ closingBraceIndex + 1 ] === "}" ) {
38
+ // Escaped expression. Do not evaluate.
39
+ evaluatedTemplateArr . push ( template . slice ( openingBraceIndex + 1 , closingBraceIndex ) ) ;
40
+ currentIndex = closingBraceIndex + 2 ;
38
41
}
39
- evaluatedTemplateArr . push ( char ) ;
40
- } else {
41
- evaluatedTemplateArr . push ( char ) ;
42
+
43
+ const parameterName = template . substring ( openingBraceIndex + 1 , closingBraceIndex ) ;
44
+
45
+ if ( parameterName . includes ( "#" ) ) {
46
+ const [ refName , attrName ] = parameterName . split ( "#" ) ;
47
+ evaluatedTemplateArr . push ( getAttr ( templateContext [ refName ] , attrName ) as string ) ;
48
+ } else {
49
+ evaluatedTemplateArr . push ( templateContext [ parameterName ] ) ;
50
+ }
51
+
52
+ currentIndex = closingBraceIndex + 1 ;
42
53
}
43
54
}
44
55
0 commit comments