mirror of
https://github.com/rkd77/elinks.git
synced 2024-10-03 03:56:32 -04:00
Turn the DOM tree renderer into a debug module
Define DOM_TREE_RENDERER and run as: ELINKS_LOG=/tmp/dom-dump.txt ./elinks -no-connect <url> to have a trace of DOM tree dumped into a file.
This commit is contained in:
parent
fe6637dd7d
commit
d6c5640f29
@ -286,35 +286,6 @@ render_dom_text(struct dom_renderer *renderer, struct screen_char *template,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*#define DOM_TREE_RENDERER*/
|
|
||||||
|
|
||||||
#ifdef DOM_TREE_RENDERER
|
|
||||||
static void
|
|
||||||
render_dom_printf(struct dom_renderer *renderer, struct screen_char *template,
|
|
||||||
unsigned char *format, ...)
|
|
||||||
{
|
|
||||||
unsigned char *text;
|
|
||||||
int textlen;
|
|
||||||
va_list ap, ap2;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
VA_COPY(ap2, ap);
|
|
||||||
|
|
||||||
textlen = vsnprintf(NULL, 0, format, ap2);
|
|
||||||
|
|
||||||
text = mem_alloc(textlen + 1);
|
|
||||||
if (!text) goto free_va_args;
|
|
||||||
|
|
||||||
if (vsnprintf((char *) text, textlen + 1, format, ap) == textlen)
|
|
||||||
render_dom_text(renderer, template, text, textlen);
|
|
||||||
|
|
||||||
mem_free(text);
|
|
||||||
|
|
||||||
free_va_args:
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
#endif /* DOM_TREE_RENDERER */
|
|
||||||
|
|
||||||
#define realloc_document_links(doc, size) \
|
#define realloc_document_links(doc, size) \
|
||||||
ALIGN_LINK(&(doc)->links, (doc)->nlinks, size)
|
ALIGN_LINK(&(doc)->links, (doc)->nlinks, size)
|
||||||
|
|
||||||
@ -384,7 +355,12 @@ add_dom_link(struct dom_renderer *renderer, unsigned char *string, int length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* DOM Tree Renderer */
|
/* DOM Tree Debug Renderer */
|
||||||
|
|
||||||
|
/* Define to have debug info about the nodes added printed to the log.
|
||||||
|
* Run as: ELINKS_LOG=/tmp/dom-dump.txt ./elinks -no-connect <url>
|
||||||
|
* to have the debug dumped into a file. */
|
||||||
|
/*#define DOM_TREE_RENDERER*/
|
||||||
|
|
||||||
#ifdef DOM_TREE_RENDERER
|
#ifdef DOM_TREE_RENDERER
|
||||||
static inline unsigned char *
|
static inline unsigned char *
|
||||||
@ -419,11 +395,14 @@ set_enhanced_dom_node_value(struct dom_string *string, struct dom_node *node,
|
|||||||
|
|
||||||
assert(node);
|
assert(node);
|
||||||
|
|
||||||
|
memset(string, 0, sizeof(*string));
|
||||||
|
|
||||||
switch (node->type) {
|
switch (node->type) {
|
||||||
case DOM_NODE_ENTITY_REFERENCE:
|
case DOM_NODE_ENTITY_REFERENCE:
|
||||||
string->string = get_entity_string(node->string.string,
|
string->string = get_entity_string(node->string.string,
|
||||||
node->string.length,
|
node->string.length,
|
||||||
codepage);
|
codepage);
|
||||||
|
string->string = null_or_stracpy(string->string);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -439,19 +418,21 @@ set_enhanced_dom_node_value(struct dom_string *string, struct dom_node *node,
|
|||||||
string->length = string->string ? strlen(string->string) : 0;
|
string->length = string->string ? strlen(string->string) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned char indent_string[MAX_STR_LEN];
|
||||||
|
|
||||||
|
#define get_indent_offset(stack) \
|
||||||
|
((stack)->depth < sizeof(indent_string)/2 ? (stack)->depth * 2 : sizeof(indent_string))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
render_dom_tree(struct dom_stack *stack, struct dom_node *node, void *data)
|
render_dom_tree(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||||
{
|
{
|
||||||
struct dom_renderer *renderer = stack->current->data;
|
|
||||||
struct screen_char *template = &renderer->styles[node->type];
|
|
||||||
struct dom_string *value = &node->string;
|
struct dom_string *value = &node->string;
|
||||||
struct dom_string *name = get_dom_node_name(node);
|
struct dom_string *name = get_dom_node_name(node);
|
||||||
|
|
||||||
render_dom_printf(renderer, template, "%.*s: %.*s\n",
|
LOG_INFO("%.*s %.*s: %.*s",
|
||||||
|
get_indent_offset(stack), indent_string,
|
||||||
name->length, name->string,
|
name->length, name->string,
|
||||||
value->length, value->string);
|
value->length, value->string);
|
||||||
|
|
||||||
mem_free_if(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -459,7 +440,6 @@ render_dom_tree_id_leaf(struct dom_stack *stack, struct dom_node *node, void *da
|
|||||||
{
|
{
|
||||||
struct dom_renderer *renderer = stack->current->data;
|
struct dom_renderer *renderer = stack->current->data;
|
||||||
struct document *document = renderer->document;
|
struct document *document = renderer->document;
|
||||||
struct screen_char *template = &renderer->styles[node->type];
|
|
||||||
struct dom_string value;
|
struct dom_string value;
|
||||||
struct dom_string *name;
|
struct dom_string *name;
|
||||||
struct dom_string *id;
|
struct dom_string *id;
|
||||||
@ -470,8 +450,8 @@ render_dom_tree_id_leaf(struct dom_stack *stack, struct dom_node *node, void *da
|
|||||||
id = get_dom_node_type_name(node->type);
|
id = get_dom_node_type_name(node->type);
|
||||||
set_enhanced_dom_node_value(&value, node, document->options.cp);
|
set_enhanced_dom_node_value(&value, node, document->options.cp);
|
||||||
|
|
||||||
renderer->canvas_x += stack->depth;
|
LOG_INFO("%.*s %.*s: %.*s -> %.*s",
|
||||||
render_dom_printf(renderer, template, "%.*s: %.*s -> %.*s\n",
|
get_indent_offset(stack), indent_string,
|
||||||
id->length, id->string, name->length, name->string,
|
id->length, id->string, name->length, name->string,
|
||||||
value.length, value.string);
|
value.length, value.string);
|
||||||
|
|
||||||
@ -484,7 +464,6 @@ render_dom_tree_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
|||||||
{
|
{
|
||||||
struct dom_renderer *renderer = stack->current->data;
|
struct dom_renderer *renderer = stack->current->data;
|
||||||
struct document *document = renderer->document;
|
struct document *document = renderer->document;
|
||||||
struct screen_char *template = &renderer->styles[node->type];
|
|
||||||
struct dom_string *name;
|
struct dom_string *name;
|
||||||
struct dom_string value;
|
struct dom_string value;
|
||||||
|
|
||||||
@ -493,8 +472,8 @@ render_dom_tree_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
|||||||
name = get_dom_node_name(node);
|
name = get_dom_node_name(node);
|
||||||
set_enhanced_dom_node_value(&value, node, document->options.cp);
|
set_enhanced_dom_node_value(&value, node, document->options.cp);
|
||||||
|
|
||||||
renderer->canvas_x += stack->depth;
|
LOG_INFO("%.*s %.*s: %.*s",
|
||||||
render_dom_printf(renderer, template, "%.*s: %.*s\n",
|
get_indent_offset(stack), indent_string,
|
||||||
name->length, name->string,
|
name->length, name->string,
|
||||||
value.length, value.string);
|
value.length, value.string);
|
||||||
|
|
||||||
@ -505,22 +484,17 @@ render_dom_tree_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
|||||||
static void
|
static void
|
||||||
render_dom_tree_branch(struct dom_stack *stack, struct dom_node *node, void *data)
|
render_dom_tree_branch(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||||
{
|
{
|
||||||
struct dom_renderer *renderer = stack->current->data;
|
|
||||||
struct document *document = renderer->document;
|
|
||||||
struct screen_char *template = &renderer->styles[node->type];
|
|
||||||
struct dom_string *name;
|
struct dom_string *name;
|
||||||
struct dom_string *id;
|
struct dom_string *id;
|
||||||
|
|
||||||
assert(node && document);
|
assert(node);
|
||||||
|
|
||||||
name = get_dom_node_name(node);
|
name = get_dom_node_name(node);
|
||||||
id = get_dom_node_type_name(node->type);
|
id = get_dom_node_type_name(node->type);
|
||||||
|
|
||||||
renderer->canvas_x += stack->depth;
|
LOG_INFO("%.*s %.*s: %.*s",
|
||||||
render_dom_printf(renderer, template, "%.*s: %.*s\n",
|
get_indent_offset(stack), indent_string,
|
||||||
id->length, id->string, name->length, name->string);
|
id->length, id->string, name->length, name->string);
|
||||||
|
|
||||||
mem_free_if(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dom_stack_context_info dom_tree_renderer_context_info = {
|
static struct dom_stack_context_info dom_tree_renderer_context_info = {
|
||||||
@ -816,6 +790,12 @@ render_dom_document(struct cache_entry *cached, struct document *document,
|
|||||||
add_dom_stack_context(&parser->stack, &renderer,
|
add_dom_stack_context(&parser->stack, &renderer,
|
||||||
&dom_source_renderer_context_info);
|
&dom_source_renderer_context_info);
|
||||||
|
|
||||||
|
#ifdef DOM_TREE_RENDERER
|
||||||
|
memset(indent_string, ' ', sizeof(indent_string));
|
||||||
|
add_dom_stack_context(&parser->stack, &renderer,
|
||||||
|
&dom_tree_renderer_context_info);
|
||||||
|
#endif
|
||||||
|
|
||||||
root = parse_sgml(parser, buffer);
|
root = parse_sgml(parser, buffer);
|
||||||
done_sgml_parser(parser);
|
done_sgml_parser(parser);
|
||||||
if (!root) return;
|
if (!root) return;
|
||||||
|
Loading…
Reference in New Issue
Block a user