diff --git a/src/ghtml-gtktextview.c b/src/ghtml-gtktextview.c index 425cfba..5525266 100644 --- a/src/ghtml-gtktextview.c +++ b/src/ghtml-gtktextview.c @@ -35,6 +35,12 @@ typedef enum _GHtmlDisplay GHTML_DISPLAY_INLINE } GHtmlDisplay; +typedef struct _GHtmlEntity +{ + char const * name; + char const * string; +} GHtmlEntity; + typedef enum _GHtmlPosition { GHTML_POSITION_BEFORE = 0, @@ -88,6 +94,46 @@ typedef struct _GHtml /* constants */ +/* entities */ +static const GHtmlEntity _ghtml_entities[] = +{ + { "Aacute", "Á" }, + { "Agrave", "À" }, + { "aacute", "á" }, + { "acute", "Ž" }, + { "agrave", "à" }, + { "amp", "&" }, + { "brvbar", "|" }, + { "Ccedil", "Ç" }, + { "ccedil", "ç" }, + { "cent", "¢" }, + { "copy", "©" }, + { "deg", "°" }, + { "Eacute", "É" }, + { "Egrave", "È" }, + { "eacute", "é" }, + { "egrave", "è" }, + { "gt", ">" }, + { "iexcl", "¡" }, + { "lt", "<" }, + { "macr", "¯" }, + { "micro", "µ" }, + { "middot", "·" }, + { "nbsp", " " }, + { "para", "¶" }, + { "plusmn", "±" }, + { "pound", "£" }, + { "quot", "\"" }, + { "reg", "®" }, + { "sect", "§" }, + { "sup2", "²" }, + { "sup3", "³" }, + { "uml", "š" }, + { "yen", "¥" } +}; +#define GHTML_ENTITIES_COUNT (sizeof(_ghtml_entities) \ + / sizeof(*_ghtml_entities)) + /* properties */ static const GHtmlProperty _ghtml_properties_a[] = { @@ -565,6 +611,8 @@ 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_entity(GHtml * ghtml, + XMLNodeEntity * node); static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node); static void _document_load_write_node_tag_link(GHtml * ghtml, XMLNodeTag * node); @@ -653,7 +701,8 @@ static void _document_load_write_node(GHtml * ghtml, XMLNode * node) node->data.buffer, node->data.size, ghtml->tag, NULL); break; - case XML_NODE_TYPE_ENTITY: /* XXX ignore for now */ + case XML_NODE_TYPE_ENTITY: + _document_load_write_node_entity(ghtml, &node->entity); break; case XML_NODE_TYPE_TAG: _document_load_write_node_tag(ghtml, &node->tag); @@ -661,6 +710,28 @@ static void _document_load_write_node(GHtml * ghtml, XMLNode * node) } } +static void _document_load_write_node_entity(GHtml * ghtml, + XMLNodeEntity * node) +{ + size_t i; + char const * string = NULL; + GtkTextIter iter; + + if(ghtml->position != GHTML_POSITION_BODY) + return; + for(i = 0; i < GHTML_ENTITIES_COUNT; i++) + if(strcmp(_ghtml_entities[i].name, node->name) == 0) + { + string = _ghtml_entities[i].string; + break; + } + if(string == NULL) + return; + gtk_text_buffer_get_end_iter(ghtml->tbuffer, &iter); + gtk_text_buffer_insert_with_tags(ghtml->tbuffer, &iter, string, + strlen(string), ghtml->tag, NULL); +} + static void _document_load_write_node_tag(GHtml * ghtml, XMLNodeTag * node) { size_t i;