Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNavigationGraph.cs
More file actions
Latest commit
92 lines (81 loc) · 2.71 KB
/
Copy pathNavigationGraph.cs
File metadata and controls
92 lines (81 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
namespaceShellDocs.Core;
publicclassNavigationGraph
{
publicNavigationNodeRoot{get;}
privatereadonlyDictionary<string,NavigationNode>_byUrl;
privatereadonlyList<NavigationNode>_flatPages;
publicNavigationGraph(NavigationNoderoot,IEnumerable<NavigationNode>?hiddenPages=null)
{
Root=root;
_byUrl=newDictionary<string,NavigationNode>(StringComparer.OrdinalIgnoreCase);
_flatPages=newList<NavigationNode>();
Index(root);
// Hidden pages route (URLs resolve) but never appear in the visible
// tree, so they're excluded from _flatPages (prev/next skips them).
if(hiddenPagesis not null)
{
foreach(varpageinhiddenPages)IndexHidden(page);
}
}
privatevoidIndexHidden(NavigationNodenode)
{
if(node.Kind==NodeKind.Page&&!string.IsNullOrEmpty(node.Url))
{
_byUrl[Normalize(node.Url)]=node;
}
foreach(varchildinnode.Children)IndexHidden(child);
}
publicNavigationNode?ResolveByUrl(stringurl)
{
varkey=Normalize(url);
return_byUrl.TryGetValue(key,outvarnode)?node:null;
}
public(NavigationNode?Prev,NavigationNode?Next)GetPrevNext(NavigationNodenode)
{
vari=_flatPages.IndexOf(node);
if(i<0)return(null,null);
varprev=i>0?_flatPages[i-1]:null;
varnext=i<_flatPages.Count-1?_flatPages[i+1]:null;
return(prev,next);
}
publicIReadOnlyList<NavigationNode>GetBreadcrumb(NavigationNodenode)
{
varchain=newList<NavigationNode>();
varcurrent=node;
while(currentis not null&¤t!=Root)
{
chain.Add(current);
current=current.Parent;
}
chain.Reverse();
returnchain;
}
publicIEnumerable<NavigationNode>Flatten()
{
returnFlattenFrom(Root);
}
privatestaticIEnumerable<NavigationNode>FlattenFrom(NavigationNodenode)
{
yieldreturnnode;
foreach(varchildinnode.Children)
{
foreach(varninFlattenFrom(child))yieldreturnn;
}
}
privatevoidIndex(NavigationNodenode)
{
if(node.Kind==NodeKind.Page&&!string.IsNullOrEmpty(node.Url))
{
_byUrl[Normalize(node.Url)]=node;
_flatPages.Add(node);
}
foreach(varchildinnode.Children)Index(child);
}
privatestaticstringNormalize(stringurl)
{
vars=url.Trim();
if(!s.StartsWith('/'))s="/"+s;
if(s.Length>1&&s.EndsWith('/'))s=s[..^1];
returns;
}
}