public static bool Match(string @namespace, NamespaceNavigator nav, out EndValueNamespaceNavigationNode value) { value = default(EndValueNamespaceNavigationNode); if (string.IsNullOrWhiteSpace(@namespace)) { return(false); } if (string.Compare(@namespace, "Default", StringComparison.OrdinalIgnoreCase) == 0) { return(false); } if (nav == null) { return(false); } //if (nav.IsRoot() && nav.OriginNamespaceOnRoot.Contains(@namespace)) return true; var currentNav = nav.IsRoot() ? nav : GetRoot(nav); if (currentNav == null) { return(false); } var nss = @namespace.Split('.'); var index = 0; do { if (string.CompareOrdinal(currentNav.NamespaceFragment, "*") == 0) { value = currentNav.GetValue(); return(true); } if (string.CompareOrdinal(nss[index], currentNav.NamespaceFragment) != 0) { return(false); } if (index + 1 < nss.Length && !currentNav.HasNextNav()) { value = currentNav.GetValue(); return(true); } currentNav = currentNav.GetNextNav(nss[++index]); } while (index < nss.Length); return(false); }
/// <inheritdoc /> public NamespaceNavigator Parse(string @namespace, string level, out EndValueNamespaceNavigationNode endValueNode) { if (string.IsNullOrWhiteSpace(@namespace)) { throw new ArgumentNullException(nameof(@namespace)); } endValueNode = new EndValueNamespaceNavigationNode(level); if (@namespace == "*") { return new NamespaceNavigator("*") { Value = endValueNode } } ; if (@namespace == "Default") { return(NamespaceNavigator.Empty); } if (@namespace.IndexOf(".", StringComparison.Ordinal) < 0) { return new NamespaceNavigator(@namespace) { Value = endValueNode } } ; var nss = @namespace.Split('.'); var root = new NamespaceNavigator(nss[0]); var currentNav = root; for (var i = 1; i < nss.Length; i++) { var _ = new NamespaceNavigator(nss[i]); currentNav.AddChild(_); currentNav = _; if (nss[i] == "*") { break; } } currentNav.Value = endValueNode; return(root); } } }
public virtual void AddChild(NamespaceNavigator nav) { if (nav == null) { return; } if (NamespaceFragment == "*") { return; } if (AntiLoopSelf(nav)) { return; } nav.ParentNav = this; nav.UpdateFullValueSegmentFromParent(FullNamespaceFragment); _nextNavs.Add(nav.NamespaceFragment.GetHashCode(), nav); }
private static NamespaceNavigator GetRoot(NamespaceNavigator nav) { if (nav == null) { return(null); } if (!nav.HasParentNav()) { return(nav); } var currentNav = nav; while (currentNav.HasParentNav()) { currentNav = currentNav.GetParentNav(); } return(currentNav); }
private bool AntiLoopSelf(NamespaceNavigator nav) { return(AntiLoopSelf(nav.GetHashCode(), LoopSelfWard.Default)); }
public override void AddChild(NamespaceNavigator nav) { }
private static bool IsRoot(this NamespaceNavigator nav) { return(nav != null && !nav.HasParentNav()); }