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); } }
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; }