private async static Task ParseDocument() { string fileName = GetSolutionFilePath(); if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) { CssParser parser = new CssParser(); StyleSheet stylesheet = parser.Parse(await FileHelpers.ReadAllTextRetry(fileName), false); if (stylesheet.IsValid) { var visitor = new CssItemCollector<AtDirective>(); stylesheet.Accept(visitor); AtDirective at = visitor.Items.SingleOrDefault(a => a.Keyword.Text == _rootDirective); if (at != null) { var visitorPalette = new CssItemCollector<AtDirective>(true); at.Accept(visitorPalette); _directives = visitorPalette.Items.Where(a => a.Keyword.Text != at.Keyword.Text).ToList(); } } InitializeWatcher(fileName); } else { _hasFile = false; } }
private string FindRuleSetInFile(IEnumerable<string> extensions, string className, out RuleSet rule) { string root = ProjectHelpers.GetProjectFolder(peekableItem._textbuffer.GetFileName()); string result = null; bool isLow = false, isMedium = false; rule = null; foreach (string ext in extensions) { ICssParser parser = CssParserLocator.FindComponent(Mef.GetContentType(ext.Trim('.'))).CreateParser(); foreach (string file in Directory.EnumerateFiles(root, "*" + ext, SearchOption.AllDirectories)) { if (file.EndsWith(".min" + ext, StringComparison.OrdinalIgnoreCase) || file.Contains("node_modules") || file.Contains("bower_components")) continue; string text = FileHelpers.ReadAllTextRetry(file).ConfigureAwait(false).GetAwaiter().GetResult(); int index = text.IndexOf("." + className, StringComparison.Ordinal); if (index == -1) continue; var css = parser.Parse(text, true); var visitor = new CssItemCollector<ClassSelector>(false); css.Accept(visitor); var selectors = visitor.Items.Where(c => c.ClassName.Text == className); var high = selectors.FirstOrDefault(c => c.FindType<AtDirective>() == null && (c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ",")); if (high != null) { rule = high.FindType<RuleSet>(); return file; } var medium = selectors.FirstOrDefault(c => c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ","); if (medium != null && !isMedium) { rule = medium.FindType<RuleSet>(); result = file; isMedium = true; continue; } var low = selectors.FirstOrDefault(); if (low != null && !isLow && !isMedium) { rule = low.FindType<RuleSet>(); result = file; isLow = true; } } } return result; }
private static string AddMissingVendorDeclarations(StringBuilder sb, CssEditorDocument doc, ICssSchemaInstance rootSchema, out int count) { var visitor = new CssItemCollector<Declaration>(true); doc.Tree.StyleSheet.Accept(visitor); count = 0; var items = visitor.Items.Where(d => d.IsValid && !d.IsVendorSpecific() && d.PropertyName.Text != "filter"); foreach (Declaration dec in items.Reverse()) { ICssSchemaInstance schema = CssSchemaManager.SchemaManager.GetSchemaForItem(rootSchema, dec); var missingEntries = dec.GetMissingVendorSpecifics(schema); if (missingEntries.Any()) { var missingPrefixes = missingEntries.Select(e => e.Substring(0, e.IndexOf('-', 1) + 1)); string vendors = GetVendorDeclarations(missingPrefixes, dec); sb.Insert(dec.Start, vendors); count++; } } return sb.ToString(); }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { if (!IsFontFamilyContext(context)) yield break; StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitorRules = new CssItemCollector<FontFaceDirective>(); stylesheet.Accept(visitorRules); foreach (FontFaceDirective item in visitorRules.Items) { var visitorDec = new CssItemCollector<Declaration>(); item.Block.Accept(visitorDec); Declaration family = visitorDec.Items.FirstOrDefault(i => i.PropertyName.Text == "font-family"); if (family != null) { string value = string.Join(string.Empty, family.Values.Select(v => v.Text)); yield return new FontFamilyCompletionListEntry(value.Trim('\'', '"')); } } yield return new FontFamilyCompletionListEntry("Pick from file..."); }
public ItemCheckResult CheckItem(ParseItem item, ICssCheckerContext context) { if (!WESettings.Instance.Css.ValidateVendorSpecifics) return ItemCheckResult.Continue; AtDirective directive = (AtDirective)item; if (context == null || !directive.IsValid || !directive.IsVendorSpecific()) return ItemCheckResult.Continue; ICssCompletionListEntry entry = VendorHelpers.GetMatchingStandardEntry(directive, context); if (entry != null) { var visitor = new CssItemCollector<AtDirective>(); directive.Parent.Accept(visitor); if (!visitor.Items.Any(a => a != null && a.Keyword != null && "@" + a.Keyword.Text == entry.DisplayText)) { string message = string.Format(CultureInfo.InvariantCulture, Resources.BestPracticeAddMissingStandardDirective, entry.DisplayText); context.AddError(new SimpleErrorTag(directive.Keyword, message)); return ItemCheckResult.CancelCurrentItem; } } return ItemCheckResult.Continue; }
private string AddMissingStandardDeclaration(StringBuilder sb, CssEditorDocument doc, ICssSchemaInstance rootSchema) { var visitor = new CssItemCollector<RuleBlock>(true); doc.Tree.StyleSheet.Accept(visitor); //var items = visitor.Items.Where(d => d.IsValid && d.IsVendorSpecific()); foreach (RuleBlock rule in visitor.Items.Reverse()) { HashSet<string> list = new HashSet<string>(); foreach (Declaration dec in rule.Declarations.Where(d => d.IsValid && d.IsVendorSpecific()).Reverse()) { ICssSchemaInstance schema = CssSchemaManager.SchemaManager.GetSchemaForItem(rootSchema, dec); ICssCompletionListEntry entry = VendorHelpers.GetMatchingStandardEntry(dec, schema); if (entry != null && !list.Contains(entry.DisplayText) && !rule.Declarations.Any(d => d.PropertyName != null && d.PropertyName.Text == entry.DisplayText)) { int index = dec.Text.IndexOf(":", StringComparison.Ordinal); string standard = entry.DisplayText + dec.Text.Substring(index); sb.Insert(dec.AfterEnd, standard); list.Add(entry.DisplayText); } } } return sb.ToString(); }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { var visitor = new CssItemCollector<Declaration>(); context.ContextItem.StyleSheet.Accept(visitor); foreach (Declaration dec in visitor.Items) { if (dec.IsValid && dec.PropertyName.Text.StartsWith("var-")) yield return new CompletionListEntry(dec.PropertyName.Text.Substring(4)); } }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitorRules = new CssItemCollector<ClassSelector>(); stylesheet.Accept(visitorRules); foreach (string item in visitorRules.Items.Where(s => s != context.ContextItem).Select(s => s.Text).Distinct()) { yield return new CompletionListEntry(item); } }
private void UpdateCache(ParseItem item) { var visitor = new CssItemCollector<Declaration>(true); item.Accept(visitor); foreach (TokenItem token in visitor.Items.Where(d => d.Important != null).Select(d => d.Important)) { if (!_cache.Contains(token)) _cache.Add(token); } }
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(") && !p.Text.StartsWith(":matches(")).Count(); Elements += visitorPseudoClassSelector.Items.Count(p => p.IsPseudoElement()); if (pseudoClases > 0) PseudoClasses = pseudoClases;// *10; // Total //Total = IDs + Classes + Attributes + Elements + PseudoElements + PseudoClasses; }
public static IEnumerable<string> GetMissingVendorSpecifics(this AtDirective directive, ICssSchemaInstance schema) { IEnumerable<string> possible = GetPossibleVendorSpecifics(directive, schema); var visitorRules = new CssItemCollector<AtDirective>(); directive.Parent.Accept(visitorRules); foreach (string item in possible) { if (!visitorRules.Items.Any(d => d.Keyword != null && "@" + d.Keyword.Text == item)) yield return item; } }
private void InitializeCache(StyleSheet stylesheet) { _cache.Clear(); var visitor = new CssItemCollector<Declaration>(true); stylesheet.Accept(visitor); foreach (Declaration dec in visitor.Items.Where(d => d.PropertyName != null)) { if (dec.PropertyName.Text == "display" && dec.Values.Any(v => v.Text == "inline")) _cache.Add(dec); } }
private List<RuleResult> BuildCache(RuleSet rule) { var visitor = new CssItemCollector<RuleSet>(); rule.Parent.Accept(visitor); List<RuleResult> list = new List<RuleResult>(); foreach (RuleSet rs in visitor.Items) { RuleResult result = new RuleResult(rs, rs.Start, GetSelectorText(rs)); list.Add(result); } return list; }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { Declaration dec = context.ContextItem.FindType<Declaration>(); if (dec == null || dec.PropertyName == null || (!dec.PropertyName.Text.EndsWith("animation-name", StringComparison.OrdinalIgnoreCase) && dec.PropertyName.Text != "animation")) yield break; StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitor = new CssItemCollector<KeyFramesDirective>(); stylesheet.Accept(visitor); foreach (string name in visitor.Items.Select(d => d.Name.Text).Distinct(StringComparer.OrdinalIgnoreCase)) { yield return new CompletionListEntry(name); } }
private void UpdateCache(ParseItem item) { var visitor = new CssItemCollector<SimpleSelector>(true); item.Accept(visitor); foreach (SimpleSelector ss in visitor.Items) { string text = ss.Text; if (ModernizrProvider.IsModernizr(text)) { if (!_cache.Contains(ss)) _cache.Add(ss); } } }
private void UpdateCache(ParseItem item) { var visitor = new CssItemCollector<Declaration>(true); item.Accept(visitor); foreach (Declaration dec in visitor.Items) { string text = dec.Text; if (text.StartsWith("var-", StringComparison.Ordinal)) { if (!_cache.Contains(dec)) _cache.Add(dec); } } }
public IEnumerable<ISmartTagAction> GetSmartTagActions(ParseItem item, int position, ITrackingSpan itemTrackingSpan, ITextView view) { AtDirective directive = (AtDirective)item; if (!item.IsValid || !directive.IsVendorSpecific()) yield break; ICssSchemaInstance schema = CssSchemaManager.SchemaManager.GetSchemaRootForBuffer(view.TextBuffer); var visitor = new CssItemCollector<AtDirective>(); directive.Parent.Accept(visitor); ICssCompletionListEntry entry = VendorHelpers.GetMatchingStandardEntry(directive, schema); if (entry != null && !visitor.Items.Any(d => d.Keyword != null && "@" + d.Keyword.Text == entry.DisplayText)) { yield return new MissingStandardDirectiveSmartTagAction(itemTrackingSpan, directive, entry.DisplayText); } }
private static string RemoveDuplicateProperties(StringBuilder sb, CssEditorDocument doc) { var visitor = new CssItemCollector<RuleBlock>(true); doc.Tree.StyleSheet.Accept(visitor); foreach (RuleBlock rule in visitor.Items.Reverse()) { HashSet<string> list = new HashSet<string>(); foreach (Declaration dec in rule.Declarations.Reverse()) { if (!list.Add(dec.Text)) sb.Remove(dec.Start, dec.Length); } } return sb.ToString(); }
public IEnumerable <ISmartTagAction> GetSmartTagActions(ParseItem item, int position, ITrackingSpan itemTrackingSpan, ITextView view) { UrlItem url = (UrlItem)item; if (!url.IsValid || url.UrlString == null || !url.UrlString.Text.Contains(";base64,")) { yield break; } CComment comment = url.NextSibling as CComment; if (comment != null && comment.CommentText != null) { string path = comment.CommentText.Text.Trim(); yield return(new UpdateEmbedSmartTagAction(itemTrackingSpan, path)); } else { RuleBlock rule = item.FindType <RuleBlock>(); Declaration dec = item.FindType <Declaration>(); if (rule == null || dec == null || dec.PropertyName == null) { yield break; } foreach (Declaration sibling in rule.Declarations.Where(d => d.PropertyName != null && d != dec)) { if (sibling.PropertyName.Text == "*" + dec.PropertyName.Text || sibling.PropertyName.Text == "_" + dec.PropertyName.Text) { var visitor = new CssItemCollector <UrlItem>(); sibling.Accept(visitor); UrlItem siblingUrl = visitor.Items.FirstOrDefault(); if (siblingUrl != null && siblingUrl.UrlString != null) { yield return(new UpdateEmbedSmartTagAction(itemTrackingSpan, siblingUrl.UrlString.Text)); break; } } } } }
private void UpdateCache(ParseItem item) { var visitor = new CssItemCollector <SimpleSelector>(true); item.Accept(visitor); foreach (SimpleSelector ss in visitor.Items) { string text = ss.Text; if (ModernizrProvider.IsModernizr(text)) { if (!_cache.Contains(ss)) { _cache.Add(ss); } } } }
public IEnumerable <ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { Declaration dec = context.ContextItem.FindType <Declaration>(); if (dec == null || dec.PropertyName == null || (!dec.PropertyName.Text.EndsWith("animation-name", StringComparison.OrdinalIgnoreCase) && dec.PropertyName.Text != "animation")) { yield break; } StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitor = new CssItemCollector <KeyFramesDirective>(); stylesheet.Accept(visitor); foreach (string name in visitor.Items.Select(d => d.Name.Text).Distinct(StringComparer.OrdinalIgnoreCase)) { yield return(new CompletionListEntry(name)); } }
private void UpdateCache(ParseItem item) { var visitor = new CssItemCollector <Declaration>(true); item.Accept(visitor); foreach (Declaration dec in visitor.Items) { string text = dec.Text; if (text.StartsWith("var-", StringComparison.Ordinal)) { if (!_cache.Contains(dec)) { _cache.Add(dec); } } } }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { HashSet<ICssCompletionListEntry> entries = new HashSet<ICssCompletionListEntry>(); Declaration dec = context.ContextItem.FindType<Declaration>(); if (dec == null || dec.PropertyName == null || (!dec.PropertyName.Text.EndsWith("animation-name", StringComparison.OrdinalIgnoreCase) && dec.PropertyName.Text != "animation")) return entries; StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitor = new CssItemCollector<KeyFramesDirective>(); stylesheet.Accept(visitor); foreach (KeyFramesDirective keyframes in visitor.Items) { if (!entries.Any(e => e.DisplayText.Equals(keyframes.Name.Text, StringComparison.OrdinalIgnoreCase))) entries.Add(new CompletionListEntry(keyframes.Name.Text)); } return entries; }
public IEnumerable<ICssCompletionListEntry> GetListEntries(CssCompletionContext context) { HashSet<string> classNames = new HashSet<string>(); HashSet<ICssCompletionListEntry> entries = new HashSet<ICssCompletionListEntry>(); StyleSheet stylesheet = context.ContextItem.StyleSheet; var visitorRules = new CssItemCollector<ClassSelector>(); stylesheet.Accept(visitorRules); foreach (ClassSelector item in visitorRules.Items) { if (item != context.ContextItem && !classNames.Contains(item.Text)) { classNames.Add(item.Text); entries.Add(new CompletionListEntry(item.Text)); } } return entries; }
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)); } } }
public IEnumerable <ISmartTagAction> GetSmartTagActions(ParseItem item, int position, ITrackingSpan itemTrackingSpan, ITextView view) { AtDirective directive = (AtDirective)item; if (!item.IsValid || !directive.IsVendorSpecific()) { yield break; } ICssSchemaInstance schema = CssSchemaManager.SchemaManager.GetSchemaRootForBuffer(view.TextBuffer); var visitor = new CssItemCollector <AtDirective>(); directive.Parent.Accept(visitor); ICssCompletionListEntry entry = VendorHelpers.GetMatchingStandardEntry(directive, schema); if (entry != null && !visitor.Items.Any(d => d.Keyword != null && "@" + d.Keyword.Text == entry.DisplayText)) { yield return(new MissingStandardDirectiveSmartTagAction(itemTrackingSpan, directive, entry.DisplayText)); } }
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.Declarations.Where(d => d.IsValid && d.IsVendorSpecific()); foreach (Declaration vendor in vendors) { string name = GetStandardName(vendor); Declaration standard = rule.Declarations.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); } }
void Tree_ItemsChanged(object sender, CssItemsChangedEventArgs e) { CssTree tree = (CssTree)sender; foreach (ParseItem item in e.InsertedItems) { var visitor = new CssItemCollector<Declaration>(true); item.Accept(visitor); foreach (Declaration dec in visitor.Items) { if (dec.PropertyName != null && dec.PropertyName.Text == "display" && dec.Values.Any(v => v.Text == "inline")) { _cache.Add(dec); ParseItem rule = dec.Parent; Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Update(rule, tree)), DispatcherPriority.Normal); } } } foreach (ParseItem item in e.DeletedItems) { var visitor = new CssItemCollector<Declaration>(true); item.Accept(visitor); foreach (Declaration deleted in visitor.Items) { if (_cache.Contains(deleted)) { _cache.Remove(deleted); ParseItem rule = deleted.Parent; Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Update(rule, tree)), DispatcherPriority.Normal); } } } }
public IEnumerable<ISmartTagAction> GetSmartTagActions(ParseItem item, int position, ITrackingSpan itemTrackingSpan, ITextView view) { UrlItem url = (UrlItem)item; if (!url.IsValid || url.UrlString == null || !url.UrlString.Text.Contains(";base64,")) yield break; CComment comment = url.NextSibling as CComment; if (comment != null && comment.CommentText != null) { string path = comment.CommentText.Text.Trim(); yield return new UpdateEmbedSmartTagAction(itemTrackingSpan, path); } else { RuleBlock rule = item.FindType<RuleBlock>(); Declaration dec = item.FindType<Declaration>(); if (rule == null || dec == null || dec.PropertyName == null) yield break; foreach (Declaration sibling in rule.Declarations.Where(d => d.PropertyName != null && d != dec)) { if (sibling.PropertyName.Text == "*" + dec.PropertyName.Text || sibling.PropertyName.Text == "_" + dec.PropertyName.Text) { var visitor = new CssItemCollector<UrlItem>(); sibling.Accept(visitor); UrlItem siblingUrl = visitor.Items.FirstOrDefault(); if (siblingUrl != null && siblingUrl.UrlString != null) { yield return new UpdateEmbedSmartTagAction(itemTrackingSpan, siblingUrl.UrlString.Text); break; } } } } }
private IList<ParseItem> FindItems() { if (_item is HexColorValue) { var visitor = new CssItemCollector<HexColorValue>(); _item.StyleSheet.Accept(visitor); return visitor.Items.Where(i => i.Text == _item.Text).ToArray(); } else if (_item is FunctionColor) { var visitor = new CssItemCollector<FunctionColor>(); _item.StyleSheet.Accept(visitor); return visitor.Items.Where(i => i.Text == _item.Text).ToArray(); } else if (_item is TokenItem) { var visitor = new CssItemCollector<TokenItem>(); _item.StyleSheet.Accept(visitor); return visitor.Items.Where(i => i.TokenType == CssTokenType.Identifier && i.Text == _item.Text && i.FindType<Declaration>() != null).ToArray(); } return null; }
private static string RemoveDuplicateProperties(StringBuilder sb, CssEditorDocument doc, out int count) { var visitor = new CssItemCollector <RuleBlock>(true); doc.Tree.StyleSheet.Accept(visitor); count = 0; foreach (RuleBlock rule in visitor.Items.Reverse()) { HashSet <string> list = new HashSet <string>(); foreach (Declaration dec in rule.Declarations.Reverse()) { if (!list.Add(dec.Text)) { sb.Remove(dec.Start, dec.Length); count++; } } } return(sb.ToString()); }
private IList <ParseItem> FindItems() { if (_item is HexColorValue) { var visitor = new CssItemCollector <HexColorValue>(); _item.StyleSheet.Accept(visitor); return(visitor.Items.Where(i => i.Text == _item.Text).ToArray()); } else if (_item is FunctionColor) { var visitor = new CssItemCollector <FunctionColor>(); _item.StyleSheet.Accept(visitor); return(visitor.Items.Where(i => i.Text == _item.Text).ToArray()); } else if (_item is TokenItem) { var visitor = new CssItemCollector <TokenItem>(); _item.StyleSheet.Accept(visitor); return(visitor.Items.Where(i => i.TokenType == CssTokenType.Identifier && i.Text == _item.Text && i.FindType <Declaration>() != null).ToArray()); } return(null); }
private void ItemsChanged(ITextBuffer buffer, CssItemsChangedEventArgs e) { foreach (ParseItem item in e.InsertedItems) { var visitor = new CssItemCollector <Declaration>(true); item.Accept(visitor); foreach (Declaration dec in visitor.Items) { if (dec.PropertyName != null && dec.PropertyName.Text == "display" && dec.Values.Any(v => v.Text == "inline")) { _cache.Add(dec); ParseItem rule = dec.Parent; Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Update(rule, buffer)), DispatcherPriority.Normal); } } } foreach (ParseItem item in e.DeletedItems) { var visitor = new CssItemCollector <Declaration>(true); item.Accept(visitor); foreach (Declaration deleted in visitor.Items) { if (_cache.Contains(deleted)) { _cache.Remove(deleted); ParseItem rule = deleted.Parent; Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Update(rule, buffer)), DispatcherPriority.Normal); } } } }
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.Declarations.Where(d => d.IsValid && d.IsVendorSpecific()); foreach (Declaration vendor in vendors) { string name = GetStandardName(vendor); Declaration standard = rule.Declarations.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); } }
public string SortStyleSheet(string css) { ICssParser parser = new CssParser(); StyleSheet stylesheet = parser.Parse(css.Trim(), true); CssFormatter formatter = new CssFormatter(); formatter.Options.RemoveLastSemicolon = false; StringBuilder sb = new StringBuilder(stylesheet.Text); var visitor = new CssItemCollector<RuleBlock>(true); stylesheet.Accept(visitor); foreach (RuleBlock rule in visitor.Items.Where(r => r.IsValid).Reverse()) { if (rule.Declarations.Count <= 1) continue; int start = rule.OpenCurlyBrace.AfterEnd; int length = rule.Length - 2; string text = formatter.Format(rule.Text).Trim().Trim('}', '{'); string[] declarations = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var sorted = SortDeclarations(declarations); sb.Remove(start, length); sb.Insert(start, string.Join("", sorted)); } return sb.ToString(); }
private string PreprocessorSorting(StyleSheet stylesheet) { StringBuilder sb = new StringBuilder(stylesheet.Text); var visitor = new CssItemCollector<CssRuleBlock>(true); stylesheet.Accept(visitor); foreach (var rule in visitor.Items.Where(r => r.IsValid).Reverse()) { if (rule.Children.Count < 2) continue; int start = rule.OpenCurlyBrace.AfterEnd; int length = rule.Length - 1; length = AdjustLength(rule, start, length); if (length < 1) continue; string text = GetNormalizedText(rule, start, length); string[] declarations = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); //.Where(t => !string.IsNullOrWhiteSpace(t)).ToArray(); var sorted = SortDeclarations2(declarations); sb.Remove(start, length - 1); sb.Insert(start, string.Join("", sorted)); } return sb.ToString(); }
private string FindFile(IEnumerable<string> extensions, out int position) { LessParser parser = new LessParser(); string root = ProjectHelpers.GetProjectFolder(TextView.TextBuffer.GetFileName()); position = -1; string result = null; foreach (string ext in extensions) { foreach (string file in Directory.GetFiles(root, "*" + ext, SearchOption.AllDirectories)) { if (file.EndsWith(".min" + ext, StringComparison.OrdinalIgnoreCase)) continue; string text = File.ReadAllText(file); int index = text.IndexOf("." + _className, StringComparison.Ordinal); if (index > -1) { var css = parser.Parse(text, true); var visitor = new CssItemCollector<ClassSelector>(false); css.Accept(visitor); var selectors = visitor.Items.Where(c => c.ClassName.Text == _className); var high = selectors.FirstOrDefault(c => c.FindType<AtDirective>() == null && (c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ",")); if (high != null) { position = high.Start; return file; } var medium = selectors.FirstOrDefault(c => c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ","); if (medium != null) { position = medium.Start; result = file; continue; } var low = selectors.FirstOrDefault(); if (low != null) { position = low.Start; result = file; continue; } } } } return result; }
private static int AdjustLength(RuleBlock rule, int start, int length) { var inner = new CssItemCollector<RuleSet>(); rule.Accept(inner); if (inner.Items.Count > 0) { length = inner.Items[0].Start - start; } return length; }
private static IEnumerable<ColorModel> GetApplicableColors() { List<ParseItem> items = new List<ParseItem>(); //bool hasCustomItems = false; foreach (var item in _directives.Where(d => d.IsValid)) { // Global if (item.Keyword.Text == "global") { var visitor = new CssItemCollector<Declaration>(); item.Accept(visitor); items.AddRange(visitor.Items); } // Specific //else if (item.Keyword.Text == "specific") //{ // var visitor = new CssItemCollector<Declaration>(); // item.Accept(visitor); // var decs = visitor.Items.Where(d => propertyName.StartsWith(d.PropertyName.Text)); // if (decs.Any()) // { // items.AddRange(decs); // hasCustomItems = true; // } //} //// Catch all //else if (!hasCustomItems && item.Keyword.Text == "unspecified") //{ // var visitor = new CssItemCollector<Declaration>(); // item.Accept(visitor); // items.AddRange(visitor.Items); //} } foreach (Declaration declaration in items) { ColorModel model = ColorParser.TryParseColor(declaration.Values[0].Text, ColorParser.Options.AllowAlpha | ColorParser.Options.AllowNames); if (model != null) { yield return model; } } }
private string FindRuleSetInFile(IEnumerable <string> extensions, string id, out RuleSet rule) { string root = ProjectHelpers.GetProjectFolder(peekableItem._textbuffer.GetFileName()); string result = null; bool isLow = false, isMedium = false; rule = null; foreach (string ext in extensions) { ICssParser parser = CssParserLocator.FindComponent(Mef.GetContentType(ext.Trim('.'))).CreateParser(); foreach (string file in Directory.EnumerateFiles(root, "*" + ext, SearchOption.AllDirectories)) { if (file.EndsWith(".min" + ext, StringComparison.OrdinalIgnoreCase) || file.Contains("node_modules") || file.Contains("bower_components")) { continue; } string text = FileHelpers.ReadAllTextRetry(file).ConfigureAwait(false).GetAwaiter().GetResult(); int index = text.IndexOf("#" + id, StringComparison.Ordinal); if (index == -1) { continue; } var css = parser.Parse(text, true); var visitor = new CssItemCollector <IdSelector>(false); css.Accept(visitor); var selectors = visitor.Items.Where(c => c.HashName.Text == "#" + id); var high = selectors.FirstOrDefault(c => c.FindType <AtDirective>() == null && (c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ",")); if (high != null) { rule = high.FindType <RuleSet>(); return(file); } var medium = selectors.FirstOrDefault(c => c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ","); if (medium != null && !isMedium) { rule = medium.FindType <RuleSet>(); result = file; isMedium = true; continue; } var low = selectors.FirstOrDefault(); if (low != null && !isMedium && !isLow) { rule = low.FindType <RuleSet>(); result = file; isLow = true; continue; } } } return(result); }
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 images = rule.Declarations.Where(d => d.PropertyName.Text.Contains("background")); foreach (Declaration image in images) { if (!Cache.Contains(image)) Cache.Add(image); } rules.Add(rule); } }