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();