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

Last change on this file since 4739 was 4739, checked in by Jean-Yves Lamoureux, 9 years ago
  • Added table / tr / td
File size: 3.6 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        if(!node->name) {
36                e->name = strdup("UNKNOW");
37                e->type = ELEM_UNKNOW;
38                return e;       
39        }
40       
41        e->name = (char*)strdup((const char*)node->name);
42        if(!strncmp(e->name, "html", 4)) {
43                e->type = ELEM_HTML;
44        }else if(!strncmp(e->name, "head", 4)) {
45                e->type = ELEM_HEAD;
46        }else if(!strncmp(e->name, "title", 5)) {
47                e->type = ELEM_TITLE;
48        }else if(!strncmp(e->name, "meta", 4)) {
49                e->type = ELEM_META;
50        }else if(!strncmp(e->name, "body", 4)) {
51                e->type = ELEM_BODY;
52        }else if(!strncmp(e->name, "h1", 2)) {
53                e->type = ELEM_H1;
54        }else if(!strncmp(e->name, "br", 2) || !strncmp(e->name, "br ", 3)) {
55                e->type = ELEM_BR;
56        }else if(!strncmp(e->name, "p", 1)) {
57                e->type = ELEM_P;
58        }else if(!strncmp(e->name, "img", 3)) {
59                e->type = ELEM_IMG;
60        }else if(!strncmp(e->name, "table", 3)) {
61                e->type = ELEM_TABLE;
62        }else if(!strncmp(e->name, "tr", 3)) {
63                e->type = ELEM_TR;
64        }else if(!strncmp(e->name, "td", 3)) {
65                e->type = ELEM_TD;
66        }else if(!strncmp(e->name, "text", 4)) {
67                e->type = ELEM_TEXT;
68                e->text = (char*)strdup((const char*)xmlNodeGetContent(node));
69                strip_eol(e->text);
70                strip_spaces(e->text);
71        }else {
72                e->type = ELEM_UNKNOW;
73                printf("Unknow tag '%s'\n", e->name);   
74        }
75
76        if(node->properties) {
77                for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
78                        e->attributes = realloc(e->attributes, sizeof(gAttribute));
79                        e->attributes[e->attribute_count].name = strdup(attr->name);
80                        e->attributes[e->attribute_count].value = strdup(attr->children->content);
81            e->attribute_count++;
82                }
83        }
84
85        return e;
86}
87
88
89gElement* explore(gElement **elem, htmlNodePtr element, unsigned int level, gElement *parent)
90{
91        unsigned int c = 0;
92        for(htmlNodePtr node = element; node != NULL; node = node->next)
93        {
94                gElement *child = add_element(node);
95                child->level = level;
96
97                if(elem) elem  = realloc(elem, sizeof(gElement*)*(c+1));
98                else elem = malloc(sizeof(gElement*));
99
100
101                elem[c] = child;
102
103                c++;
104
105                if(node->type == XML_ELEMENT_NODE)
106                {
107                        if(node->children != NULL) {
108                                explore(child->children,
109                                                node->children,
110                                                level+1,
111                                                child);
112                        } else {
113                                free(child->children);
114                                child->children = NULL;
115                        }
116                }         
117                if(parent) {
118                        parent->children = realloc(parent->children, sizeof(gElement*)*(parent->children_count+1));
119                        parent->children[parent->children_count] = child;
120                        parent->children_count++;
121                }
122        }
123        return *elem;
124}
125
126
127#define LEVEL {unsigned int foo=0; for(foo=0; foo<elem->level; foo++) printf("    ");}
128
129void pretty_print(gElement *elem) {
130        if(!elem) {
131                printf("elem is %p\n", elem);
132                return;
133        }
134
135        if(elem->type == ELEM_TEXT) {
136                LEVEL printf("%s\n", elem->text);
137        } else {
138                LEVEL printf("<%s", elem->name);
139        int a;
140        for(a = 0; a < elem->attribute_count; a++) {
141                printf(" %s=\"%s\"", elem->attributes[a].name, elem->attributes[a].value); 
142        }
143        printf(">\n");
144        }
145
146        unsigned int i;
147        for(i=0; i < elem->children_count; i++) {
148                pretty_print(elem->children[i]);
149        }
150
151        if(elem->type == ELEM_TEXT) {
152
153        } else {
154                LEVEL printf("</%s>\n", elem->name);
155        }
156}
157
Note: See TracBrowser for help on using the repository browser.