diff --git a/src/ghtml-gtktextview.c b/src/ghtml-gtktextview.c
index 37888ee..40c2c60 100644
--- a/src/ghtml-gtktextview.c
+++ b/src/ghtml-gtktextview.c
@@ -35,6 +35,15 @@ typedef enum _GHtmlDisplay
GHTML_DISPLAY_INLINE
} GHtmlDisplay;
+typedef enum _GHtmlPosition
+{
+ GHTML_POSITION_BEFORE = 0,
+ GHTML_POSITION_HEAD,
+ GHTML_POSITION_HEAD_TITLE,
+ GHTML_POSITION_BODY,
+ GHTML_POSITION_AFTER
+} GHtmlPosition;
+
typedef struct _GHtmlProperty
{
char const * name;
@@ -72,6 +81,9 @@ typedef struct _GHtml
GtkTextBuffer * tbuffer;
GHtmlTag tags[GHTML_TAGS_COUNT];
GtkTextTag * tag;
+
+ /* parsing */
+ GHtmlPosition position;
} GHtml;
@@ -241,9 +253,10 @@ void ghtml_delete(GtkWidget * widget)
GHtml * ghtml;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
- free(ghtml->buffer);
if(ghtml->conn != NULL)
_conn_delete(ghtml->conn);
+ free(ghtml->title);
+ free(ghtml->buffer);
free(ghtml);
}
@@ -559,6 +572,8 @@ static int _ghtml_document_load(GHtml * ghtml, char const * url,
ghtml->buffer_cnt = 0;
ghtml->search = 0;
surfer_set_location(ghtml->surfer, url);
+ free(ghtml->title);
+ ghtml->title = NULL;
surfer_set_title(ghtml->surfer, NULL);
if((ghtml->conn = _conn_new(ghtml->surfer, url, post)) == NULL)
return 1;
@@ -583,6 +598,7 @@ static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size,
if((xml = xml_new_string(&prefs, ghtml->buffer,
ghtml->buffer_cnt)) == NULL)
return 0;
+ ghtml->position = GHTML_POSITION_BEFORE;
if((doc = xml_get_document(xml)) != NULL)
_document_load_write_node(ghtml, doc->root);
xml_delete(xml);
@@ -604,6 +620,15 @@ static void _document_load_write_node(GHtml * ghtml, XMLNode * node)
switch(node->type)
{
case XML_NODE_TYPE_DATA:
+ if(ghtml->position == GHTML_POSITION_HEAD_TITLE)
+ {
+ free(ghtml->title);
+ ghtml->title = strdup(node->data.buffer);
+ surfer_set_title(ghtml->surfer, ghtml->title);
+ break;
+ }
+ else if(ghtml->position != GHTML_POSITION_BODY)
+ break;
/* FIXME looks like memory corruption at some point */
gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter);
gtk_text_buffer_insert_with_tags(ghtml->tbuffer, &iter,
@@ -645,6 +670,15 @@ static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node)
p[i].value, NULL);
}
}
+ if(strcmp(node->name, "head") == 0)
+ ghtml->position = GHTML_POSITION_HEAD;
+ else if(strcmp(node->name, "body") == 0)
+ ghtml->position = GHTML_POSITION_BODY;
+ else if(strcmp(node->name, "title") == 0)
+ {
+ if(ghtml->position == GHTML_POSITION_HEAD)
+ ghtml->position = GHTML_POSITION_HEAD_TITLE;
+ }
if(display == GHTML_DISPLAY_BLOCK)
{
gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter);
@@ -657,6 +691,15 @@ static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node)
else
for(i = 0; i < node->childs_cnt; i++)
_document_load_write_node(ghtml, node->childs[i]);
+ if(strcmp(node->name, "head") == 0)
+ ghtml->position = GHTML_POSITION_BEFORE;
+ else if(strcmp(node->name, "body") == 0)
+ ghtml->position = GHTML_POSITION_AFTER;
+ else if(strcmp(node->name, "title") == 0)
+ {
+ if(ghtml->position == GHTML_POSITION_HEAD_TITLE)
+ ghtml->position = GHTML_POSITION_HEAD;
+ }
}
static void _document_load_write_node_tag_link(GHtml * ghtml, XMLNodeTag * node)