Example #1
0
        public IEnumerable <ITagSpan <IOutliningRegionTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            if (spans.Count == 0 || !EnsureInitialized())
            {
                yield break;
            }

            var visitor = new CssItemCollector <UrlItem>();

            _tree.StyleSheet.Accept(visitor);

            foreach (UrlItem url in visitor.Items.Where(u => u.UrlString != null && u.Start >= spans[0].Start))
            {
                if (url.UrlString.Text.IndexOf("base64,") > -1 && buffer.CurrentSnapshot.Length >= url.UrlString.AfterEnd)
                {
                    var items = new List <object>();
                    ImageQuickInfo.AddImageContent(items, url.UrlString.Text.Trim('"', '\''));

                    // Replace any TextBuffers into strings for the tooltip to display.
                    // This works because base64 images are loaded synchronously, so we
                    // can compute the size before returning.  If they do change, we'll
                    // need to replace them with TextBlocks & handle the Changed event.
                    for (int i = 0; i < items.Count; i++)
                    {
                        var tipBuffer = items[i] as ITextBuffer;
                        if (tipBuffer == null)
                        {
                            continue;
                        }
                        items[i] = tipBuffer.CurrentSnapshot.GetText();
                    }
                    var content = new ItemsControl {
                        ItemsSource = items
                    };

                    var span = new SnapshotSpan(new SnapshotPoint(buffer.CurrentSnapshot, url.UrlString.Start), url.UrlString.Length);
                    var tag  = new OutliningRegionTag(true, true, url.UrlString.Length + " characters", content);
                    yield return(new TagSpan <IOutliningRegionTag>(span, tag));
                }
            }
        }
        private void UpdateDeclarationCache(ParseItem item)
        {
            var visitor = new CssItemCollector <Declaration>(true);

            item.Accept(visitor);

            HashSet <RuleBlock> rules = new HashSet <RuleBlock>();

            foreach (Declaration dec in visitor.Items)
            {
                RuleBlock rule = dec.Parent as RuleBlock;
                if (rule == null || rules.Contains(rule))
                {
                    continue;
                }

                var vendors = rule.GetDeclarations().Where(d => d.IsValid && d.IsVendorSpecific());
                foreach (Declaration vendor in vendors)
                {
                    string      name     = GetStandardName(vendor);
                    Declaration standard = rule.GetDeclarations().FirstOrDefault(d => d.IsValid && d.PropertyName.Text == name);

                    if (standard != null)
                    {
                        if (!Cache.Contains(standard))
                        {
                            Cache.Add(standard);
                        }

                        if (GetValueText(standard) == GetValueText(vendor) && !Cache.Contains(vendor))
                        {
                            Cache.Add(vendor);
                        }
                    }
                }

                rules.Add(rule);
            }
        }
Example #3
0
        private void Calculate()
        {
            // IDs
            var visitorIDs = new CssItemCollector <IdSelector>();

            _selector.Accept(visitorIDs);

            if (visitorIDs.Items.Count > 0)
            {
                IDs = visitorIDs.Items.Count;// *100;
            }
            // Classes
            var visitorClasses = new CssItemCollector <ClassSelector>();

            _selector.Accept(visitorClasses);

            if (visitorClasses.Items.Count > 0)
            {
                Classes = visitorClasses.Items.Count;// *10;
            }
            // Attributes
            var visitorAttribute = new CssItemCollector <AttributeSelector>();

            _selector.Accept(visitorAttribute);

            if (visitorAttribute.Items.Count > 0)
            {
                Attributes = visitorAttribute.Items.Count;// *10;
            }
            // Elements
            var visitorElements = new CssItemCollector <ItemName>();

            _selector.Accept(visitorElements);
            Elements = visitorElements.Items.Where(i => i.Text != "*" && i.FindType <AttributeSelector>() == null).Count();

            // Pseudo Elements
            var visitorPseudoElementSelector = new CssItemCollector <PseudoElementSelector>();

            _selector.Accept(visitorPseudoElementSelector);

            var visitorPseudoElementFunctionSelector = new CssItemCollector <PseudoElementFunctionSelector>();

            _selector.Accept(visitorPseudoElementFunctionSelector);

            PseudoElements = visitorPseudoElementSelector.Items.Count + visitorPseudoElementFunctionSelector.Items.Count;

            // Pseudo Classes
            var visitorPseudoClassSelector = new CssItemCollector <PseudoClassSelector>();

            _selector.Accept(visitorPseudoClassSelector);

            var visitorPseudoClassFunctionSelector = new CssItemCollector <PseudoClassFunctionSelector>(true);

            _selector.Accept(visitorPseudoClassFunctionSelector);

            int pseudoClases = visitorPseudoClassSelector.Items.Count(p => !p.IsPseudoElement());

            pseudoClases += visitorPseudoClassFunctionSelector.Items.Where(p => !p.Text.StartsWith(":not(", StringComparison.Ordinal) && !p.Text.StartsWith(":matches(", StringComparison.Ordinal)).Count();
            Elements     += visitorPseudoClassSelector.Items.Count(p => p.IsPseudoElement());

            if (pseudoClases > 0)
            {
                PseudoClasses = pseudoClases;// *10;
            }
            // Total
            //Total = IDs + Classes + Attributes + Elements + PseudoElements + PseudoClasses;
        }