angular-cn/modules/angular2/src/router/route_recognizer.js

71 lines
2.4 KiB
JavaScript
Raw Normal View History

import {RegExp, RegExpWrapper, StringWrapper, isPresent} from 'angular2/src/facade/lang';
import {Map, MapWrapper, List, ListWrapper, StringMap, StringMapWrapper} from 'angular2/src/facade/collection';
import {PathRecognizer} from './path_recognizer';
export class RouteRecognizer {
names:Map<string, PathRecognizer>;
redirects:Map<string, string>;
matchers:Map<RegExp, PathRecognizer>;
constructor() {
this.names = MapWrapper.create();
this.matchers = MapWrapper.create();
this.redirects = MapWrapper.create();
}
2015-05-14 15:24:35 +02:00
addRedirect(path:string, target:string): void {
MapWrapper.set(this.redirects, path, target);
}
2015-05-14 15:24:35 +02:00
addConfig(path:string, handler:any, alias:string = null): void {
var recognizer = new PathRecognizer(path, handler);
MapWrapper.set(this.matchers, recognizer.regex, recognizer);
if (isPresent(alias)) {
MapWrapper.set(this.names, alias, recognizer);
}
}
recognize(url:string):List<StringMap> {
var solutions = [];
MapWrapper.forEach(this.redirects, (target, path) => {
//TODO: "/" redirect case
if (StringWrapper.startsWith(url, path)) {
url = target + StringWrapper.substring(url, path.length);
}
});
MapWrapper.forEach(this.matchers, (pathRecognizer, regex) => {
var match;
if (isPresent(match = RegExpWrapper.firstMatch(regex, url))) {
var solution = StringMapWrapper.create();
StringMapWrapper.set(solution, 'cost', pathRecognizer.cost);
StringMapWrapper.set(solution, 'handler', pathRecognizer.handler);
StringMapWrapper.set(solution, 'params', pathRecognizer.parseParams(url));
//TODO(btford): determine a good generic way to deal with terminal matches
if (url == '/') {
StringMapWrapper.set(solution, 'matchedUrl', '/');
StringMapWrapper.set(solution, 'unmatchedUrl', '');
} else {
StringMapWrapper.set(solution, 'matchedUrl', match[0]);
var unmatchedUrl = StringWrapper.substring(url, match[0].length);
StringMapWrapper.set(solution, 'unmatchedUrl', unmatchedUrl);
}
ListWrapper.push(solutions, solution);
}
});
return solutions;
}
2015-05-14 15:24:35 +02:00
hasRoute(name:string): boolean {
return MapWrapper.contains(this.names, name);
}
2015-05-14 15:24:35 +02:00
generate(name:string, params:any): string {
var pathRecognizer = MapWrapper.get(this.names, name);
2015-05-14 15:24:35 +02:00
return isPresent(pathRecognizer) ? pathRecognizer.generate(params) : null;
}
}