Serenity Operating System
1/*
2 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/DeprecatedString.h>
8#include <AK/StringBuilder.h>
9#include <LibMarkdown/HorizontalRule.h>
10#include <LibMarkdown/Visitor.h>
11#include <LibRegex/Regex.h>
12
13namespace Markdown {
14
15DeprecatedString HorizontalRule::render_to_html(bool) const
16{
17 return "<hr />\n";
18}
19
20Vector<DeprecatedString> HorizontalRule::render_lines_for_terminal(size_t view_width) const
21{
22 StringBuilder builder(view_width + 1);
23 for (size_t i = 0; i < view_width; ++i)
24 builder.append('-');
25 builder.append("\n\n"sv);
26 return Vector<DeprecatedString> { builder.to_deprecated_string() };
27}
28
29RecursionDecision HorizontalRule::walk(Visitor& visitor) const
30{
31 RecursionDecision rd = visitor.visit(*this);
32 if (rd != RecursionDecision::Recurse)
33 return rd;
34 // Normalize return value.
35 return RecursionDecision::Continue;
36}
37
38static Regex<ECMA262> thematic_break_re("^ {0,3}([\\*\\-_])(\\s*\\1\\s*){2,}$");
39
40OwnPtr<HorizontalRule> HorizontalRule::parse(LineIterator& lines)
41{
42 if (lines.is_end())
43 return {};
44
45 StringView line = *lines;
46
47 auto match = thematic_break_re.match(line);
48 if (!match.success)
49 return {};
50
51 ++lines;
52 return make<HorizontalRule>();
53}
54
55}