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

Last change on this file since 4738 was 4738, checked in by Jean-Yves Lamoureux, 9 years ago
  • Fixed attribute_count
  • Added attributes in pretty_print()
File size: 3.4 KB
RevLine 
[4727]1#include <stdio.h>
2#include <string.h>
[4716]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;
[4723]32        e->attribute_count = 0;
[4716]33        e->attributes      = NULL;
[4723]34
[4730]35        if(!node->name) {
36                e->name = strdup("UNKNOW");
37                e->type = ELEM_UNKNOW;
38                return e;       
39        }
40       
[4716]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)) {
[4723]59                e->type = ELEM_IMG;
60        }else if(!strncmp(e->name, "text", 4)) {
[4716]61                e->type = ELEM_TEXT;
62                e->text = (char*)strdup((const char*)xmlNodeGetContent(node));
[4723]63                strip_eol(e->text);
64                strip_spaces(e->text);
[4716]65        }else {
66                e->type = ELEM_UNKNOW;
67                printf("Unknow tag '%s'\n", e->name);   
68        }
[4723]69
70        if(node->properties) {
71                for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
72                        e->attributes = realloc(e->attributes, sizeof(gAttribute));
73                        e->attributes[e->attribute_count].name = strdup(attr->name);
74                        e->attributes[e->attribute_count].value = strdup(attr->children->content);
[4738]75            e->attribute_count++;
[4723]76                }
77        }
78
[4716]79        return e;
80}
81
82
83gElement* explore(gElement **elem, htmlNodePtr element, unsigned int level, gElement *parent)
84{
85        unsigned int c = 0;
86        for(htmlNodePtr node = element; node != NULL; node = node->next)
87        {
88                gElement *child = add_element(node);
89                child->level = level;
[4723]90
[4716]91                if(elem) elem  = realloc(elem, sizeof(gElement*)*(c+1));
92                else elem = malloc(sizeof(gElement*));
93
94
95                elem[c] = child;
96
97                c++;
98
99                if(node->type == XML_ELEMENT_NODE)
100                {
101                        if(node->children != NULL) {
102                                explore(child->children,
[4723]103                                                node->children,
104                                                level+1,
105                                                child);
[4716]106                        } else {
107                                free(child->children);
108                                child->children = NULL;
109                        }
110                }         
111                if(parent) {
112                        parent->children = realloc(parent->children, sizeof(gElement*)*(parent->children_count+1));
113                        parent->children[parent->children_count] = child;
114                        parent->children_count++;
115                }
116        }
117        return *elem;
118}
119
120
121#define LEVEL {unsigned int foo=0; for(foo=0; foo<elem->level; foo++) printf("    ");}
122
123void pretty_print(gElement *elem) {
124        if(!elem) {
125                printf("elem is %p\n", elem);
126                return;
127        }
128
129        if(elem->type == ELEM_TEXT) {
130                LEVEL printf("%s\n", elem->text);
131        } else {
[4738]132                LEVEL printf("<%s", elem->name);
133        int a;
134        for(a = 0; a < elem->attribute_count; a++) {
135                printf(" %s=\"%s\"", elem->attributes[a].name, elem->attributes[a].value); 
136        }
137        printf(">\n");
[4716]138        }
[4723]139
[4716]140        unsigned int i;
141        for(i=0; i < elem->children_count; i++) {
142                pretty_print(elem->children[i]);
143        }
144
145        if(elem->type == ELEM_TEXT) {
146
147        } else {
148                LEVEL printf("</%s>\n", elem->name);
149        }
150}
151
Note: See TracBrowser for help on using the repository browser.