private ISelector GetResult()
        {
            if (IsValid)
            {
                if (_complex != null)
                {
                    _complex.ConcludeSelector(_temp);
                    _temp    = _complex;
                    _complex = null;
                }

                if (_group == null || _group.Length == 0)
                {
                    return(_temp ?? AllSelector.Instance);
                }
                else if (_temp == null && _group.Length == 1)
                {
                    return(_group[0]);
                }

                if (_temp != null)
                {
                    _group.Add(_temp);
                    _temp = null;
                }

                return(_group);
            }

            return(null);
        }
        private void Insert(ISelector selector)
        {
            if (_temp != null)
            {
                if (_combinators.Count == 0)
                {
                    if (!(_temp is CompoundSelector compound))
                    {
                        compound = new CompoundSelector {
                            _temp
                        };
                    }

                    compound.Add(selector);
                    _temp = compound;
                }
                else
                {
                    if (_complex == null)
                    {
                        _complex = new ComplexSelector();
                    }

                    var combinator = GetCombinator();
                    _complex.AppendSelector(_temp, combinator);
                    _temp = selector;
                }
            }
            else
            {
                _combinators.Clear();
                _temp = selector;
            }
        }
예제 #3
0
        /// <summary>
        /// Inserts the given selector.
        /// </summary>
        /// <param name="selector">The selector to insert.</param>
        void Insert(ISelector selector)
        {
            if (temp != null)
            {
                if (combinators.Count == 0)
                {
                    var compound = temp as CompoundSelector;

                    if (compound == null)
                    {
                        compound = new CompoundSelector();
                        compound.Add(temp);
                    }

                    compound.Add(selector);
                    temp = compound;
                }
                else
                {
                    if (complex == null)
                    {
                        complex = new ComplexSelector();
                    }

                    var combinator = GetCombinator();
                    complex.AppendSelector(temp, combinator);
                    temp = selector;
                }
            }
            else
            {
                combinators.Clear();
                temp = selector;
            }
        }
예제 #4
0
        private void VisitBaseSelector(BaseSelector selector)
        {
            AggregateSelectorList aggregateSelectorList = selector as AggregateSelectorList;

            if (aggregateSelectorList != null)
            {
                this.VisitSelectorList(aggregateSelectorList);
            }
            else
            {
                ComplexSelector complexSelector = selector as ComplexSelector;
                if (complexSelector != null)
                {
                    this.VisitComplexSelector(complexSelector);
                }
                else
                {
                    SimpleSelector simpleSelector = selector as SimpleSelector;
                    if (simpleSelector != null)
                    {
                        this.VisitSimpleSelector(simpleSelector.ToString());
                    }
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Gets the currently formed selector.
        /// </summary>
        public ISelector GetResult()
        {
            if (!IsValid)
            {
                return(new UnknownSelector(Serialize()));
            }

            if (complex != null)
            {
                complex.ConcludeSelector(temp);
                temp    = complex;
                complex = null;
            }

            if (group == null || group.Length == 0)
            {
                return(temp ?? SimpleSelector.All);
            }
            else if (temp == null && group.Length == 1)
            {
                return(group[0]);
            }

            if (temp != null)
            {
                group.Add(temp);
                temp = null;
            }

            return(group);
        }
예제 #6
0
        public ISelector GetResult()
        {
            if (!IsValid)
            {
                var selector = new UnknownSelector();
                return(selector);
            }

            if (_complex != null)
            {
                _complex.ConcludeSelector(_temp);
                _temp    = _complex;
                _complex = null;
            }

            if (_group == null || _group.Length == 0)
            {
                return(_temp ?? SimpleSelector.All);
            }
            else if (_temp == null && _group.Length == 1)
            {
                return(_group[0]);
            }

            if (_temp != null)
            {
                _group.Add(_temp);
                _temp = null;
            }

            return(_group);
        }
예제 #7
0
 static void Test(int expectedCount, params object[] q)
 {
     var num = q.Length / 2;
     var clauses = q.Take(num).Select(z => (SelectClauseNode) z).ToArray();
     var roots = q.Skip(num).Select(z => (INode) z).ToArray();
     var selector = new ComplexSelector(clauses);
     Assert.That(selector.Select(roots).Count() == expectedCount);
 }
예제 #8
0
        static void Test(int expectedCount, params object[] q)
        {
            var num      = q.Length / 2;
            var clauses  = q.Take(num).Select(z => (SelectClauseNode)z).ToArray();
            var roots    = q.Skip(num).Select(z => (INode)z).ToArray();
            var selector = new ComplexSelector(clauses);

            Assert.IsTrue(selector.Select(roots).Count() == expectedCount);
        }
        void VisitComplexSelector(ComplexSelector complexSelector)
        {
            int fullSpecificity = CSSSpec.GetSelectorSpecificity(complexSelector.ToString());

            if (fullSpecificity == 0)
            {
                m_Errors.AddInternalError("Failed to calculate selector specificity " + complexSelector);
                return;
            }

            using (m_Builder.BeginComplexSelector(fullSpecificity))
            {
                StyleSelectorRelationship relationShip = StyleSelectorRelationship.None;

                foreach (CombinatorSelector selector in complexSelector)
                {
                    StyleSelectorPart[] parts;

                    string simpleSelector = ExtractSimpleSelector(selector.Selector);

                    if (string.IsNullOrEmpty(simpleSelector))
                    {
                        m_Errors.AddInternalError("Expected simple selector inside complex selector " + simpleSelector);
                        return;
                    }

                    if (CheckSimpleSelector(simpleSelector, out parts))
                    {
                        m_Builder.AddSimpleSelector(parts, relationShip);

                        // Read relation for next element
                        switch (selector.Delimiter)
                        {
                        case Combinator.Child:
                            relationShip = StyleSelectorRelationship.Child;
                            break;

                        case Combinator.Descendent:
                            relationShip = StyleSelectorRelationship.Descendent;
                            break;

                        default:
                            m_Errors.AddSemanticError(StyleSheetImportErrorCode.InvalidComplexSelectorDelimiter, complexSelector.ToString());
                            return;
                        }
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }
예제 #10
0
 /// <summary>
 /// Resets the current state.
 /// </summary>
 /// <returns>The current instance.</returns>
 public CssSelectorConstructor Reset()
 {
     attrName      = null;
     attrValue     = null;
     attrOp        = String.Empty;
     state         = State.Data;
     combinator    = CssCombinator.Descendent;
     hasCombinator = false;
     temp          = null;
     group         = null;
     complex       = null;
     return(this);
 }
예제 #11
0
 /// <summary>
 /// Resets the current state.
 /// </summary>
 /// <returns>The current instance.</returns>
 public CssSelectorConstructor Reset()
 {
     attrName  = null;
     attrValue = null;
     attrNs    = null;
     attrOp    = String.Empty;
     state     = State.Data;
     combinators.Clear();
     temp     = null;
     group    = null;
     complex  = null;
     valid    = true;
     IsNested = false;
     ready    = true;
     return(this);
 }
예제 #12
0
        private void VisitComplexSelector(ComplexSelector complexSelector)
        {
            int selectorSpecificity = CSSSpec.GetSelectorSpecificity(complexSelector.ToString());

            if (selectorSpecificity == 0)
            {
                this.m_Errors.AddInternalError("Failed to calculate selector specificity " + complexSelector);
            }
            else
            {
                using (this.m_Builder.BeginComplexSelector(selectorSpecificity))
                {
                    StyleSelectorRelationship previousRelationsip = StyleSelectorRelationship.None;
                    foreach (CombinatorSelector current in complexSelector)
                    {
                        string text = this.ExtractSimpleSelector(current.Selector);
                        if (string.IsNullOrEmpty(text))
                        {
                            this.m_Errors.AddInternalError("Expected simple selector inside complex selector " + text);
                            break;
                        }
                        StyleSelectorPart[] parts;
                        if (!this.CheckSimpleSelector(text, out parts))
                        {
                            break;
                        }
                        this.m_Builder.AddSimpleSelector(parts, previousRelationsip);
                        Combinator delimiter = current.Delimiter;
                        if (delimiter != Combinator.Child)
                        {
                            if (delimiter != Combinator.Descendent)
                            {
                                this.m_Errors.AddSemanticError(StyleSheetImportErrorCode.InvalidComplexSelectorDelimiter, complexSelector.ToString());
                                break;
                            }
                            previousRelationsip = StyleSelectorRelationship.Descendent;
                        }
                        else
                        {
                            previousRelationsip = StyleSelectorRelationship.Child;
                        }
                    }
                }
            }
        }
예제 #13
0
 public CssSelectorConstructor Reset(IAttributeSelectorFactory attributeSelector, IPseudoClassSelectorFactory pseudoClassSelector, IPseudoElementSelectorFactory pseudoElementSelector)
 {
     _attrName  = null;
     _attrValue = null;
     _attrNs    = null;
     _attrOp    = String.Empty;
     _state     = State.Data;
     _combinators.Clear();
     _temp                  = null;
     _group                 = null;
     _complex               = null;
     _valid                 = true;
     _nested                = false;
     _ready                 = true;
     _attributeSelector     = attributeSelector;
     _pseudoClassSelector   = pseudoClassSelector;
     _pseudoElementSelector = pseudoElementSelector;
     return(this);
 }
예제 #14
0
        void InsertOr()
        {
            if (_temp != null)
            {
                if (_group == null)
                {
                    _group = new ListSelector();
                }

                if (_complex != null)
                {
                    _complex.ConcludeSelector(_temp);
                    _group.Add(_complex);
                    _complex = null;
                }
                else
                {
                    _group.Add(_temp);
                }

                _temp = null;
            }
        }
예제 #15
0
        /// <summary>
        /// Inserts a comma.
        /// </summary>
        void InsertOr()
        {
            if (temp != null)
            {
                if (group == null)
                {
                    group = new ListSelector();
                }

                if (complex != null)
                {
                    complex.ConcludeSelector(temp);
                    group.Add(complex);
                    complex = null;
                }
                else
                {
                    group.Add(temp);
                }

                temp = null;
            }
        }
예제 #16
0
        /// <summary>
        /// Inserts the given selector.
        /// </summary>
        /// <param name="selector">The selector to insert.</param>
        void Insert(ISelector selector)
        {
            if (temp != null)
            {
                if (!hasCombinator)
                {
                    var compound = temp as CompoundSelector;

                    if (compound == null)
                    {
                        compound = new CompoundSelector();
                        compound.Add(temp);
                    }

                    compound.Add(selector);
                    temp = compound;
                }
                else
                {
                    if (complex == null)
                    {
                        complex = new ComplexSelector();
                    }

                    complex.AppendSelector(temp, combinator);
                    combinator    = CssCombinator.Descendent;
                    hasCombinator = false;
                    temp          = selector;
                }
            }
            else
            {
                combinator    = CssCombinator.Descendent;
                hasCombinator = false;
                temp          = selector;
            }
        }
예제 #17
0
 public void Visit(ComplexSelector selector)
 {
   foreach (var sel in selector) sel.Selector.Visit(this);
 }
예제 #18
0
        BaseSelector ObfuscateSelectors(BaseSelector selector)
        {
            Type ruleType = selector.GetType();

            if (ruleType == typeof(SimpleSelector))
            {
                string obf = ObfuscateSelectorPart(selector.ToString());
                if (obf == null)
                    return selector;
                else
                    return new SimpleSelector(obf);
            }

            if (ruleType == typeof(ComplexSelector))
            {
                var obf = new ComplexSelector();
                var cs = (ComplexSelector)selector;
                foreach (var sel in cs)
                    obf.AppendSelector(ObfuscateSelectors(sel.Selector), sel.Delimiter);
                return obf;
            }

            if (ruleType == typeof(AggregateSelectorList))
            {
                var cs = (AggregateSelectorList)selector;
                var obf = new AggregateSelectorList(cs.Delimiter);
                foreach (BaseSelector sel in cs)
                    obf.AppendSelector(ObfuscateSelectors(sel));
                return obf;
            }

            if (ruleType == typeof(MultipleSelectorList))
            {
                var obf = new MultipleSelectorList();
                var cs = (MultipleSelectorList)selector;
                foreach (BaseSelector sel in cs)
                    obf.AppendSelector(ObfuscateSelectors(sel));
                return obf;
            }

            return selector;
        }
예제 #19
0
    internal SelectorFactory ResetFactory()
    {
      _attributeName = null;
      _attributeValue = null;
      _attributeOperator = string.Empty;
      _selectorOperation = SelectorOperation.Data;
      _combinator = Combinator.Descendent;
      _hasCombinator = false;
      _currentSelector = null;
      _aggregateSelectorList = null;
      _complexSelector = null;

      return this;
    }
예제 #20
0
    private void InsertCommaDelimited()
    {
      if (_currentSelector == null)
      {
        return;
      }

      if (_aggregateSelectorList == null)
      {
        _aggregateSelectorList = new AggregateSelectorList(",");
      }

      if (_complexSelector != null)
      {
        _complexSelector.ConcludeSelector(_currentSelector);
        _aggregateSelectorList.AppendSelector(_complexSelector);
        _complexSelector = null;
      }
      else
      {
        _aggregateSelectorList.AppendSelector(_currentSelector);
      }

      _currentSelector = null;
    }
예제 #21
0
 public void Visit(ComplexSelector selector)
 {
   bool first = true;
   foreach (var sel in selector.Reverse())
   {
     if (!first)
     {
       switch (sel.Delimiter)
       {
         case Combinator.AdjacentSibling:
           _matches = _matches.SelectMany(n => _engine.PrecedingSiblings(n).Take(1));
           break;
         case Combinator.Child:
           _matches = _matches.SelectMany(n => _engine.Parents(n).Take(1));
           break;
         case Combinator.Descendent:
           _matches = _matches.SelectMany(n => _engine.Parents(n));
           break;
         case Combinator.Sibling:
           _matches = _matches.SelectMany(n => _engine.PrecedingSiblings(n));
           break;
         default:
           NotSupported();
           break;
       }
     }
     sel.Selector.Visit(this);
     if (!_matches.Any()) return;
     first = false;
   }
 }
예제 #22
0
    private void Insert(BaseSelector selector)
    {
      if (_currentSelector != null)
      {
        if (!_hasCombinator)
        {
          var compound = _currentSelector as AggregateSelectorList;

          if (compound == null)
          {
            compound = new AggregateSelectorList("");
            compound.AppendSelector(_currentSelector);
          }

          compound.AppendSelector(selector);
          _currentSelector = compound;
        }
        else
        {
          if (_complexSelector == null)
          {
            _complexSelector = new ComplexSelector();
          }

          _complexSelector.AppendSelector(_currentSelector, _combinator);
          _combinator = Combinator.Descendent;
          _hasCombinator = false;
          _currentSelector = selector;
        }
      }
      else
      {
        if (_currentSelector == null && _complexSelector == null && _combinator == Combinator.Namespace)
        {
          _complexSelector = new ComplexSelector();
          _complexSelector.AppendSelector(new UnknownSelector(""), _combinator);
          _currentSelector = selector;
        }
        else
        {
          _combinator = Combinator.Descendent;
          _hasCombinator = false;
          _currentSelector = selector;
        }
      }
    }
    public void Visit(ComplexSelector selector)
    {
      var n = selector.Length - 1;

      for (var i = 0; i < n; i++)
      {
        selector[i].Selector.Visit(this);
        _writer.Write(selector[i].Character);
      }
      selector[n].Selector.Visit(this);
    }