From c15c57a6af582e8d8433bc1b293b471743fe2dc0 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Sun, 24 Apr 2022 22:44:53 -0600 Subject: [PATCH] LibMarkdown: Make thematic break parsing more correct also fix a conflict with lists and thematic breaks --- Userland/Libraries/LibMarkdown/ContainerBlock.cpp | 2 +- Userland/Libraries/LibMarkdown/HorizontalRule.cpp | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibMarkdown/ContainerBlock.cpp b/Userland/Libraries/LibMarkdown/ContainerBlock.cpp index acb0f4db59..7d6223c09a 100644 --- a/Userland/Libraries/LibMarkdown/ContainerBlock.cpp +++ b/Userland/Libraries/LibMarkdown/ContainerBlock.cpp @@ -108,11 +108,11 @@ OwnPtr ContainerBlock::parse(LineIterator& lines) } bool any = try_parse_block(lines, blocks) + || try_parse_block(lines, blocks) || try_parse_block(lines, blocks) || try_parse_block(lines, blocks) || try_parse_block(lines, blocks) || try_parse_block(lines, blocks) - || try_parse_block(lines, blocks) || try_parse_block
(lines, blocks); if (any) { diff --git a/Userland/Libraries/LibMarkdown/HorizontalRule.cpp b/Userland/Libraries/LibMarkdown/HorizontalRule.cpp index d18a9a489a..7bb8edb42f 100644 --- a/Userland/Libraries/LibMarkdown/HorizontalRule.cpp +++ b/Userland/Libraries/LibMarkdown/HorizontalRule.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Markdown { @@ -34,6 +35,8 @@ RecursionDecision HorizontalRule::walk(Visitor& visitor) const return RecursionDecision::Continue; } +static Regex thematic_break_re("^ {0,3}([\\*\\-_])(\\s*\\1\\s*){2,}$"); + OwnPtr HorizontalRule::parse(LineIterator& lines) { if (lines.is_end()) @@ -41,16 +44,9 @@ OwnPtr HorizontalRule::parse(LineIterator& lines) StringView line = *lines; - if (line.length() < 3) + auto match = thematic_break_re.match(line); + if (!match.success) return {}; - if (!line.starts_with('-') && !line.starts_with('_') && !line.starts_with('*')) - return {}; - - auto first_character = line.characters_without_null_termination()[0]; - for (auto ch : line) { - if (ch != first_character) - return {}; - } ++lines; return make();