internal override bool TryMatch( ContentItem item, IDictionary<string, ContentPropertyDefinition> propertyDefinitions, int startIndex, out int endIndex) { if (item.Path.Length >= startIndex + _literal.Length) { var substring = item.Path.Substring(startIndex, _literal.Length); if (string.Equals(_literal, substring, StringComparison.OrdinalIgnoreCase)) { endIndex = startIndex + _literal.Length; return true; } } endIndex = startIndex; return false; }
public ContentItem Match(string path, IDictionary<string, ContentPropertyDefinition> propertyDefinitions) { var item = new ContentItem { Path = path }; var startIndex = 0; foreach (var segment in _segments) { int endIndex; if (segment.TryMatch(item, propertyDefinitions, startIndex, out endIndex)) { startIndex = endIndex; continue; } return null; } return startIndex == path.Length ? item : null; }
internal abstract bool TryMatch(ContentItem item, IDictionary<string, ContentPropertyDefinition> propertyDefinitions, int startIndex, out int endIndex);
internal override bool TryMatch(ContentItem item, IDictionary<string, ContentPropertyDefinition> propertyDefinitions, int startIndex, out int endIndex) { ContentPropertyDefinition propertyDefinition; if (!propertyDefinitions.TryGetValue(_token, out propertyDefinition)) { throw new Exception(string.Format("Unable to find property definition for {{{0}}}", _token)); } for (var scanIndex = startIndex; scanIndex != item.Path.Length;) { var delimiterIndex = (item.Path + _delimiter).IndexOf(_delimiter, scanIndex + 1); if (delimiterIndex == item.Path.Length && _delimiter != '\0') { break; } var substring = item.Path.Substring(startIndex, delimiterIndex - startIndex); object value; if (propertyDefinition.TryLookup(substring, out value)) { if (!_matchOnly) { item.Properties.Add(_token, value); } endIndex = delimiterIndex; return true; } scanIndex = delimiterIndex; } endIndex = startIndex; return false; }