浏览代码

LibHTML: Add an empty CSS parser.

Andreas Kling 6 年之前
父节点
当前提交
891e668e35

+ 1 - 0
LibHTML/CSS/.gitignore

@@ -0,0 +1 @@
+DefaultStyleSheetSource.cpp

+ 1 - 1
LibHTML/CSS/StyleDeclaration.h

@@ -5,7 +5,7 @@
 
 class StyleDeclaration : public RefCounted<StyleDeclaration> {
 public:
-    NonnullRefPtr<StyleDeclaration> create(const String& property_name, NonnullRefPtr<StyleValue>&& value)
+    static NonnullRefPtr<StyleDeclaration> create(const String& property_name, NonnullRefPtr<StyleValue>&& value)
     {
         return adopt(*new StyleDeclaration(property_name, move(value)));
     }

+ 3 - 0
LibHTML/CSS/StyleRule.cpp

@@ -4,5 +4,8 @@ StyleRule::StyleRule(Vector<Selector>&& selectors, Vector<NonnullRefPtr<StyleDec
     : m_selectors(move(selectors))
     , m_declarations(move(declarations))
 {
+}
 
+StyleRule::~StyleRule()
+{
 }

+ 1 - 1
LibHTML/CSS/StyleRule.h

@@ -6,7 +6,7 @@
 
 class StyleRule : public RefCounted<StyleRule> {
 public:
-    NonnullRefPtr<StyleRule> create(Vector<Selector>&& selectors, Vector<NonnullRefPtr<StyleDeclaration>>&& declarations)
+    static NonnullRefPtr<StyleRule> create(Vector<Selector>&& selectors, Vector<NonnullRefPtr<StyleDeclaration>>&& declarations)
     {
         return adopt(*new StyleRule(move(selectors), move(declarations)));
     }

+ 1 - 1
LibHTML/CSS/StyleSheet.h

@@ -5,7 +5,7 @@
 
 class StyleSheet : public RefCounted<StyleSheet> {
 public:
-    NonnullRefPtr<StyleSheet> create(Vector<NonnullRefPtr<StyleRule>>&& rules)
+    static NonnullRefPtr<StyleSheet> create(Vector<NonnullRefPtr<StyleRule>>&& rules)
     {
         return adopt(*new StyleSheet(move(rules)));
     }

+ 6 - 0
LibHTML/Dump.cpp

@@ -1,3 +1,4 @@
+#include <LibHTML/CSS/StyleSheet.h>
 #include <LibHTML/DOM/Document.h>
 #include <LibHTML/DOM/Element.h>
 #include <LibHTML/DOM/Text.h>
@@ -65,3 +66,8 @@ void dump_tree(const LayoutNode& layout_node)
     });
     --indent;
 }
+
+void dump_sheet(const StyleSheet& sheet)
+{
+    printf("StyleSheet{%p}: %d rule(s)\n", &sheet, sheet.rules().size());
+}

+ 2 - 0
LibHTML/Dump.h

@@ -2,6 +2,8 @@
 
 class Node;
 class LayoutNode;
+class StyleSheet;
 
 void dump_tree(const Node&);
 void dump_tree(const LayoutNode&);
+void dump_sheet(const StyleSheet&);

+ 10 - 2
LibHTML/Makefile

@@ -11,7 +11,9 @@ LIBHTML_OBJS = \
     CSS/StyleRule.o \
     CSS/StyleDeclaration.o \
     CSS/StyleValue.o \
-    Parser/Parser.o \
+    CSS/DefaultStyleSheetSource.o \
+    Parser/HTMLParser.o \
+    Parser/CSSParser.o \
     Layout/LayoutNode.o \
     Layout/LayoutText.o \
     Layout/LayoutBlock.o \
@@ -21,6 +23,9 @@ LIBHTML_OBJS = \
     Frame.o \
     Dump.o
 
+GENERATED_SOURCES = \
+    CSS/DefaultStyleSheetSource.cpp
+
 TEST_OBJS = test.o
 TEST_PROGRAM = tho
 
@@ -31,6 +36,9 @@ DEFINES += -DUSERLAND
 
 all: $(LIBRARY) $(TEST_PROGRAM)
 
+CSS/DefaultStyleSheetSource.cpp: CSS/Default.css Scripts/GenerateStyleSheetSource.sh
+	@echo "GENERATE $@"; Scripts/GenerateStyleSheetSource.sh default_stylesheet_source $< > $@
+
 $(TEST_PROGRAM): $(TEST_OBJS) $(LIBRARY)
 	$(LD) -o $@ $(LDFLAGS) -L. $(TEST_OBJS) -lhtml -lgui -lcore -lc
 
@@ -43,7 +51,7 @@ $(LIBRARY): $(LIBHTML_OBJS)
 -include $(OBJS:%.o=%.d)
 
 clean:
-	@echo "CLEAN"; rm -f $(TEST_PROGRAM) $(LIBRARY) $(OBJS) *.d
+	@echo "CLEAN"; rm -f $(TEST_PROGRAM) $(LIBRARY) $(OBJS) *.d $(GENERATED_SOURCES)
 
 install: $(LIBRARY)
 	mkdir -p ../Root/usr/include/LibHTML

+ 11 - 0
LibHTML/Parser/CSSParser.cpp

@@ -0,0 +1,11 @@
+#include <LibHTML/CSS/StyleSheet.h>
+#include <LibHTML/Parser/CSSParser.h>
+#include <ctype.h>
+#include <stdio.h>
+
+NonnullRefPtr<StyleSheet> parse_css(const String& css)
+{
+    Vector<NonnullRefPtr<StyleRule>> rules;
+
+    return StyleSheet::create(move(rules));
+}

+ 7 - 0
LibHTML/Parser/CSSParser.h

@@ -0,0 +1,7 @@
+#pragma once
+
+#include <AK/NonnullRefPtr.h>
+#include <LibHTML/CSS/StyleSheet.h>
+
+NonnullRefPtr<StyleSheet> parse_css(const String&);
+

+ 2 - 2
LibHTML/Parser/Parser.cpp → LibHTML/Parser/HTMLParser.cpp

@@ -1,6 +1,6 @@
 #include <LibHTML/DOM/Element.h>
 #include <LibHTML/DOM/Text.h>
-#include <LibHTML/Parser/Parser.h>
+#include <LibHTML/Parser/HTMLParser.h>
 #include <ctype.h>
 #include <stdio.h>
 
@@ -32,7 +32,7 @@ static bool is_self_closing_tag(const String& tag_name)
         || tag_name == "wbr";
 }
 
-NonnullRefPtr<Document> parse(const String& html)
+NonnullRefPtr<Document> parse_html(const String& html)
 {
     Vector<NonnullRefPtr<ParentNode>> node_stack;
 

+ 1 - 1
LibHTML/Parser/Parser.h → LibHTML/Parser/HTMLParser.h

@@ -3,5 +3,5 @@
 #include <AK/NonnullRefPtr.h>
 #include <LibHTML/DOM/Document.h>
 
-NonnullRefPtr<Document> parse(const String& html);
+NonnullRefPtr<Document> parse_html(const String&);
 

+ 10 - 0
LibHTML/Scripts/GenerateStyleSheetSource.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+
+echo "extern const char $1[];"
+echo "const char $1[] = \"\\"
+IFS=$'\n'
+for line in $(cat $2); do
+    echo $line"\\"
+done
+echo "\";"
+

+ 10 - 2
LibHTML/test.cpp

@@ -1,7 +1,8 @@
 #include <LibCore/CFile.h>
 #include <LibHTML/Dump.h>
 #include <LibHTML/Frame.h>
-#include <LibHTML/Parser/Parser.h>
+#include <LibHTML/Parser/CSSParser.h>
+#include <LibHTML/Parser/HTMLParser.h>
 #include <stdio.h>
 
 int main(int argc, char** argv)
@@ -11,8 +12,15 @@ int main(int argc, char** argv)
         fprintf(stderr, "Error: %s\n", f.error_string());
         return 1;
     }
+
+    extern const char default_stylesheet_source[];
+    String css = default_stylesheet_source;
+
+    auto sheet = parse_css(css);
+    dump_sheet(sheet);
+
     String html = String::copy(f.read_all());
-    auto doc = parse(html);
+    auto doc = parse_html(html);
     dump_tree(doc);
 
     doc->build_layout_tree();