diff --git a/src/ghtml-gtktextview.c b/src/ghtml-gtktextview.c index 55bf438..af6e64b 100644 --- a/src/ghtml-gtktextview.c +++ b/src/ghtml-gtktextview.c @@ -49,6 +49,7 @@ typedef struct _GHtml /* html widget */ GtkWidget * view; GtkTextBuffer * tbuffer; + GtkTextTag * tag; } GHtml; @@ -81,6 +82,7 @@ GtkWidget * ghtml_new(Surfer * surfer) GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); ghtml->view = gtk_text_view_new(); ghtml->tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ghtml->view)); + ghtml->tag = NULL; gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(ghtml->view), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(ghtml->view), FALSE); @@ -378,6 +380,7 @@ static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size, gpointer data); static gboolean _document_load_idle(gpointer data); static void _document_load_write_node(GHtml * ghtml, XMLNode * node); +static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node); static int _ghtml_document_load(GHtml * ghtml, char const * url, char const * post) @@ -407,13 +410,16 @@ static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size, gpointer data) { GHtml * ghtml = data; + XMLPrefs prefs; XML * xml; XMLDocument * doc; char * p; + memset(&prefs, 0, sizeof(prefs)); + prefs.filters |= XML_FILTER_WHITESPACE; if(size == 0) { - if((xml = xml_new_string(NULL, ghtml->buffer, + if((xml = xml_new_string(&prefs, ghtml->buffer, ghtml->buffer_cnt)) == NULL) return 0; if((doc = xml_get_document(xml)) != NULL) @@ -430,7 +436,6 @@ static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size, static void _document_load_write_node(GHtml * ghtml, XMLNode * node) { - size_t i; GtkTextIter iter; if(node == NULL) @@ -440,17 +445,55 @@ static void _document_load_write_node(GHtml * ghtml, XMLNode * node) case XML_NODE_TYPE_DATA: /* FIXME looks like memory corruption at some point */ gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter); - gtk_text_buffer_insert(ghtml->tbuffer, &iter, - node->data.buffer, node->data.size); + gtk_text_buffer_insert_with_tags(ghtml->tbuffer, &iter, + node->data.buffer, node->data.size, + ghtml->tag, NULL); break; case XML_NODE_TYPE_TAG: - for(i = 0; i < node->tag.childs_cnt; i++) - _document_load_write_node(ghtml, - node->tag.childs[i]); + _document_load_write_node_tag(ghtml, &node->tag); break; } } +static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node) +{ + GtkTextIter iter; + int block = 0; + size_t i; + + ghtml->tag = gtk_text_buffer_create_tag(ghtml->tbuffer, NULL, NULL); + if(strcmp(node->name, "b") == 0 + || strcmp(node->name, "em") == 0 + || strcmp(node->name, "h1") == 0 + || strcmp(node->name, "h2") == 0 + || strcmp(node->name, "h3") == 0 + || strcmp(node->name, "h4") == 0 + || strcmp(node->name, "h5") == 0 + || strcmp(node->name, "h6") == 0 + || strcmp(node->name, "strong") == 0) + g_object_set(G_OBJECT(ghtml->tag), "weight", PANGO_WEIGHT_BOLD, + "weight-set", 1, NULL); + if(strcmp(node->name, "br") == 0 + || strcmp(node->name, "div") == 0 + || strcmp(node->name, "form") == 0 + || strcmp(node->name, "h1") == 0 + || strcmp(node->name, "h2") == 0 + || strcmp(node->name, "h3") == 0 + || strcmp(node->name, "h4") == 0 + || strcmp(node->name, "h5") == 0 + || strcmp(node->name, "h6") == 0 + || strcmp(node->name, "hr") == 0 + || strcmp(node->name, "p") == 0) + block = 1; + if(block != 0) + { + gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter); + gtk_text_buffer_insert(ghtml->tbuffer, &iter, "\n", 1); + } + for(i = 0; i < node->childs_cnt; i++) + _document_load_write_node(ghtml, node->childs[i]); +} + static gboolean _document_load_idle(gpointer data) { GHtml * ghtml = data;