/// <summary> /// Gets the correct Trie node type for the given segment /// </summary> /// <param name="parent">Parent node</param> /// <param name="segment">Segment</param> /// <returns>TrieNode instance</returns> public virtual TrieNode GetNodeForSegment(TrieNode parent, string segment) { if (parent == null) { return new RootNode(this); } var chars = segment.ToCharArray(); var start = chars[0]; var end = chars[chars.Length - 1]; if (start == '(' && end == ')') { return new RegExNode(parent, segment, this); } if (start == '{' && end == '}' && chars.Count(c => c == '{' || c == '}') == 2) { return this.GetCaptureNode(parent, segment); } if (segment.StartsWith("^(") && (segment.EndsWith(")") || segment.EndsWith(")$"))) { return new GreedyRegExCaptureNode(parent, segment, this); } if (CaptureNodeWithMultipleParameters.IsMatch(segment)) { return new CaptureNodeWithMultipleParameters(parent, segment, this); } return new LiteralNode(parent, segment, this); }
/// <summary> /// Gets the correct Trie node type for the given segment /// </summary> /// <param name="parent">Parent node</param> /// <param name="segment">Segment</param> /// <returns>TrieNode instance</returns> public virtual TrieNode GetNodeForSegment(TrieNode parent, string segment) { if (parent == null) { return new RootNode(this); } if (segment.StartsWith("(") && segment.EndsWith(")")) { return new RegExNode(parent, segment, this); } if (segment.StartsWith("{") && segment.EndsWith("}")) { return this.GetCaptureNode(parent, segment); } if (segment.StartsWith("^(") && (segment.EndsWith(")") || segment.EndsWith(")$"))) { return new GreedyRegExCaptureNode(parent, segment, this); } if (CaptureNodeWithLiteral.MatchRegex.IsMatch(segment)) { return new CaptureNodeWithLiteral(parent, segment, this); } return new LiteralNode(parent, segment, this); }
/// <summary> /// Initializes a new instance of the <see cref="TrieNode"/> class /// </summary> /// <param name="parent">Parent node</param> /// <param name="segment">Segment of the route definition</param> /// <param name="nodeFactory">Factory for creating new nodes</param> protected TrieNode(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) { this.nodeFactory = nodeFactory; this.Parent = parent; this.RouteDefinitionSegment = segment; this.Children = new Dictionary<string, TrieNode>(StaticConfiguration.CaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase); this.AdditionalParameters = new Dictionary<string, object>(); this.NodeData = new List<NodeData>(); }
/// <summary> /// Initializes a new instance of the <see cref="TrieNode"/> class /// </summary> /// <param name="parent">Parent node</param> /// <param name="segment">Segment of the route definition</param> /// <param name="nodeFactory">Factory for creating new nodes</param> protected TrieNode(TrieNode parent, string segment, TrieNodeFactory nodeFactory) { this.nodeFactory = nodeFactory; this.Parent = parent; this.RouteDefinitionSegment = segment; this.Children = new Dictionary<string, TrieNode>(); this.AdditionalParameters = new Dictionary<string, object>(); this.NodeData = new List<NodeData>(); }
private TrieNode GetCaptureNode(TrieNode parent, string segment) { if (segment.EndsWith("?}")) { return new OptionalCaptureNode(parent, segment, this); } if (segment.EndsWith("*}")) { return new GreedyCaptureNode(parent, segment, this); } if (segment.Contains("?")) { return new CaptureNodeWithDefaultValue(parent, segment, this); } return new CaptureNode(parent, segment, this); }
/// <summary> /// Gets the correct Trie node type for the given segment /// </summary> /// <param name="parent">Parent node</param> /// <param name="segment">Segment</param> /// <returns>TrieNode instance</returns> public TrieNode GetNodeForSegment(TrieNode parent, string segment) { if (parent == null) { return new RootNode(this); } if (segment.StartsWith("(") && segment.EndsWith(")")) { return new RegExNode(parent, segment, this); } if (segment.StartsWith("{") && segment.EndsWith("}")) { return this.GetCaptureNode(parent, segment); } return new LiteralNode(parent, segment, this); }
public LiteralNode(TrieNode parent, string segment, TrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { }
public OptionalCaptureNode(TrieNode parent, string segment, TrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.ExtractParameterName(); }
public CaptureNodeWithConstraint(TrieNode parent, string segment, ITrieNodeFactory nodeFactory, IEnumerable<IRouteSegmentConstraint> routeSegmentConstraints) : base(parent, segment, nodeFactory) { this.routeSegmentConstraints = routeSegmentConstraints; this.ExtractParameterName(); }
public CaptureNodeWithDefaultValue(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.ExtractParameterNameAndDefaultValue(); }
public GreedyRegExCaptureNode(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.BuildRegEx(); }
public CaptureNodeWithLiteral(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.ExtractParameterName(); }
public CaptureNodeWithLiteral(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.ExtractParameterName(); }
public CaptureNodeWithConstraint(TrieNode parent, string segment, ITrieNodeFactory nodeFactory, IEnumerable <IRouteSegmentConstraint> routeSegmentConstraints) : base(parent, segment, nodeFactory) { this.routeSegmentConstraints = routeSegmentConstraints; this.ExtractParameterName(); }
public RegExNode(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.BuildRegEx(); }
public RegExNode(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.BuildRegEx(); }
/// <summary> /// Captures parameters within segments that contain literals. /// i.e: /// /{file}.{name} /// /{file}.html /// /{major}.{minor}.{revision}B{build} /// </summary> /// <param name="parent">The parent node</param> /// <param name="segment">The segment to match upon</param> /// <param name="nodeFactory">The factory</param> public CaptureNodeWithMultipleParameters(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.ExtractParameterNames(); }
public GreedyCaptureNode(TrieNode parent, string segment, TrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.GetParameterName(); }
public GreedyCaptureNode(TrieNode parent, string segment, ITrieNodeFactory nodeFactory) : base(parent, segment, nodeFactory) { this.GetParameterName(); }