mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
[libdom] Added map (node -> element_offset)
This commit is contained in:
parent
207dc70c87
commit
e2e7b7332e
@ -405,6 +405,13 @@ done_document(struct document *document)
|
|||||||
clear_map(mapa);
|
clear_map(mapa);
|
||||||
delete_map(mapa);
|
delete_map(mapa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (document->element_map_rev) {
|
||||||
|
void *mapa = document->element_map_rev;
|
||||||
|
|
||||||
|
clear_map_rev(mapa);
|
||||||
|
delete_map_rev(mapa);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
free_list(document->tags);
|
free_list(document->tags);
|
||||||
free_list(document->nodes);
|
free_list(document->nodes);
|
||||||
|
@ -234,6 +234,7 @@ struct document {
|
|||||||
#ifdef CONFIG_LIBDOM
|
#ifdef CONFIG_LIBDOM
|
||||||
void *dom;
|
void *dom;
|
||||||
void *element_map;
|
void *element_map;
|
||||||
|
void *element_map_rev;
|
||||||
char *text;
|
char *text;
|
||||||
void *forms_nodeset;
|
void *forms_nodeset;
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,6 +15,13 @@ save_in_map(void *m, void *node, int length)
|
|||||||
(*mapa)[length] = node;
|
(*mapa)[length] = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
save_offset_in_map(void *m, void *node, int offset)
|
||||||
|
{
|
||||||
|
std::map<void *, int> *mapa = static_cast<std::map<void *, int> *>(m);
|
||||||
|
(*mapa)[node] = offset;
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
create_new_element_map(void)
|
create_new_element_map(void)
|
||||||
{
|
{
|
||||||
@ -23,6 +30,14 @@ create_new_element_map(void)
|
|||||||
return (void *)mapa;
|
return (void *)mapa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
create_new_element_map_rev(void)
|
||||||
|
{
|
||||||
|
std::map<void *, int> *mapa = new std::map<void *, int>;
|
||||||
|
|
||||||
|
return (void *)mapa;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
clear_map(void *m)
|
clear_map(void *m)
|
||||||
{
|
{
|
||||||
@ -30,6 +45,13 @@ clear_map(void *m)
|
|||||||
mapa->clear();
|
mapa->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clear_map_rev(void *m)
|
||||||
|
{
|
||||||
|
std::map<void *, int> *mapa = static_cast<std::map<void *, int> *>(m);
|
||||||
|
mapa->clear();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
delete_map(void *m)
|
delete_map(void *m)
|
||||||
{
|
{
|
||||||
@ -37,6 +59,13 @@ delete_map(void *m)
|
|||||||
delete mapa;
|
delete mapa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
delete_map_rev(void *m)
|
||||||
|
{
|
||||||
|
std::map<void *, int> *mapa = static_cast<std::map<void *, int> *>(m);
|
||||||
|
delete mapa;
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
find_in_map(void *m, int offset)
|
find_in_map(void *m, int offset)
|
||||||
{
|
{
|
||||||
@ -52,3 +81,20 @@ find_in_map(void *m, int offset)
|
|||||||
}
|
}
|
||||||
return (void *)element->second;
|
return (void *)element->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
find_offset(void *m, void *node)
|
||||||
|
{
|
||||||
|
std::map<void *, int> *mapa = static_cast<std::map<void *, int> *>(m);
|
||||||
|
|
||||||
|
if (!mapa) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto element = (*mapa).find(node);
|
||||||
|
|
||||||
|
if (element == (*mapa).end()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return (int)element->second;
|
||||||
|
}
|
||||||
|
@ -6,11 +6,16 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void save_in_map(void *m, void *node, int length);
|
void save_in_map(void *m, void *node, int length);
|
||||||
|
void save_offset_in_map(void *m, void *node, int offset);
|
||||||
void *create_new_element_map(void);
|
void *create_new_element_map(void);
|
||||||
|
void *create_new_element_map_rev(void);
|
||||||
void clear_map(void *m);
|
void clear_map(void *m);
|
||||||
void delete_map(void *m);
|
void delete_map(void *m);
|
||||||
|
void clear_map_rev(void *m);
|
||||||
|
void delete_map_rev(void *m);
|
||||||
|
|
||||||
void *find_in_map(void *m, int offset);
|
void *find_in_map(void *m, int offset);
|
||||||
|
int find_offset(void *m, void *node);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ dump_node_element_attribute(struct string *buf, dom_node *node)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
dump_dom_element(void *mapa, struct string *buf, dom_node *node, int depth)
|
dump_dom_element(void *mapa, void *mapa_rev, struct string *buf, dom_node *node, int depth)
|
||||||
{
|
{
|
||||||
dom_exception exc;
|
dom_exception exc;
|
||||||
dom_string *node_name = NULL;
|
dom_string *node_name = NULL;
|
||||||
@ -147,6 +147,7 @@ dump_dom_element(void *mapa, struct string *buf, dom_node *node, int depth)
|
|||||||
|
|
||||||
add_char_to_string(buf, '<');
|
add_char_to_string(buf, '<');
|
||||||
save_in_map(mapa, node, buf->length);
|
save_in_map(mapa, node, buf->length);
|
||||||
|
save_offset_in_map(mapa_rev, node, buf->length);
|
||||||
|
|
||||||
/* Get string data and print element name */
|
/* Get string data and print element name */
|
||||||
add_bytes_to_string(buf, dom_string_data(node_name), dom_string_byte_length(node_name));
|
add_bytes_to_string(buf, dom_string_data(node_name), dom_string_byte_length(node_name));
|
||||||
@ -185,13 +186,13 @@ dump_dom_element(void *mapa, struct string *buf, dom_node *node, int depth)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
walk_tree(void *mapa, struct string *buf, dom_node *node, bool start, int depth)
|
walk_tree(void *mapa, void *mapa_rev, struct string *buf, dom_node *node, bool start, int depth)
|
||||||
{
|
{
|
||||||
dom_exception exc;
|
dom_exception exc;
|
||||||
dom_node *child;
|
dom_node *child;
|
||||||
|
|
||||||
/* Print this node's entry */
|
/* Print this node's entry */
|
||||||
if (dump_dom_element(mapa, buf, node, depth) == false) {
|
if (dump_dom_element(mapa, mapa_rev, buf, node, depth) == false) {
|
||||||
/* There was an error; return */
|
/* There was an error; return */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -210,7 +211,7 @@ walk_tree(void *mapa, struct string *buf, dom_node *node, bool start, int depth)
|
|||||||
dom_node *next_child;
|
dom_node *next_child;
|
||||||
|
|
||||||
/* Visit node's descendents */
|
/* Visit node's descendents */
|
||||||
if (walk_tree(mapa, buf, child, false, depth) == false) {
|
if (walk_tree(mapa, mapa_rev, buf, child, false, depth) == false) {
|
||||||
/* There was an error; return */
|
/* There was an error; return */
|
||||||
dom_node_unref(child);
|
dom_node_unref(child);
|
||||||
return false;
|
return false;
|
||||||
@ -241,6 +242,7 @@ render_xhtml_document(struct cache_entry *cached, struct document *document, str
|
|||||||
dom_document *doc = NULL; /* document, loaded into libdom */
|
dom_document *doc = NULL; /* document, loaded into libdom */
|
||||||
dom_node *root = NULL; /* root element of document */
|
dom_node *root = NULL; /* root element of document */
|
||||||
void *mapa = NULL;
|
void *mapa = NULL;
|
||||||
|
void *mapa_rev = NULL;
|
||||||
static int initialised = 0;
|
static int initialised = 0;
|
||||||
|
|
||||||
if (!initialised) {
|
if (!initialised) {
|
||||||
@ -299,8 +301,16 @@ render_xhtml_document(struct cache_entry *cached, struct document *document, str
|
|||||||
} else {
|
} else {
|
||||||
clear_map(mapa);
|
clear_map(mapa);
|
||||||
}
|
}
|
||||||
|
mapa_rev = document->element_map_rev;
|
||||||
|
|
||||||
if (walk_tree(mapa, &tt, root, true, 0) == false) {
|
if (!mapa_rev) {
|
||||||
|
mapa_rev = create_new_element_map_rev();
|
||||||
|
document->element_map_rev = (void *)mapa_rev;
|
||||||
|
} else {
|
||||||
|
clear_map(mapa_rev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (walk_tree(mapa, mapa_rev, &tt, root, true, 0) == false) {
|
||||||
fprintf(stderr, "Failed to complete DOM structure dump.\n");
|
fprintf(stderr, "Failed to complete DOM structure dump.\n");
|
||||||
dom_node_unref(root);
|
dom_node_unref(root);
|
||||||
//dom_node_unref(doc);
|
//dom_node_unref(doc);
|
||||||
|
Loading…
Reference in New Issue
Block a user