Ejemplo n.º 1
0
        protected bool Match(IEnumerable <Element> MatchList, out LinkedList <Element> outList, ESelectorMatchingOrder Order, params Node[] scopeElements)
        {
            if (!MatchList.Any())
            {
                outList = (LinkedList <Element>)MatchList;
                return(false);
            }

            var newList = new LinkedList <Element>();

            foreach (Element element in MatchList)
            {
                bool fullMatch = true;
                switch (Order)
                {
                case ESelectorMatchingOrder.LTR:
                {
                    for (int i = 0; i < Count; i++)        // progressing forwards
                    {
                        SimpleSelector Selector = this[i];
                        if (!Selector.Matches(element, scopeElements))
                        {
                            fullMatch = false;
                            break;
                        }
                    }
                }
                break;

                case ESelectorMatchingOrder.RTL:
                {
                    for (int i = Count - 1; i >= 0; i--)        // progressing backwards
                    {
                        SimpleSelector Selector = this[i];
                        if (!Selector.Matches(element, scopeElements))
                        {
                            fullMatch = false;
                            break;
                        }
                    }
                }
                break;
                }

                if (fullMatch)
                {
                    newList.AddLast(element);
                }
            }

            outList = newList;
            return(newList.Count > 0);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Applies the Complex selectors combinator to a single element
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public IEnumerable <Element> Apply_Combinator(Element element, ESelectorMatchingOrder Dir)
        {
            switch (Combinator)
            {
            case ESelectorCombinator.Child:
            {
                switch (Dir)
                {
                case ESelectorMatchingOrder.LTR:
                    return(new LinkedList <Element>(element.children));

                default:
                    return(new Element[] { element.parentElement });
                }
            }

            case ESelectorCombinator.Sibling_Adjacent:
            {
                switch (Dir)
                {
                case ESelectorMatchingOrder.LTR:
                    return(new Element[] { element.nextElementSibling });

                default:
                    return(new Element[] { element.previousElementSibling });
                }
            }

            case ESelectorCombinator.Sibling_Subsequent:
            {
                switch (Dir)
                {
                case ESelectorMatchingOrder.LTR:
                    return(DOMCommon.Get_Following <Element>(element, FilterElements.Instance));

                default:
                    return(DOMCommon.Get_Preceeding <Element>(element, FilterElements.Instance));
                }
            }

            case ESelectorCombinator.Descendant:
            {
                switch (Dir)
                {
                case ESelectorMatchingOrder.LTR:
                    return(DOMCommon.Get_Descendents <Element>(element, FilterElements.Instance));

                default:
                    return(DOMCommon.Get_Ancestors <Element>(element, FilterElements.Instance));
                }
            }

            case ESelectorCombinator.None:
            {
                return(new Element[] { element });
            }

            default:
                throw new NotImplementedException($"[CSS][Selector] Unhandled selector-combinator({Enum.GetName(typeof(ESelectorCombinator), Combinator)})!");
            }
        }