HorizontalRule.cpp 1.3 KB

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