Example #1
0
        public CssSelector GetCombinatorSelector(string sel)
        {
            string newSel = sel.Replace("+", " + ").Replace("~", " ~ ").Replace(">", " > ");

            string[]      sep       = new string[] { " " };
            List <string> basicSels = newSel.Split(sep, StringSplitOptions.RemoveEmptyEntries).ToList();

            int j = basicSels.Count - 1;

            if (j == 0)
            {
                BasicCssSelector selector = (BasicCssSelector)GetBasicSelector(basicSels[j]);
                return(selector);
            }
            else
            {
                Stack <CssSelector> stack = new Stack <CssSelector>();
                while (j >= 0)
                {
                    CombinatorCssSelector current       = null;
                    CssSelector           selectorRight = null;
                    if (stack.Count == 0)
                    {
                        selectorRight = (BasicCssSelector)GetBasicSelector(basicSels[j]);
                        j--;
                    }
                    else
                    {
                        selectorRight = stack.Pop();
                    }

                    string symbol = basicSels[j];
                    current = (CombinatorCssSelector)GetCurrentSelector(symbol);
                    j--;
                    if (j < 0)
                    {
                        current.right = selectorRight;
                        break;
                    }
                    BasicCssSelector selectorLeft = (BasicCssSelector)GetBasicSelector(basicSels[j]);
                    current.left  = selectorLeft;
                    current.right = selectorRight;
                    stack.Push(current);
                    j--;
                }
                return(stack.Pop());
            }
        }
Example #2
0
        public List <CssSelector> ParseCssSelectorList(List <string> tokens, ref int index)
        {
            List <CssSelector> selectors = new List <CssSelector>();

            string[]      sep     = new string[] { "," };
            List <string> selStrs = tokens[index].Split(sep, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList();

            //for exam : A > B > C, #id + * > .cls
            foreach (var sel in selStrs)
            {
                (sel.Length > 0).OrThrow("Css Syntax Error:Selector parse error.Length should > 0");
                CssSelector selector = GetCombinatorSelector(sel);// #id + * > .cls
                selectors.Add(selector);
            }
            return(selectors);
        }
Example #3
0
        public CssSelector GetBasicSelector(string sel)
        {
            CssSelector     selector = null;
            CssSelectorType type     = CssSelectorType.Unkown;

            if (sel[0] == '#')
            {
                type     = CssSelectorType.IdSelector;
                selector = new BasicCssSelector(sel.Substring(1), type, "#");
            }
            else if (sel[0] == '.')
            {
                type     = CssSelectorType.ClassSelector;
                selector = new BasicCssSelector(sel.Substring(1), type, ".");
            }
            else if (sel[0] == '[')
            {
                type     = CssSelectorType.AttributeSelector;
                selector = new BasicCssSelector(sel.Substring(1, sel.Length - 2), type, "[");
            }
            else if (sel[0] == ':')
            {
                if (sel[1] == ':')
                {
                    type     = CssSelectorType.PseudoElement;
                    selector = new BasicCssSelector(sel.Substring(2), type, "::");
                }
                else
                {
                    type     = CssSelectorType.PseudoClass;
                    selector = new BasicCssSelector(sel.Substring(1), type, ":");
                }
            }
            else if (Char.IsLetter(sel[0]))
            {
                type     = CssSelectorType.ElementSelector;
                selector = new BasicCssSelector(sel.Substring(1), type, "");
            }
            return(selector);
        }
Example #4
0
        public CssSelector GetCurrentSelector(string symbol)
        {
            CssSelector current = null;

            if (symbol.Equals("+"))
            {
                current = new CombinatorCssSelector("+", CssSelectorType.AdjacentSiblingSelector);
            }
            else if (symbol.Equals("~"))
            {
                current = new CombinatorCssSelector("~", CssSelectorType.GeneralSiblingSelector);
            }
            else if (symbol.Equals(">"))
            {
                current = new CombinatorCssSelector(">", CssSelectorType.ChildSelector);
            }
            else
            {
                current = new CombinatorCssSelector("", CssSelectorType.DescendantSelector);
                (current as CombinatorCssSelector).left = GetBasicSelector(symbol);
            }
            return(current);
        }