@@ -27,6 +27,10 @@ export class Segment {
27
27
regex : string ;
28
28
}
29
29
30
+ export class ContinuationSegment extends Segment {
31
+ generate ( params ) : string { return '' ; }
32
+ }
33
+
30
34
class StaticSegment extends Segment {
31
35
regex : string ;
32
36
name : string ;
@@ -71,7 +75,7 @@ var wildcardMatcher = RegExpWrapper.create("^\\*([^\/]+)$");
71
75
function parsePathString ( route : string ) {
72
76
// normalize route as not starting with a "/". Recognition will
73
77
// also normalize.
74
- if ( route [ 0 ] === "/" ) {
78
+ if ( StringWrapper . startsWith ( route , "/" ) ) {
75
79
route = StringWrapper . substring ( route , 1 ) ;
76
80
}
77
81
@@ -93,14 +97,21 @@ function parsePathString(route: string) {
93
97
throw new BaseException ( `'${ route } ' has more than the maximum supported number of segments.` ) ;
94
98
}
95
99
96
- for ( var i = 0 ; i < segments . length ; i ++ ) {
100
+ var limit = segments . length - 1 ;
101
+ for ( var i = 0 ; i <= limit ; i ++ ) {
97
102
var segment = segments [ i ] , match ;
98
103
99
104
if ( isPresent ( match = RegExpWrapper . firstMatch ( paramMatcher , segment ) ) ) {
100
105
results . push ( new DynamicSegment ( match [ 1 ] ) ) ;
101
106
specificity += ( 100 - i ) ;
102
107
} else if ( isPresent ( match = RegExpWrapper . firstMatch ( wildcardMatcher , segment ) ) ) {
103
108
results . push ( new StarSegment ( match [ 1 ] ) ) ;
109
+ } else if ( segment == '...' ) {
110
+ if ( i < limit ) {
111
+ // TODO (matsko): setup a proper error here `
112
+ throw new BaseException ( `Unexpected "..." before the end of the path for "${ route } ".` ) ;
113
+ }
114
+ results . push ( new ContinuationSegment ( ) ) ;
104
115
} else if ( segment . length > 0 ) {
105
116
results . push ( new StaticSegment ( segment ) ) ;
106
117
specificity += 100 * ( 100 - i ) ;
@@ -120,6 +131,7 @@ export class PathRecognizer {
120
131
segments : List < Segment > ;
121
132
regex : RegExp ;
122
133
specificity : number ;
134
+ terminal : boolean = true ;
123
135
124
136
constructor ( public path : string , public handler : any ) {
125
137
this . segments = [ ] ;
@@ -131,7 +143,17 @@ export class PathRecognizer {
131
143
var segments = parsed [ 'segments' ] ;
132
144
var regexString = '^' ;
133
145
134
- ListWrapper . forEach ( segments , ( segment ) => { regexString += '/' + segment . regex ; } ) ;
146
+ ListWrapper . forEach ( segments , ( segment ) => {
147
+ if ( segment instanceof ContinuationSegment ) {
148
+ this . terminal = false ;
149
+ } else {
150
+ regexString += '/' + segment . regex ;
151
+ }
152
+ } ) ;
153
+
154
+ if ( this . terminal ) {
155
+ regexString += '$' ;
156
+ }
135
157
136
158
this . regex = RegExpWrapper . create ( regexString ) ;
137
159
this . segments = segments ;
@@ -143,6 +165,10 @@ export class PathRecognizer {
143
165
var urlPart = url ;
144
166
for ( var i = 0 ; i < this . segments . length ; i ++ ) {
145
167
var segment = this . segments [ i ] ;
168
+ if ( segment instanceof ContinuationSegment ) {
169
+ continue ;
170
+ }
171
+
146
172
var match = RegExpWrapper . firstMatch ( RegExpWrapper . create ( '/' + segment . regex ) , urlPart ) ;
147
173
urlPart = StringWrapper . substring ( urlPart , match [ 0 ] . length ) ;
148
174
if ( segment . name . length > 0 ) {
0 commit comments