@@ -2,16 +2,68 @@ library angular2.src.alt_router.link;
2
2
3
3
import "segments.dart" show Tree, TreeNode, UrlSegment, RouteSegment, rootNode;
4
4
import "package:angular2/src/facade/lang.dart"
5
- show isBlank, isString, isStringMap;
5
+ show isBlank, isPresent, isString, isStringMap;
6
6
import "package:angular2/src/facade/collection.dart" show ListWrapper;
7
7
8
- Tree <UrlSegment > link (
9
- RouteSegment segment, Tree <UrlSegment > tree, List <dynamic > change) {
10
- if (identical (change.length, 0 )) return tree;
11
- var normalizedChange = (identical (change.length, 1 ) && change[0 ] == "/" )
12
- ? change
13
- : (new List .from (["/" ])..addAll (change));
14
- return new Tree <UrlSegment >(_update (rootNode (tree), normalizedChange));
8
+ Tree <UrlSegment > link (RouteSegment segment, Tree <RouteSegment > routeTree,
9
+ Tree <UrlSegment > urlTree, List <dynamic > change) {
10
+ if (identical (change.length, 0 )) return urlTree;
11
+ var startingNode;
12
+ var normalizedChange;
13
+ if (isString (change[0 ]) && change[0 ].startsWith ("./" )) {
14
+ normalizedChange = (new List .from (["/" , change[0 ].substring (2 )])
15
+ ..addAll (ListWrapper .slice (change, 1 )));
16
+ startingNode = _findStartingNode (
17
+ _findUrlSegment (segment, routeTree), rootNode (urlTree));
18
+ } else if (isString (change[0 ]) &&
19
+ identical (change.length, 1 ) &&
20
+ change[0 ] == "/" ) {
21
+ normalizedChange = change;
22
+ startingNode = rootNode (urlTree);
23
+ } else if (isString (change[0 ]) && ! change[0 ].startsWith ("/" )) {
24
+ normalizedChange = (new List .from (["/" ])..addAll (change));
25
+ startingNode = _findStartingNode (
26
+ _findUrlSegment (segment, routeTree), rootNode (urlTree));
27
+ } else {
28
+ normalizedChange = (new List .from (["/" ])..addAll (change));
29
+ startingNode = rootNode (urlTree);
30
+ }
31
+ var updated = _update (startingNode, normalizedChange);
32
+ var newRoot = _constructNewTree (rootNode (urlTree), startingNode, updated);
33
+ return new Tree <UrlSegment >(newRoot);
34
+ }
35
+
36
+ UrlSegment _findUrlSegment (RouteSegment segment, Tree <RouteSegment > routeTree) {
37
+ var s = segment;
38
+ var res = null ;
39
+ while (isBlank (res)) {
40
+ res = ListWrapper .last (s.urlSegments);
41
+ s = routeTree.parent (s);
42
+ }
43
+ return res;
44
+ }
45
+
46
+ TreeNode <UrlSegment > _findStartingNode (
47
+ UrlSegment segment, TreeNode <UrlSegment > node) {
48
+ if (identical (node.value, segment)) return node;
49
+ for (var c in node.children) {
50
+ var r = _findStartingNode (segment, c);
51
+ if (isPresent (r)) return r;
52
+ }
53
+ return null ;
54
+ }
55
+
56
+ TreeNode <UrlSegment > _constructNewTree (TreeNode <UrlSegment > node,
57
+ TreeNode <UrlSegment > original, TreeNode <UrlSegment > updated) {
58
+ if (identical (node, original)) {
59
+ return new TreeNode <UrlSegment >(node.value, updated.children);
60
+ } else {
61
+ return new TreeNode <UrlSegment >(
62
+ node.value,
63
+ node.children
64
+ .map ((c) => _constructNewTree (c, original, updated))
65
+ .toList ());
66
+ }
15
67
}
16
68
17
69
TreeNode <UrlSegment > _update (TreeNode <UrlSegment > node, List <dynamic > changes) {
0 commit comments