Преглед на файлове

LibWeb: Add folding regions to CSS syntax highlighter

Sam Atkins преди 2 години
родител
ревизия
cdf80f20e6
променени са 1 файла, в които са добавени 15 реда и са изтрити 0 реда
  1. 15 0
      Userland/Libraries/LibWeb/CSS/SyntaxHighlighter/SyntaxHighlighter.cpp

+ 15 - 0
Userland/Libraries/LibWeb/CSS/SyntaxHighlighter/SyntaxHighlighter.cpp

@@ -25,6 +25,8 @@ void SyntaxHighlighter::rehighlight(Palette const& palette)
     dbgln_if(SYNTAX_HIGHLIGHTING_DEBUG, "(CSS::SyntaxHighlighter) starting rehighlight");
     dbgln_if(SYNTAX_HIGHLIGHTING_DEBUG, "(CSS::SyntaxHighlighter) starting rehighlight");
     auto text = m_client->get_text();
     auto text = m_client->get_text();
 
 
+    Vector<Parser::Token> folding_region_start_tokens;
+    Vector<GUI::TextDocumentFoldingRegion> folding_regions;
     Vector<GUI::TextDocumentSpan> spans;
     Vector<GUI::TextDocumentSpan> spans;
 
 
     auto highlight = [&](auto start_line, auto start_column, auto end_line, auto end_column, Gfx::TextAttributes attributes, CSS::Parser::Token::Type type) {
     auto highlight = [&](auto start_line, auto start_column, auto end_line, auto end_column, Gfx::TextAttributes attributes, CSS::Parser::Token::Type type) {
@@ -49,6 +51,18 @@ void SyntaxHighlighter::rehighlight(Palette const& palette)
         if (token.is(Parser::Token::Type::EndOfFile))
         if (token.is(Parser::Token::Type::EndOfFile))
             break;
             break;
 
 
+        if (token.is(Parser::Token::Type::OpenCurly)) {
+            folding_region_start_tokens.append(token);
+        } else if (token.is(Parser::Token::Type::CloseCurly)) {
+            if (!folding_region_start_tokens.is_empty()) {
+                auto start_token = folding_region_start_tokens.take_last();
+                GUI::TextDocumentFoldingRegion folding_region;
+                folding_region.range.set_start({ start_token.end_position().line, start_token.end_position().column });
+                folding_region.range.set_end({ token.start_position().line, token.start_position().column });
+                folding_regions.append(move(folding_region));
+            }
+        }
+
         switch (token.type()) {
         switch (token.type()) {
         case Parser::Token::Type::Ident:
         case Parser::Token::Type::Ident:
             highlight(token.start_position().line, token.start_position().column, token.end_position().line, token.end_position().column, { palette.syntax_identifier(), {} }, token.type());
             highlight(token.start_position().line, token.start_position().column, token.end_position().line, token.end_position().column, { palette.syntax_identifier(), {} }, token.type());
@@ -135,6 +149,7 @@ void SyntaxHighlighter::rehighlight(Palette const& palette)
     }
     }
 
 
     m_client->do_set_spans(move(spans));
     m_client->do_set_spans(move(spans));
+    m_client->do_set_folding_regions(move(folding_regions));
     m_has_brace_buddies = false;
     m_has_brace_buddies = false;
     highlight_matching_token_pair();
     highlight_matching_token_pair();
     m_client->do_update();
     m_client->do_update();