浏览代码

LibMarkdown: Add blockquotes

Peter Elliott 3 年之前
父节点
当前提交
e02c843af4

+ 44 - 0
Userland/Libraries/LibMarkdown/BlockQuote.cpp

@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2021, Peter Elliott <pelliott@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/StringBuilder.h>
+#include <LibMarkdown/BlockQuote.h>
+
+namespace Markdown {
+
+String BlockQuote::render_to_html(bool) const
+{
+    StringBuilder builder;
+    builder.append("<blockquote>\n");
+    builder.append(m_contents->render_to_html());
+    builder.append("</blockquote>\n");
+    return builder.build();
+}
+
+String BlockQuote::render_for_terminal(size_t view_width) const
+{
+    // FIXME: Rewrite the whole terminal renderer to make blockquote rendering possible
+    return m_contents->render_for_terminal(view_width);
+}
+
+OwnPtr<BlockQuote> BlockQuote::parse(LineIterator& lines)
+{
+    lines.push_context(LineIterator::Context::block_quote());
+    if (lines.is_end()) {
+        lines.pop_context();
+        return {};
+    }
+
+    auto contents = ContainerBlock::parse(lines);
+    lines.pop_context();
+
+    if (!contents)
+        return {};
+
+    return make<BlockQuote>(move(contents));
+}
+
+}

+ 32 - 0
Userland/Libraries/LibMarkdown/BlockQuote.h

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2021, Peter Elliott <pelliott@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/OwnPtr.h>
+#include <LibMarkdown/Block.h>
+#include <LibMarkdown/ContainerBlock.h>
+
+namespace Markdown {
+
+class BlockQuote final : public Block {
+public:
+    BlockQuote(OwnPtr<ContainerBlock> contents)
+        : m_contents(move(contents))
+    {
+    }
+    virtual ~BlockQuote() override { }
+
+    virtual String render_to_html(bool tight = false) const override;
+    virtual String render_for_terminal(size_t view_width = 0) const override;
+
+    static OwnPtr<BlockQuote> parse(LineIterator& lines);
+
+private:
+    OwnPtr<ContainerBlock> m_contents;
+};
+
+}

+ 1 - 0
Userland/Libraries/LibMarkdown/CMakeLists.txt

@@ -1,4 +1,5 @@
 set(SOURCES
+    BlockQuote.cpp
     CodeBlock.cpp
     ContainerBlock.cpp
     Document.cpp

+ 3 - 1
Userland/Libraries/LibMarkdown/ContainerBlock.cpp

@@ -4,6 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <LibMarkdown/BlockQuote.h>
 #include <LibMarkdown/CodeBlock.h>
 #include <LibMarkdown/ContainerBlock.h>
 #include <LibMarkdown/Heading.h>
@@ -91,7 +92,8 @@ OwnPtr<ContainerBlock> ContainerBlock::parse(LineIterator& lines)
         }
 
         bool any = try_parse_block<Table>(lines, blocks) || try_parse_block<List>(lines, blocks) || try_parse_block<CodeBlock>(lines, blocks)
-            || try_parse_block<Heading>(lines, blocks) || try_parse_block<HorizontalRule>(lines, blocks);
+            || try_parse_block<Heading>(lines, blocks) || try_parse_block<HorizontalRule>(lines, blocks)
+            || try_parse_block<BlockQuote>(lines, blocks);
 
         if (any) {
             if (!paragraph_text.is_empty()) {