From: ellson Date: Tue, 18 Oct 2005 21:10:13 +0000 (+0000) Subject: Fix svg renderer to handle Latin1 input and output UTF-8. X-Git-Tag: LAST_LIBGRAPH~32^2~7074 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7897fce969bc83de47075c48019e90fedef1cbc9;p=graphviz Fix svg renderer to handle Latin1 input and output UTF-8. This is basically a problem of translating node and graph names, though we also translate user shapes names. --- diff --git a/lib/common/svggen.c b/lib/common/svggen.c index 958cd6915..3021c4b19 100644 --- a/lib/common/svggen.c +++ b/lib/common/svggen.c @@ -110,6 +110,7 @@ static char *sdotarray = "1,5"; static int N_pages; /* static point Pages; */ static int onetime = TRUE; +static int isLatin1; static int Rot; static double Scale; @@ -358,10 +359,44 @@ static void svg_grstyle(context_t * cp, int filled) svg_fputs("\""); } +/* xml_namestring: + * Return xml_string applied to input. + * If input is Latin1, first translate to UTF8 + */ +static char* +xml_namestring (char* str) +{ + if (isLatin1) { + char* s = latin1ToUTF8 (str); + str = xml_string(s); + free (s); + } + else + str = xml_string(str); + return str; +} + +/* svg_name_fputs: + * Do fputs on input. + * If input is Latin1, first translate to UTF8. + */ +static void +svg_name_fputs (char* str) +{ + if (isLatin1) { + char* s = latin1ToUTF8 (str); + svg_fputs(s); + free (s); + } + else + svg_fputs(str); +} + static void svg_comment(char *str) { + svg_fputs("\n"); } @@ -444,8 +479,9 @@ static void svg_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) init_svg(); onetime = FALSE; } + isLatin1 = (GD_charset(g) == CHAR_LATIN1); svg_fputs("\n", N_pages); if (dpi == POINTS_PER_INCH) svg_printf("\n", cstk[0].fontsz); svg_fputs(""); - svg_fputs(xml_string(g->name)); + svg_fputs(xml_namestring(g->name)); svg_fputs("\n"); } @@ -526,7 +562,7 @@ static void svg_begin_cluster(graph_t * g) svg_printf("", op[Obj], g->meta_node->id); svg_fputs(""); - svg_fputs(xml_string(g->name)); + svg_fputs(xml_namestring(g->name)); svg_fputs("\n"); } @@ -540,7 +576,7 @@ static void svg_begin_node(node_t * n) Curnode = n; svg_printf("", op[Obj], n->id); svg_fputs(""); - svg_fputs(xml_string(n->name)); + svg_fputs(xml_namestring(n->name)); svg_fputs("\n"); } @@ -559,11 +595,11 @@ static void svg_begin_edge(edge_t * e) else edgeop = "--"; svg_fputs(""); - svg_fputs(xml_string(e->tail->name)); + svg_fputs(xml_namestring(e->tail->name)); svg_fputs(edgeop); /* can't do this in single svg_printf because * xml_string's buffer gets reused. */ - svg_fputs(xml_string(e->head->name)); + svg_fputs(xml_namestring(e->head->name)); svg_fputs("\n"); } @@ -864,8 +900,8 @@ static void svg_user_shape(char *name, point * A, int n, int filled) */ svg_fputs("name); + svg_name_fputs(name); + svg_name_fputs(Curnode->name); svg_fputs("\">\n\n\nname); + svg_name_fputs(name); + svg_name_fputs(Curnode->name); svg_fputs(")\"/>\n"); }