public PathData Find(string path, IStartPage root, ITargetingFilter targetingFilter, IHeadUrlResolver urlResolver) { path = urlResolver.SanitizeUrl(path); var tokens = path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0) { return(new PathData(root, path)); } IAbstractItem stopItem = root; IAbstractItem node = root; string remainingPath = path; int index = 0; foreach (var token in tokens) { if (StopCondition != null && StopCondition(node)) { break; } node = node.GetChildPageByAlias(token, targetingFilter); if (node == null) { break; } index++; stopItem = node; remainingPath = $"/{string.Join("/", tokens.Select((x, i) => i < index ? (string)null : x).Where(x => x != null))}"; } return(new PathData(stopItem, remainingPath)); }
public TAbstractItem GetStartPage <TAbstractItem>(string host, ITargetingFilter filter = null) where TAbstractItem : class, IAbstractItem { var startPage = GetStartPage(host, filter); return(startPage != null ? startPage as TAbstractItem : null); }
/// <summary> /// Конструктор /// </summary> /// <param name="factory">фабрика дополнительных параметров</param> /// <param name="filter">общий фильтр</param> /// <param name="matchFilter">фильтр для поискового условия</param> public RecursiveVisitorAlgorithm( Func <IAbstractItem, int, V> factory, ITargetingFilter filter, ITargetingFilter matchFilter) { _factory = factory ?? throw new ArgumentNullException(nameof(factory)); _filter = filter; _matchFilter = matchFilter; }
public IAbstractItem GetStartPage(string host, ITargetingFilter filter = null) { var bindings = new List <string>(); foreach (var startPage in Root.GetChildren(filter).OfType <IStartPage>()) { var dns = startPage.GetDNSBindings(); bindings.AddRange(dns); } var matcher = new WildcardMatcher(WildcardMatchingOption.FullMatch, bindings); var pattern = matcher.MatchLongest(host); return(pattern != null ? _startPageByDnsPatternMappings[pattern] : null); }
private static void VisitNodes(StringBuilder sb, IAbstractItem node, ITargetingFilter filter, ITargetingUrlTransformator urlTransformator) { if (node.IsPage) { sb.Append($"<li> <a href = {node.GetUrl(urlTransformator)}> {node.Title} </a></li>"); } else { sb.Append($"<li> {node.Title} </li>"); } var children = node.GetChildren(filter); if (children.Any()) { sb.Append("<ul>"); foreach (var item in children) { VisitNodes(sb, item, filter, urlTransformator); } sb.Append("</ul>"); } }
public override IEnumerable <TAbstractItem> GetChildren <TAbstractItem>(ITargetingFilter filter = null) { return(GetChildren(filter).OfType <TAbstractItem>()); }
/// <summary> /// Получение дочерних элементов /// </summary> /// <param name="filter">Опционально. Фильтр таргетирования</param> /// <returns></returns> public override IEnumerable <IAbstractItem> GetChildren(ITargetingFilter filter = null) { return(filter == null ? Children : Children.Pipe(filter)); }
public static IEnumerable <T> Pipe <T>(this IEnumerable <T> items, ITargetingFilter filter) where T : IAbstractItem { return(filter.Pipe(items)); }
/// <summary> /// Получение дочерних элементов /// </summary> /// <param name="filter">Опционально. Фильтр таргетирования</param> /// <returns></returns> public abstract IEnumerable <TAbstractItem> GetChildren <TAbstractItem>(ITargetingFilter filter = null) where TAbstractItem : class, IAbstractItem;
/// <summary> /// Получение дочерних элементов /// </summary> /// <param name="filter">Опционально. Фильтр таргетирования</param> /// <returns></returns> public abstract IEnumerable <IAbstractItem> GetChildren(ITargetingFilter filter = null);
/// <summary> /// Получение дочернего элемента (только IsPage) по алиасу /// </summary> /// <param name="alias">Алиас искомого элемента</param> /// <param name="filter">Опционально. Фильтр таргетирования</param> /// <returns></returns> public virtual IAbstractItem GetChildPageByAlias(string alias, ITargetingFilter filter = null) { return(GetChildren(filter) .FirstOrDefault(children => string.Equals(children.Alias, alias, StringComparison.InvariantCultureIgnoreCase) && children.IsPage)); }