public string SortScss(string scss) { ICssParser parser = CssParserLocator.FindComponent(ContentTypeManager.GetContentType(ScssContentTypeDefinition.ScssContentType)).CreateParser(); StyleSheet stylesheet = parser.Parse(scss.Trim(), true); return(PreprocessorSorting(stylesheet)); }
private string FindFile(IEnumerable <string> extensions, out int position) { ICssParser parser = CssParserLocator.FindComponent(Mef.GetContentType(LessContentTypeDefinition.LessContentType)).CreateParser(); 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 void VerifyTreeAfterIncrementalParse(ITextProvider newText, TokenList newTokens, StyleSheet newStyleSheet) { ICssParser parser = _parserFactory.CreateParser(); StyleSheet validStyleSheet = parser.Parse(newText, newTokens, insertComments: true); // By the way, this is the slowest and most lame way to compare two trees DebugWriter writer = new DebugWriter(); string validTreeText = writer.Serialize(newText, validStyleSheet); string newTreeText = writer.Serialize(newText, newStyleSheet); Debug.Assert(validTreeText == newTreeText, "Bad tree after incremental parsing"); }
public static StyleSheet GetOrCreateStyleSheet(GraphNode node, IFileExtensionRegistryService fileService) { StyleSheet stylesheet = node.Id.GetNestedValueByName <StyleSheet>(CssGraphSchema.CssStyleSheet); if (stylesheet == null) { Uri url = node.Id.GetNestedValueByName <Uri>(CodeGraphNodeIdName.File); IContentType contentType = fileService.GetContentTypeForExtension(Path.GetExtension(url.LocalPath)); string contentTypeName = (contentType != null) ? contentType.TypeName : CssContentTypeDefinition.CssContentType; ICssParser parser = contentTypeName == LessContentTypeDefinition.LessContentType ? new LessParser() : new CssParser(); stylesheet = parser.Parse(File.ReadAllText(url.LocalPath), false); } return(stylesheet); }
/// <summary> /// Internal function to parse a new StyleSheet object /// </summary> private void ParseNewStyleSheet(ITextProvider textProvider, TokenList tokens) { ICssParser parser = _parserFactory.CreateParser(); if (tokens == null) { ICssTokenizer tokenizer = parser.TokenizerFactory.CreateTokenizer(); tokens = tokenizer.Tokenize(textProvider, 0, textProvider.Length, keepWhiteSpace: false); } using (CreateWriteLock()) { Tokens = tokens; StyleSheet = parser.Parse(textProvider, tokens, insertComments: true); } TreeUpdated?.Invoke(this, new CssTreeUpdateEventArgs(this)); }
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 string FindFile(IEnumerable <string> extensions, out int position) { string root = ProjectHelpers.GetProjectFolder(TextView.TextBuffer.GetFileName()); position = -1; bool isLow = false, isMedium = false; string result = null; foreach (string ext in extensions) { ICssParser parser = CssParserLocator.FindComponent(ProjectHelpers.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 = File.ReadAllText(file); int index = text.IndexOf("." + _className, StringComparison.Ordinal); if (index == -1) { continue; } Microsoft.WebTools.Languages.Css.TreeItems.StyleSheet css = parser.Parse(text, true); var visitor = new CssItemCollector <ClassSelector>(false); css.Accept(visitor); IEnumerable <ClassSelector> selectors = visitor.Items.Where(c => c.ClassName.Text == _className); ClassSelector high = selectors.FirstOrDefault(c => c.FindType <AtDirective>() == null && (c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ",")); if (high != null) { position = high.Start; return(file); } ClassSelector medium = selectors.FirstOrDefault(c => c.Parent.NextSibling == null || c.Parent.NextSibling.Text == ","); if (medium != null && !isMedium) { position = medium.Start; result = file; isMedium = true; continue; } ClassSelector low = selectors.FirstOrDefault(); if (low != null && !isMedium && !isLow) { position = low.Start; result = file; isLow = true; continue; } } } return(result); }