Rendering some tags with a bold font

This commit is contained in:
Pierre Pronchery 2010-08-25 20:25:26 +00:00
parent 1636611012
commit bcc929f450

View File

@ -49,6 +49,7 @@ typedef struct _GHtml
/* html widget */ /* html widget */
GtkWidget * view; GtkWidget * view;
GtkTextBuffer * tbuffer; GtkTextBuffer * tbuffer;
GtkTextTag * tag;
} GHtml; } GHtml;
@ -81,6 +82,7 @@ GtkWidget * ghtml_new(Surfer * surfer)
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
ghtml->view = gtk_text_view_new(); ghtml->view = gtk_text_view_new();
ghtml->tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ghtml->view)); 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), gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(ghtml->view),
FALSE); FALSE);
gtk_text_view_set_editable(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); gpointer data);
static gboolean _document_load_idle(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(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, static int _ghtml_document_load(GHtml * ghtml, char const * url,
char const * post) char const * post)
@ -407,13 +410,16 @@ static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size,
gpointer data) gpointer data)
{ {
GHtml * ghtml = data; GHtml * ghtml = data;
XMLPrefs prefs;
XML * xml; XML * xml;
XMLDocument * doc; XMLDocument * doc;
char * p; char * p;
memset(&prefs, 0, sizeof(prefs));
prefs.filters |= XML_FILTER_WHITESPACE;
if(size == 0) if(size == 0)
{ {
if((xml = xml_new_string(NULL, ghtml->buffer, if((xml = xml_new_string(&prefs, ghtml->buffer,
ghtml->buffer_cnt)) == NULL) ghtml->buffer_cnt)) == NULL)
return 0; return 0;
if((doc = xml_get_document(xml)) != NULL) 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) static void _document_load_write_node(GHtml * ghtml, XMLNode * node)
{ {
size_t i;
GtkTextIter iter; GtkTextIter iter;
if(node == NULL) if(node == NULL)
@ -440,17 +445,55 @@ static void _document_load_write_node(GHtml * ghtml, XMLNode * node)
case XML_NODE_TYPE_DATA: case XML_NODE_TYPE_DATA:
/* FIXME looks like memory corruption at some point */ /* FIXME looks like memory corruption at some point */
gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter); gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter);
gtk_text_buffer_insert(ghtml->tbuffer, &iter, gtk_text_buffer_insert_with_tags(ghtml->tbuffer, &iter,
node->data.buffer, node->data.size); node->data.buffer, node->data.size,
ghtml->tag, NULL);
break; break;
case XML_NODE_TYPE_TAG: case XML_NODE_TYPE_TAG:
for(i = 0; i < node->tag.childs_cnt; i++) _document_load_write_node_tag(ghtml, &node->tag);
_document_load_write_node(ghtml,
node->tag.childs[i]);
break; 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) static gboolean _document_load_idle(gpointer data)
{ {
GHtml * ghtml = data; GHtml * ghtml = data;