Beispiel #1
0
        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));
        }
Beispiel #2
0
        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;
 }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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));
 }
Beispiel #8
0
 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));
 }