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); }
/// <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)})!"); } }