@@ -17,7 +17,7 @@ import {
1717 ListWrapper
1818} from 'angular2/src/facade/collection' ;
1919import { IMPLEMENTS } from 'angular2/src/facade/lang' ;
20-
20+ import { parseAndAssignParamString } from 'angular2/src/router/helpers' ;
2121import { escapeRegex } from './url' ;
2222import { RouteHandler } from './route_handler' ;
2323
@@ -63,19 +63,6 @@ function normalizeString(obj: any): string {
6363 }
6464}
6565
66- function parseAndAssignMatrixParams ( keyValueMap , matrixString ) {
67- if ( matrixString [ 0 ] == ';' ) {
68- matrixString = matrixString . substring ( 1 ) ;
69- }
70-
71- matrixString . split ( ';' ) . forEach ( ( entry ) => {
72- var tuple = entry . split ( '=' ) ;
73- var key = tuple [ 0 ] ;
74- var value = tuple . length > 1 ? tuple [ 1 ] : true ;
75- keyValueMap [ key ] = value ;
76- } ) ;
77- }
78-
7966class ContinuationSegment extends Segment { }
8067
8168class StaticSegment extends Segment {
@@ -198,7 +185,10 @@ export class PathRecognizer {
198185 specificity : number ;
199186 terminal : boolean = true ;
200187
201- constructor ( public path : string , public handler : RouteHandler ) {
188+ static matrixRegex : RegExp = RegExpWrapper . create ( '^(.*\/[^\/]+?)(;[^\/]+)?\/?$' ) ;
189+ static queryRegex : RegExp = RegExpWrapper . create ( '^(.*\/[^\/]+?)(\\?[^\/]+)?$' ) ;
190+
191+ constructor ( public path : string , public handler : RouteHandler , public isRoot : boolean = false ) {
202192 assertPath ( path ) ;
203193 var parsed = parsePathString ( path ) ;
204194 var specificity = parsed [ 'specificity' ] ;
@@ -228,16 +218,16 @@ export class PathRecognizer {
228218 var containsStarSegment =
229219 segmentsLimit >= 0 && this . segments [ segmentsLimit ] instanceof StarSegment ;
230220
231- var matrixString ;
221+ var paramsString , useQueryString = this . isRoot && this . terminal ;
232222 if ( ! containsStarSegment ) {
233- var matches =
234- RegExpWrapper . firstMatch ( RegExpWrapper . create ( '^(.*\/[^\/]+?)(;[^\/]+)?\/?$' ) , url ) ;
223+ var matches = RegExpWrapper . firstMatch (
224+ useQueryString ? PathRecognizer . queryRegex : PathRecognizer . matrixRegex , url ) ;
235225 if ( isPresent ( matches ) ) {
236226 url = matches [ 1 ] ;
237- matrixString = matches [ 2 ] ;
227+ paramsString = matches [ 2 ] ;
238228 }
239229
240- url = StringWrapper . replaceAll ( url , / ( ; [ ^ \/ ] + ) (? = ( \/ | \Z ) ) / g, '' ) ;
230+ url = StringWrapper . replaceAll ( url , / ( ; [ ^ \/ ] + ) (? = ( \/ | $ ) ) / g, '' ) ;
241231 }
242232
243233 var params = StringMapWrapper . create ( ) ;
@@ -256,8 +246,11 @@ export class PathRecognizer {
256246 }
257247 }
258248
259- if ( isPresent ( matrixString ) && matrixString . length > 0 && matrixString [ 0 ] == ';' ) {
260- parseAndAssignMatrixParams ( params , matrixString ) ;
249+ if ( isPresent ( paramsString ) && paramsString . length > 0 ) {
250+ var expectedStartingValue = useQueryString ? '?' : ';' ;
251+ if ( paramsString [ 0 ] == expectedStartingValue ) {
252+ parseAndAssignParamString ( expectedStartingValue , paramsString , params ) ;
253+ }
261254 }
262255
263256 return params ;
@@ -266,6 +259,7 @@ export class PathRecognizer {
266259 generate ( params : StringMap < string , any > ) : string {
267260 var paramTokens = new TouchMap ( params ) ;
268261 var applyLeadingSlash = false ;
262+ var useQueryString = this . isRoot && this . terminal ;
269263
270264 var url = '' ;
271265 for ( var i = 0 ; i < this . segments . length ; i ++ ) {
@@ -279,12 +273,23 @@ export class PathRecognizer {
279273 }
280274
281275 var unusedParams = paramTokens . getUnused ( ) ;
282- StringMapWrapper . forEach ( unusedParams , ( value , key ) => {
283- url += ';' + key ;
284- if ( isPresent ( value ) ) {
285- url += '=' + value ;
286- }
287- } ) ;
276+ if ( ! StringMapWrapper . isEmpty ( unusedParams ) ) {
277+ url += useQueryString ? '?' : ';' ;
278+ var paramToken = useQueryString ? '&' : ';' ;
279+ var i = 0 ;
280+ StringMapWrapper . forEach ( unusedParams , ( value , key ) => {
281+ if ( i ++ > 0 ) {
282+ url += paramToken ;
283+ }
284+ url += key ;
285+ if ( ! isPresent ( value ) && useQueryString ) {
286+ value = 'true' ;
287+ }
288+ if ( isPresent ( value ) ) {
289+ url += '=' + value ;
290+ }
291+ } ) ;
292+ }
288293
289294 if ( applyLeadingSlash ) {
290295 url += '/' ;
0 commit comments