Beispiel #1
0
        public string SortScss(string scss)
        {
            ICssParser parser     = CssParserLocator.FindComponent(ContentTypeManager.GetContentType(ScssContentTypeDefinition.ScssContentType)).CreateParser();
            StyleSheet stylesheet = parser.Parse(scss.Trim(), true);

            return(PreprocessorSorting(stylesheet));
        }
Beispiel #2
0
        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));
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }