Compare commits
2 commits
d89ef83551
...
d706fb8904
Author | SHA1 | Date | |
---|---|---|---|
d706fb8904 | |||
796da08ef9 |
|
@ -11,19 +11,25 @@ FetchContent_Declare(
|
|||
GIT_TAG c3b672634f0635af1ad0ffa8c15b34fc7c1035cf # 1.17.8
|
||||
)
|
||||
|
||||
FetchContent_Declare(
|
||||
libxml2
|
||||
GIT_REPOSITORY https://gitlab.gnome.org/GNOME/libxml2.git
|
||||
GIT_TAG f507d167f1755b7eaea09fb1a44d29aab828b6d1
|
||||
)
|
||||
|
||||
#FetchContent_MakeAvailable(cairo)
|
||||
|
||||
|
||||
add_library(clay
|
||||
src/color.c
|
||||
src/context.c
|
||||
src/debug.c
|
||||
src/document.c
|
||||
src/flex.c
|
||||
src/layout.c
|
||||
src/property.c
|
||||
src/render.c
|
||||
src/text.c
|
||||
src/clay/color.c
|
||||
src/clay/context.c
|
||||
src/clay/debug.c
|
||||
src/clay/document.c
|
||||
src/clay/flex.c
|
||||
src/clay/layout.c
|
||||
src/clay/property.c
|
||||
src/clay/render.c
|
||||
src/clay/text.c
|
||||
)
|
||||
|
||||
target_include_directories(clay PUBLIC include)
|
||||
|
@ -33,6 +39,12 @@ target_link_libraries(clay PRIVATE cairo)
|
|||
target_compile_options(clay PRIVATE -Wall -Werror)
|
||||
|
||||
if (PROJECT_IS_TOP_LEVEL)
|
||||
add_executable(clay-demo src/demo.c)
|
||||
add_executable(clay-demo src/clay-demo/demo.c)
|
||||
target_link_libraries(clay-demo PRIVATE clay)
|
||||
|
||||
FetchContent_MakeAvailable(libxml2)
|
||||
add_executable(clay-xml src/clay-xml/main.c)
|
||||
target_link_libraries(clay-xml PRIVATE clay)
|
||||
target_link_libraries(clay-xml PRIVATE LibXml2)
|
||||
|
||||
endif ()
|
71
src/clay-xml/main.c
Normal file
71
src/clay-xml/main.c
Normal file
|
@ -0,0 +1,71 @@
|
|||
#include <libxml/tree.h>
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include "clay.h"
|
||||
|
||||
|
||||
clay make_clay_from_xml(clay_ctx, xmlNodePtr);
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
assert(argc == 2);
|
||||
const char * input_file_name = argv[1];
|
||||
|
||||
xmlDocPtr doc;
|
||||
xmlNodePtr cur;
|
||||
doc = xmlParseFile(input_file_name);
|
||||
assert(doc != NULL);
|
||||
|
||||
xmlNodePtr rootNode = xmlDocGetRootElement(doc);
|
||||
assert(rootNode != NULL);
|
||||
assert(xmlStrcmp(rootNode->name, (const xmlChar *) "clay") == 0);
|
||||
|
||||
cur = rootNode->children;
|
||||
xmlNodePtr documentNode = NULL;
|
||||
while(cur != NULL) {
|
||||
if (cur->type == XML_ELEMENT_NODE) {
|
||||
assert(documentNode == NULL);
|
||||
assert(xmlStrcmp(cur->name, (const xmlChar *) "document") == 0);
|
||||
documentNode = cur;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
assert(documentNode != NULL);
|
||||
|
||||
clay_ctx ctx = clay_create_context();
|
||||
|
||||
clay document_element = make_clay_from_xml(ctx, documentNode);
|
||||
|
||||
xmlFreeDoc(doc);
|
||||
|
||||
clay_print_layout_tree(document_element);
|
||||
|
||||
clay_destroy_context(ctx);
|
||||
}
|
||||
|
||||
|
||||
clay make_clay_from_xml(clay_ctx ctx, xmlNodePtr xml_node) {
|
||||
clay layout = clay_create(ctx, (const char *)xml_node->name);
|
||||
xmlAttrPtr attribute = xml_node->properties;
|
||||
while (attribute != NULL) {
|
||||
const char * key = (const char *) attribute->name;
|
||||
char * value = (char *) xmlNodeListGetString(xml_node->doc, attribute->children, 1);
|
||||
clay_set(layout, key, value);
|
||||
attribute = attribute->next;
|
||||
}
|
||||
|
||||
xmlNodePtr child = xml_node->children;
|
||||
bool has_element_children = false;
|
||||
while(child != NULL) {
|
||||
if (child->type == XML_ELEMENT_NODE) {
|
||||
clay child_layout = make_clay_from_xml(ctx, child);
|
||||
clay_append_child(layout, child_layout);
|
||||
has_element_children = true;
|
||||
}
|
||||
child = child->next;
|
||||
}
|
||||
if (!has_element_children) {
|
||||
clay_set(layout, "text", (char*) xml_node->children->content);
|
||||
}
|
||||
|
||||
return layout;
|
||||
}
|
12
test.xml
Normal file
12
test.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<clay>
|
||||
<document width="800" height="400" background-color="#cef9f2ff">
|
||||
<flex direction="row" wrap="wrap" align-items="stretch" align-content="stretch" gap="20" padding="20">
|
||||
<text background-color="#04E76280" width="100" flex-grow="1" flex-shrink="1" align="center" vertical-align="middle">ITEM 1</text>
|
||||
<text background-color="#22312780" width="300" flex-grow="1" flex-shrink="1" align="center" vertical-align="middle">ITEM 2</text>
|
||||
<text background-color="#DC007380" width="200" flex-grow="1" flex-shrink="1" align="center" vertical-align="middle">ITEM 3</text>
|
||||
<text background-color="#008BF880" width="400" flex-grow="1" flex-shrink="1" align="center" vertical-align="middle">ITEM 4</text>
|
||||
<text background-color="#47006380" width="250" flex-grow="1" flex-shrink="1" align="center" vertical-align="middle">ITEM 5</text>
|
||||
</flex>
|
||||
</document>
|
||||
</clay>
|
Loading…
Reference in a new issue