From e084e1ced6029490e319d2cd1c36b3e2aa35b912 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Mon, 25 Apr 2022 17:48:13 -0600 Subject: [PATCH] LibMarkdown: Better support for code fences - Support tildes. - Support different lengths of fence. - Begrudgingly keep support for serenities one markdown extension. --- Userland/Libraries/LibMarkdown/CodeBlock.cpp | 26 ++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibMarkdown/CodeBlock.cpp b/Userland/Libraries/LibMarkdown/CodeBlock.cpp index 53e8e420f5..a59a15a2aa 100644 --- a/Userland/Libraries/LibMarkdown/CodeBlock.cpp +++ b/Userland/Libraries/LibMarkdown/CodeBlock.cpp @@ -75,9 +75,8 @@ RecursionDecision CodeBlock::walk(Visitor& visitor) const return RecursionDecision::Continue; } -static Regex style_spec_re("\\s*([\\*_]*)\\s*([^\\*_\\s]*).*"); - -static constexpr auto tick_tick_tick = "```"; +static Regex open_fence_re("^ {0,3}(([\\`\\~])\\2{2,})\\s*([\\*_]*)\\s*([^\\*_\\s]*).*$"); +static Regex close_fence_re("^ {0,3}(([\\`\\~])\\2{2,})\\s*$"); static Optional line_block_prefix(StringView const& line) { @@ -111,7 +110,7 @@ OwnPtr CodeBlock::parse(LineIterator& lines) return {}; StringView line = *lines; - if (line.starts_with(tick_tick_tick)) + if (open_fence_re.match(line).success) return parse_backticks(lines); if (line_block_prefix(line).has_value()) @@ -135,10 +134,11 @@ OwnPtr CodeBlock::parse_backticks(LineIterator& lines) // The code block will be made bold, // and if possible syntax-highlighted // as appropriate for a shell script. - StringView style_spec = line.substring_view(3, line.length() - 3); - auto matches = style_spec_re.match(style_spec); - auto style = matches.capture_group_matches[0][0].view.string_view(); - auto language = matches.capture_group_matches[0][1].view.string_view(); + + auto matches = open_fence_re.match(line).capture_group_matches[0]; + auto fence = matches[0].view.string_view(); + auto style = matches[2].view.string_view(); + auto language = matches[3].view.string_view(); ++lines; @@ -150,8 +150,14 @@ OwnPtr CodeBlock::parse_backticks(LineIterator& lines) break; line = *lines; ++lines; - if (line == tick_tick_tick) - break; + + auto close_match = close_fence_re.match(line); + if (close_match.success) { + auto close_fence = close_match.capture_group_matches[0][0].view.string_view(); + if (close_fence[0] == fence[0] && close_fence.length() >= fence.length()) + break; + } + if (!first) builder.append('\n'); builder.append(line);