private static string AddScopeToSelectors(string filePath, SourceText inputSourceText, string cssScope, out IEnumerable <RazorDiagnostic> diagnostics) { var cssParser = new DefaultParserFactory().CreateParser(); var inputText = inputSourceText.ToString(); var stylesheet = cssParser.Parse(inputText, insertComments: false); var resultBuilder = new StringBuilder(); var previousInsertionPosition = 0; var foundDiagnostics = new List <RazorDiagnostic>(); var ensureNoImportsVisitor = new EnsureNoImports(filePath, inputSourceText, stylesheet, foundDiagnostics); ensureNoImportsVisitor.Visit(); var scopeInsertionPositionsVisitor = new FindScopeInsertionEdits(stylesheet); scopeInsertionPositionsVisitor.Visit(); foreach (var edit in scopeInsertionPositionsVisitor.Edits) { resultBuilder.Append(inputText.Substring(previousInsertionPosition, edit.Position - previousInsertionPosition)); previousInsertionPosition = edit.Position; switch (edit) { case InsertSelectorScopeEdit _: resultBuilder.AppendFormat(CultureInfo.InvariantCulture, "[{0}]", cssScope); break; case InsertKeyframesNameScopeEdit _: resultBuilder.AppendFormat(CultureInfo.InvariantCulture, "-{0}", cssScope); break; case DeleteContentEdit deleteContentEdit: previousInsertionPosition += deleteContentEdit.DeleteLength; break; default: throw new NotImplementedException($"Unknown edit type: '{edit}'"); } } resultBuilder.Append(inputText.Substring(previousInsertionPosition)); diagnostics = foundDiagnostics; return(resultBuilder.ToString()); }
// Public for tests public static string AddScopeToSelectors(string inputText, string cssScope) { var cssParser = new DefaultParserFactory().CreateParser(); var stylesheet = cssParser.Parse(inputText, insertComments: false); var resultBuilder = new StringBuilder(); var previousInsertionPosition = 0; var scopeInsertionPositionsVisitor = new FindScopeInsertionEdits(stylesheet); scopeInsertionPositionsVisitor.Visit(); foreach (var edit in scopeInsertionPositionsVisitor.Edits) { resultBuilder.Append(inputText.Substring(previousInsertionPosition, edit.Position - previousInsertionPosition)); previousInsertionPosition = edit.Position; switch (edit) { case InsertSelectorScopeEdit _: resultBuilder.AppendFormat("[{0}]", cssScope); break; case InsertKeyframesNameScopeEdit _: resultBuilder.AppendFormat("-{0}", cssScope); break; case DeleteContentEdit deleteContentEdit: previousInsertionPosition += deleteContentEdit.DeleteLength; break; default: throw new NotImplementedException($"Unknown edit type: '{edit}'"); } } resultBuilder.Append(inputText.Substring(previousInsertionPosition)); return(resultBuilder.ToString()); }