summaryrefslogtreecommitdiff
path: root/Libraries/LibHTML/Layout
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibHTML/Layout')
-rw-r--r--Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp51
-rw-r--r--Libraries/LibHTML/Layout/LayoutTreeBuilder.h13
2 files changed, 64 insertions, 0 deletions
diff --git a/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp b/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp
new file mode 100644
index 0000000000..4345d8be5d
--- /dev/null
+++ b/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp
@@ -0,0 +1,51 @@
+#include <LibHTML/DOM/Document.h>
+#include <LibHTML/DOM/ParentNode.h>
+#include <LibHTML/Layout/LayoutNode.h>
+#include <LibHTML/Layout/LayoutText.h>
+#include <LibHTML/Layout/LayoutTreeBuilder.h>
+
+LayoutTreeBuilder::LayoutTreeBuilder()
+{
+}
+
+static RefPtr<LayoutNode> create_layout_tree(Node& node, const StyleProperties* parent_style)
+{
+ auto layout_node = node.create_layout_node(node.document().style_resolver(), parent_style);
+ if (!layout_node)
+ return nullptr;
+
+ if (!node.has_children())
+ return layout_node;
+
+ NonnullRefPtrVector<LayoutNode> layout_children;
+ bool have_inline_children = false;
+ bool have_block_children = false;
+
+ to<ParentNode>(node).for_each_child([&](Node& child) {
+ auto layout_child = create_layout_tree(child, &layout_node->style());
+ if (!layout_child)
+ return;
+ if (layout_child->is_inline())
+ have_inline_children = true;
+ if (layout_child->is_block())
+ have_block_children = true;
+ layout_children.append(layout_child.release_nonnull());
+ });
+
+ for (auto& layout_child : layout_children)
+ if (have_block_children && have_inline_children && !layout_child.is_block()) {
+ if (is<LayoutText>(layout_child) && to<LayoutText>(layout_child).text_for_style(*parent_style) == " ")
+ continue;
+ layout_node->inline_wrapper().append_child(layout_child);
+ } else {
+ layout_node->append_child(layout_child);
+ }
+ return layout_node;
+}
+
+RefPtr<LayoutNode> LayoutTreeBuilder::build(Node& node)
+{
+ // FIXME: Support building partial trees.
+ ASSERT(is<Document>(node));
+ return create_layout_tree(node, nullptr);
+}
diff --git a/Libraries/LibHTML/Layout/LayoutTreeBuilder.h b/Libraries/LibHTML/Layout/LayoutTreeBuilder.h
new file mode 100644
index 0000000000..e703fb5ed1
--- /dev/null
+++ b/Libraries/LibHTML/Layout/LayoutTreeBuilder.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <AK/RefPtr.h>
+
+class Node;
+class LayoutNode;
+
+class LayoutTreeBuilder {
+public:
+ LayoutTreeBuilder();
+
+ RefPtr<LayoutNode> build(Node&);
+};