source: gaycko/trunk/src/dom/dom.c @ 4727

Last change on this file since 4727 was 4727, checked in by Jean-Yves Lamoureux, 11 years ago
  • Added V8 test
  • command line test and usage display
File size: 3.1 KB
Line 
1#include <stdio.h>
2#include <string.h>
3#include "dom.h"
4#include "helpers/str.h"
5
6gDOM *gaycko_convert_dom(htmlDocPtr doc) {
7
8        gDOM *dom = malloc(sizeof(gDOM));
9        dom->root = NULL; 
10        htmlNodePtr root = xmlDocGetRootElement(doc);
11        gElement **r = NULL;
12        gElement *ret = NULL;
13
14        if(root != NULL)
15        {
16                ret = explore(r, root, 0, NULL);
17        }
18
19        dom->root = ret;
20        pretty_print(ret);
21
22        return dom;
23}
24
25
26gElement *add_element(htmlNodePtr node) {
27
28        gElement *e;
29        e = malloc(sizeof(gElement));
30        e->children_count  = 0;
31        e->children        = NULL;
32        e->attribute_count = 0;
33        e->attributes      = NULL;
34
35        e->name = (char*)strdup((const char*)node->name);
36
37        if(!strncmp(e->name, "html", 4)) {
38                e->type = ELEM_HTML;
39        }else if(!strncmp(e->name, "head", 4)) {
40                e->type = ELEM_HEAD;
41        }else if(!strncmp(e->name, "title", 5)) {
42                e->type = ELEM_TITLE;
43        }else if(!strncmp(e->name, "meta", 4)) {
44                e->type = ELEM_META;
45        }else if(!strncmp(e->name, "body", 4)) {
46                e->type = ELEM_BODY;
47        }else if(!strncmp(e->name, "h1", 2)) {
48                e->type = ELEM_H1;
49        }else if(!strncmp(e->name, "br", 2) || !strncmp(e->name, "br ", 3)) {
50                e->type = ELEM_BR;
51        }else if(!strncmp(e->name, "p", 1)) {
52                e->type = ELEM_P;
53        }else if(!strncmp(e->name, "img", 3)) {
54                e->type = ELEM_IMG;
55        }else if(!strncmp(e->name, "text", 4)) {
56                e->type = ELEM_TEXT;
57                e->text = (char*)strdup((const char*)xmlNodeGetContent(node));
58                strip_eol(e->text);
59                strip_spaces(e->text);
60        }else {
61                e->type = ELEM_UNKNOW;
62                printf("Unknow tag '%s'\n", e->name);   
63        }
64
65        if(node->properties) {
66                for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
67                        e->attributes = realloc(e->attributes, sizeof(gAttribute));
68                        e->attributes[e->attribute_count].name = strdup(attr->name);
69                        e->attributes[e->attribute_count].value = strdup(attr->children->content);
70                }
71        }
72
73        return e;
74}
75
76
77gElement* explore(gElement **elem, htmlNodePtr element, unsigned int level, gElement *parent)
78{
79        unsigned int c = 0;
80        for(htmlNodePtr node = element; node != NULL; node = node->next)
81        {
82                gElement *child = add_element(node);
83                child->level = level;
84
85                if(elem) elem  = realloc(elem, sizeof(gElement*)*(c+1));
86                else elem = malloc(sizeof(gElement*));
87
88
89                elem[c] = child;
90
91                c++;
92
93                if(node->type == XML_ELEMENT_NODE)
94                {
95                        if(node->children != NULL) {
96                                explore(child->children,
97                                                node->children,
98                                                level+1,
99                                                child);
100                        } else {
101                                free(child->children);
102                                child->children = NULL;
103                        }
104                }         
105                if(parent) {
106                        parent->children = realloc(parent->children, sizeof(gElement*)*(parent->children_count+1));
107                        parent->children[parent->children_count] = child;
108                        parent->children_count++;
109                }
110        }
111        return *elem;
112}
113
114
115#define LEVEL {unsigned int foo=0; for(foo=0; foo<elem->level; foo++) printf("    ");}
116
117void pretty_print(gElement *elem) {
118        if(!elem) {
119                printf("elem is %p\n", elem);
120                return;
121        }
122
123        if(elem->type == ELEM_TEXT) {
124                LEVEL printf("%s\n", elem->text);
125        } else {
126                LEVEL printf("<%s>\n", elem->name);
127        }
128
129        unsigned int i;
130        for(i=0; i < elem->children_count; i++) {
131                pretty_print(elem->children[i]);
132        }
133
134        if(elem->type == ELEM_TEXT) {
135
136        } else {
137                LEVEL printf("</%s>\n", elem->name);
138        }
139}
140
Note: See TracBrowser for help on using the repository browser.