diff --git a/LibHTML/CSS/.gitignore b/LibHTML/CSS/.gitignore
new file mode 100644
index 0000000000..887283905e
--- /dev/null
+++ b/LibHTML/CSS/.gitignore
@@ -0,0 +1 @@
+DefaultStyleSheetSource.cpp
diff --git a/LibHTML/CSS/StyleDeclaration.h b/LibHTML/CSS/StyleDeclaration.h
index b9e3291838..e5ca7a04f8 100644
--- a/LibHTML/CSS/StyleDeclaration.h
+++ b/LibHTML/CSS/StyleDeclaration.h
@@ -5,7 +5,7 @@
class StyleDeclaration : public RefCounted {
public:
- NonnullRefPtr create(const String& property_name, NonnullRefPtr&& value)
+ static NonnullRefPtr create(const String& property_name, NonnullRefPtr&& value)
{
return adopt(*new StyleDeclaration(property_name, move(value)));
}
diff --git a/LibHTML/CSS/StyleRule.cpp b/LibHTML/CSS/StyleRule.cpp
index f8688b9630..06a5925788 100644
--- a/LibHTML/CSS/StyleRule.cpp
+++ b/LibHTML/CSS/StyleRule.cpp
@@ -4,5 +4,8 @@ StyleRule::StyleRule(Vector&& selectors, Vector {
public:
- NonnullRefPtr create(Vector&& selectors, Vector>&& declarations)
+ static NonnullRefPtr create(Vector&& selectors, Vector>&& declarations)
{
return adopt(*new StyleRule(move(selectors), move(declarations)));
}
diff --git a/LibHTML/CSS/StyleSheet.h b/LibHTML/CSS/StyleSheet.h
index 3a48e3a563..f769e0f8e1 100644
--- a/LibHTML/CSS/StyleSheet.h
+++ b/LibHTML/CSS/StyleSheet.h
@@ -5,7 +5,7 @@
class StyleSheet : public RefCounted {
public:
- NonnullRefPtr create(Vector>&& rules)
+ static NonnullRefPtr create(Vector>&& rules)
{
return adopt(*new StyleSheet(move(rules)));
}
diff --git a/LibHTML/Dump.cpp b/LibHTML/Dump.cpp
index 8fbaec164d..3fb8d1a741 100644
--- a/LibHTML/Dump.cpp
+++ b/LibHTML/Dump.cpp
@@ -1,3 +1,4 @@
+#include
#include
#include
#include
@@ -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());
+}
diff --git a/LibHTML/Dump.h b/LibHTML/Dump.h
index cb5bfe64fb..b7049f861a 100644
--- a/LibHTML/Dump.h
+++ b/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&);
diff --git a/LibHTML/Makefile b/LibHTML/Makefile
index 1e3039fb72..bc3890a498 100644
--- a/LibHTML/Makefile
+++ b/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
diff --git a/LibHTML/Parser/CSSParser.cpp b/LibHTML/Parser/CSSParser.cpp
new file mode 100644
index 0000000000..be1c745746
--- /dev/null
+++ b/LibHTML/Parser/CSSParser.cpp
@@ -0,0 +1,11 @@
+#include
+#include
+#include
+#include
+
+NonnullRefPtr parse_css(const String& css)
+{
+ Vector> rules;
+
+ return StyleSheet::create(move(rules));
+}
diff --git a/LibHTML/Parser/CSSParser.h b/LibHTML/Parser/CSSParser.h
new file mode 100644
index 0000000000..90003bbf01
--- /dev/null
+++ b/LibHTML/Parser/CSSParser.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include
+#include
+
+NonnullRefPtr parse_css(const String&);
+
diff --git a/LibHTML/Parser/Parser.cpp b/LibHTML/Parser/HTMLParser.cpp
similarity index 98%
rename from LibHTML/Parser/Parser.cpp
rename to LibHTML/Parser/HTMLParser.cpp
index 63f1ffb45b..1f8faaf37c 100644
--- a/LibHTML/Parser/Parser.cpp
+++ b/LibHTML/Parser/HTMLParser.cpp
@@ -1,6 +1,6 @@
#include
#include
-#include
+#include
#include
#include
@@ -32,7 +32,7 @@ static bool is_self_closing_tag(const String& tag_name)
|| tag_name == "wbr";
}
-NonnullRefPtr parse(const String& html)
+NonnullRefPtr parse_html(const String& html)
{
Vector> node_stack;
diff --git a/LibHTML/Parser/Parser.h b/LibHTML/Parser/HTMLParser.h
similarity index 61%
rename from LibHTML/Parser/Parser.h
rename to LibHTML/Parser/HTMLParser.h
index 976fe6b617..5b7c5482eb 100644
--- a/LibHTML/Parser/Parser.h
+++ b/LibHTML/Parser/HTMLParser.h
@@ -3,5 +3,5 @@
#include
#include
-NonnullRefPtr parse(const String& html);
+NonnullRefPtr parse_html(const String&);
diff --git a/LibHTML/Scripts/GenerateStyleSheetSource.sh b/LibHTML/Scripts/GenerateStyleSheetSource.sh
new file mode 100755
index 0000000000..4bea749e04
--- /dev/null
+++ b/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 "\";"
+
diff --git a/LibHTML/test.cpp b/LibHTML/test.cpp
index db55d2f196..2e426dea22 100644
--- a/LibHTML/test.cpp
+++ b/LibHTML/test.cpp
@@ -1,7 +1,8 @@
#include
#include
#include
-#include
+#include
+#include
#include
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();