]> granicus.if.org Git - graphviz/commitdiff
provide id="xxx" in anchors
authorellson <devnull@localhost>
Thu, 18 Sep 2008 18:37:47 +0000 (18:37 +0000)
committerellson <devnull@localhost>
Thu, 18 Sep 2008 18:37:47 +0000 (18:37 +0000)
17 files changed:
lib/common/emit.c
lib/common/htmltable.c
lib/common/input.c
lib/common/render.h
lib/common/shapes.c
lib/gvc/gvc.c
lib/gvc/gvc.h
lib/gvc/gvcjob.h
lib/gvc/gvcproc.h
lib/gvc/gvplugin_render.h
lib/gvc/gvrender.c
plugin/core/gvrender_core_map.c
plugin/core/gvrender_core_ps.c
plugin/core/gvrender_core_svg.c
plugin/core/gvrender_core_vml.c
plugin/lasi/gvrender_lasi.cpp
plugin/quartz/gvrender_quartz.c

index 7b876b9f71f321d2998b3e6536a69ca438ab5e5e..c293e0afbe4b6a5e8922b4534fa49131cb8b148a 100644 (file)
@@ -68,6 +68,7 @@ void pop_obj_state(GVJ_t *job)
 
     assert(obj);
 
+    free(obj->id);
     free(obj->url);
     free(obj->labelurl);
     free(obj->tailurl);
@@ -94,7 +95,7 @@ void pop_obj_state(GVJ_t *job)
  * Return 1 if an assignment was made for url or tooltip or target.
  */
 int
-initMapData (GVJ_t* job, char* lbl, char* url, char* tooltip, char* target,
+initMapData (GVJ_t* job, char* lbl, char* url, char* tooltip, char* target, char *id,
   void* gobj)
 {
     obj_state_t *obj = job->obj;
@@ -103,9 +104,12 @@ initMapData (GVJ_t* job, char* lbl, char* url, char* tooltip, char* target,
 
     if ((flags & GVRENDER_DOES_LABELS) && lbl)
         obj->label = lbl;
-    if ((flags & GVRENDER_DOES_MAPS) && url && url[0]) {
-        obj->url = strdup_and_subst_obj(url, gobj);
-       assigned = 1;
+    if (flags & GVRENDER_DOES_MAPS) {
+        obj->id = strdup_and_subst_obj(id, gobj);
+       if (url && url[0]) {
+            obj->url = strdup_and_subst_obj(url, gobj);
+           assigned = 1;
+        }
     }
     if (flags & GVRENDER_DOES_TOOLTIPS) {
         if (tooltip && tooltip[0]) {
@@ -126,7 +130,21 @@ initMapData (GVJ_t* job, char* lbl, char* url, char* tooltip, char* target,
 }
 
 static void
-initObjMapData (GVJ_t* job, textlabel_t *lab, void* gobj)
+initGraphMapData (GVJ_t* job, textlabel_t *lab, void* gobj)
+{
+    char* lbl;
+    char* url = agget(gobj, "href");
+    char* tooltip = agget(gobj, "tooltip");
+    char* target = agget(gobj, "target");
+
+    if (lab) lbl = lab->text;
+    else lbl = NULL;
+    if (!url || !*url) url = agget(gobj, "URL");
+    initMapData (job, lbl, url, tooltip, target, "\\G", gobj);
+}
+
+static void
+initNodeMapData (GVJ_t* job, textlabel_t *lab, void* gobj)
 {
     char* lbl;
     char* url = agget(gobj, "href");
@@ -136,7 +154,7 @@ initObjMapData (GVJ_t* job, textlabel_t *lab, void* gobj)
     if (lab) lbl = lab->text;
     else lbl = NULL;
     if (!url || !*url) url = agget(gobj, "URL");
-    initMapData (job, lbl, url, tooltip, target, gobj);
+    initMapData (job, lbl, url, tooltip, target, "\\N", gobj);
 }
 
 static void map_point(GVJ_t *job, pointf pf)
@@ -1051,7 +1069,7 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
        else
             obj->z = 0.0;
     }
-    initObjMapData (job, ND_label(n), n);
+    initNodeMapData (job, ND_label(n), n);
     if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS))
            && (obj->url || obj->explicit_tooltip)) {
 
@@ -1548,6 +1566,7 @@ static void emit_begin_edge(GVJ_t * job, edge_t * e, char** styles)
     }
 
     if (flags & GVRENDER_DOES_MAPS) {
+       obj->id = strdup_and_subst_obj("\\E", (void*)e);
         if (((s = agget(e, "href")) && s[0]) || ((s = agget(e, "URL")) && s[0]))
             dflt_url = strdup_and_subst_obj(s, (void*)e);
        if (((s = agget(e, "edgehref")) && s[0]) || ((s = agget(e, "edgeURL")) && s[0]))
@@ -1663,25 +1682,26 @@ static void emit_begin_edge(GVJ_t * job, edge_t * e, char** styles)
     gvrender_begin_context(job);
     gvrender_begin_edge(job, e);
     if (obj->url || obj->explicit_tooltip)
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
 }
 
 static void
 emit_edge_label(GVJ_t* job, textlabel_t* lbl, int lkind, int explicit,
-    char* url, char* tooltip, char* target, splines* spl)
+    char* url, char* tooltip, char* target, char *id, splines* spl)
 {
     int flags = job->flags;
     if (lbl == NULL) return;
     if ((url || explicit) && !(flags & EMIT_CLUSTERS_LAST)) {
        map_label(job, lbl);
-       gvrender_begin_anchor(job, url, tooltip, target);
+       gvrender_begin_anchor(job, url, tooltip, target, id);
     }
     emit_label(job, lkind, lbl);
     if (spl) emit_attachment(job, lbl, spl);
     if (url || explicit) {
        if (flags & EMIT_CLUSTERS_LAST) {
            map_label(job, lbl);
-           gvrender_begin_anchor(job, url, tooltip, target);
+           gvrender_begin_anchor(job, url, tooltip, target, id);
        }
        gvrender_end_anchor(job);
     }
@@ -1733,7 +1753,7 @@ static void nodeIntersect (GVJ_t * job, pointf p,
 
     if (url || explicit) {
        map_point(job, p);
-       gvrender_begin_anchor(job, url, tooltip, target);
+       gvrender_begin_anchor(job, url, tooltip, target, obj->id);
        gvrender_end_anchor(job);
     }
 }
@@ -1751,7 +1771,8 @@ static void emit_end_edge(GVJ_t * job)
                /* additional polygon maps around remaining bezier pieces */
                obj->url_map_n = obj->url_bsplinemap_n[i];
                obj->url_map_p = &(obj->url_bsplinemap_p[nump]);
-               gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+               gvrender_begin_anchor(job,
+                       obj->url, obj->tooltip, obj->target, obj->id);
                gvrender_end_anchor(job);
                nump += obj->url_bsplinemap_n[i];
            }
@@ -1785,13 +1806,18 @@ static void emit_end_edge(GVJ_t * job)
            obj->explicit_headtarget, obj->headtarget); 
     }
 
-    emit_edge_label(job, ED_label(e), EMIT_ELABEL, obj->explicit_labeltooltip, 
-       obj->labelurl, obj->labeltooltip, obj->labeltarget, 
+    emit_edge_label(job, ED_label(e), EMIT_ELABEL,
+       obj->explicit_labeltooltip, 
+       obj->labelurl, obj->labeltooltip, obj->labeltarget, obj->id, 
        ((mapbool(late_string(e, E_decorate, "false")) && ED_spl(e)) ? ED_spl(e) : 0));
     emit_edge_label(job, ED_head_label(e), EMIT_HLABEL, 
-       obj->explicit_headtooltip, obj->headurl, obj->headtooltip, obj->headtarget, 0);
+       obj->explicit_headtooltip,
+       obj->headurl, obj->headtooltip, obj->headtarget, obj->id,
+       0);
     emit_edge_label(job, ED_tail_label(e), EMIT_TLABEL, 
-       obj->explicit_tailtooltip, obj->tailurl, obj->tailtooltip, obj->tailtarget, 0);
+       obj->explicit_tailtooltip,
+       obj->tailurl, obj->tailtooltip, obj->tailtarget, obj->id,
+       0);
 
     gvrender_end_edge(job);
     gvrender_end_context(job);
@@ -2185,7 +2211,7 @@ static void emit_begin_graph(GVJ_t * job, graph_t * g)
     obj->u.g = g;
     obj->emit_state = EMIT_GDRAW;
 
-    initObjMapData (job, GD_label(g), g);
+    initGraphMapData (job, GD_label(g), g);
 
 #ifdef WITH_CODEGENS
     Obj = NONE;
@@ -2247,7 +2273,7 @@ static void emit_page(GVJ_t * job, graph_t * g)
         */
     if (!(flags & EMIT_CLUSTERS_LAST) && (obj->url || obj->explicit_tooltip)) {
        emit_map_rect(job, job->clip);
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target, obj->id);
     }
     if (job->numLayers == 1)
        emit_background(job, g);
@@ -2391,7 +2417,7 @@ static void emit_begin_cluster(GVJ_t * job, Agraph_t * sg)
     obj->u.sg = sg;
     obj->emit_state = EMIT_CDRAW;
 
-    initObjMapData (job, GD_label(sg), sg);
+    initGraphMapData (job, GD_label(sg), sg);
 
 #ifdef WITH_CODEGENS
     Obj = CLST;
@@ -2435,7 +2461,7 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
        gvrender_begin_context(job);
        if (doAnchor && !(flags & EMIT_CLUSTERS_LAST)) {
            emit_map_rect(job, GD_bb(sg));
-           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target, obj->id);
        }
        filled = FALSE;
        istyle = 0;
@@ -2514,7 +2540,7 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
        if (doAnchor) {
            if (flags & EMIT_CLUSTERS_LAST) {
                emit_map_rect(job, GD_bb(sg));
-               gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+               gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target, obj->id);
            }
            gvrender_end_anchor(job);
        }
index deabf4bbe520504377ce26d8bfbb7b792b7533bd..2e6b8d523170b1039746284fa007abbdd3af5dd3 100644 (file)
@@ -296,14 +296,15 @@ initAnchor (GVJ_t* job, htmldata_t* data, boxf b, htmlmap_data_t* save,
     save->tooltip = obj->tooltip;
     save->target = obj->target;
     save->explicit_tooltip = obj->explicit_tooltip;
-    changed = initMapData (job, NULL, data->href, data->title, data->target, obj->u.g);
+    changed = initMapData (job, NULL, data->href, data->title, data->target, "\\N", obj->u.g);
 
     if (changed) {
        if (closePrev && (save->url || save->explicit_tooltip))
            gvrender_end_anchor(job);
        if (obj->url || obj->explicit_tooltip) {
            emit_map_rect(job, b);
-           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+           gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
        }
     }
     return changed;
@@ -335,7 +336,8 @@ endAnchor (GVJ_t* job, htmlmap_data_t* save, int openPrev)
     RESET(target);
     obj->explicit_tooltip = save->explicit_tooltip;
     if (openPrev && (obj->url || obj->explicit_tooltip))
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
 }
 
 /* forward declaration */
index a72a8c6a7d104a51e2984ea66adcbae6018856b2..8918bcaaeaf29b19468fe8745d0ff550bf117fb6 100644 (file)
@@ -165,8 +165,6 @@ static void use_library(GVC_t *gvc, const char *name)
     gvc->common.lib = Lib;
 }
 
-extern char *gvplugin_list(GVC_t * gvc, api_t api, const char *str);
-
 void global_def(const char *dcl,
                attrsym_t * ((*dclfun) (Agraph_t *, char *, char *)))
 {
index b1c682cbaa1f05f49e92a559e7d45cb8bd36d78f..39b027c6cb2f606af5ba2f0cb0ceae50e2ae1d7e 100644 (file)
@@ -116,7 +116,7 @@ extern "C" {
     extern void gv_cleanup_edge(Agedge_t * e);
     extern void gv_nodesize(Agnode_t * n, boolean flip);
     extern void gv_cleanup_node(Agnode_t * n);
-    extern int initMapData (GVJ_t*, char*, char*, char*, char*, void*);
+    extern int initMapData (GVJ_t*, char*, char*, char*, char*, char*, void*);
     extern boolean isPolygon(node_t *);
     extern char *strdup_and_subst_obj(char *str, void *obj);
     extern char *xml_string(char *s);
index e58185074931f06c46b6c98aa71cd2feaf02156f..0591400ff4ef9cf700aa6c54e12ad35b8cd3de63 100644 (file)
@@ -1485,7 +1485,8 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     int doMap = (obj->url || obj->explicit_tooltip);
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
 
     poly = (polygon_t *) ND_shape_info(n);
     vertices = poly->vertices;
@@ -1608,7 +1609,8 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     emit_label(job, EMIT_NLABEL, ND_label(n));
     if (doMap) {
        if (job->flags & EMIT_CLUSTERS_LAST)
-           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+           gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
         gvrender_end_anchor(job);
     }
 }
@@ -1719,7 +1721,8 @@ static void point_gencode(GVJ_t * job, node_t * n)
     int doMap = (obj->url || obj->explicit_tooltip);
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
 
     poly = (polygon_t *) ND_shape_info(n);
     vertices = poly->vertices;
@@ -1787,7 +1790,8 @@ static void point_gencode(GVJ_t * job, node_t * n)
 
     if (doMap) {
        if (job->flags & EMIT_CLUSTERS_LAST)
-           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+           gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
         gvrender_end_anchor(job);
     }
 }
@@ -2317,7 +2321,8 @@ static void record_gencode(GVJ_t * job, node_t * n)
     BF.UR.y += ND_coord(n).y;
     
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
-        gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+        gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
     style = stylenode(job, n);
     pencolor(job, n);
     if (style & FILLED)
@@ -2340,7 +2345,8 @@ static void record_gencode(GVJ_t * job, node_t * n)
 
     if (doMap) {
        if (job->flags & EMIT_CLUSTERS_LAST)
-            gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+            gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
         gvrender_end_anchor(job);
     }
 }
@@ -2423,7 +2429,8 @@ static void epsf_gencode(GVJ_t * job, node_t * n)
        return;
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
-       gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+       gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
     gvrender_begin_context(job);
     if (desc)
        fprintf(job->output_file,
@@ -2436,7 +2443,8 @@ static void epsf_gencode(GVJ_t * job, node_t * n)
     emit_label(job, EMIT_NLABEL, ND_label(n));
     if (doMap) {
        if (job->flags & EMIT_CLUSTERS_LAST)
-           gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
+           gvrender_begin_anchor(job,
+               obj->url, obj->tooltip, obj->target, obj->id);
         gvrender_end_anchor(job);
     }
 }
index 9711fe0b1d242e362fc28c3d510089e0309eade7..8c5cb788d53c1e032119ea829cb425244c94dc68 100644 (file)
@@ -30,7 +30,6 @@
 extern GVC_t *gvNEWcontext(char **info, char *user);
 extern char *gvUsername(void);
 extern int gvRenderJobs (GVC_t * gvc, graph_t * g);
-extern char *gvplugin_list(GVC_t * gvc, api_t api, const char *str);
 
 static char *LibInfo[] = {
     "libgvc",          /* Program */
index 8aca804ca47ee78d9261a04ce7574ba8e7e4f4e3..9d0f21cd1d1d1f8be7fa791e8f26f274816b708e 100644 (file)
@@ -67,9 +67,6 @@ extern char *gvcVersion(GVC_t*);
 extern char *gvcBuildDate(GVC_t*);
 extern char *gvcUsername(GVC_t*);
 
-/* get plugins associated with a graphviz context */
-extern char *gvplugin_list(GVC_t * gvc, api_t api, char *str);
-
 /* parse command line args - minimally argv[0] sets layout engine */
 extern int gvParseArgs(GVC_t *gvc, int argc, char **argv);
 extern graph_t *gvNextInputGraph(GVC_t *gvc);
index 78721332d6b72cf1d40a43d09e075c8707dbb442..a4a60d8af15672ce3c610430fdb59a6c4b1ceb52 100644 (file)
@@ -213,6 +213,7 @@ extern "C" {
        char *headlabel; 
 
        char *url;              /* if GVRENDER_DOES_MAPS */
+       char *id;
        char *labelurl;
        char *tailurl;
        char *headurl; 
index 014200299de703a8209536482a007f4ff7f8ee05..a3ea7948018a43c9b6adfc7a0b974a617d26bf90 100644 (file)
@@ -41,6 +41,7 @@ extern "C" {
     extern api_t gvplugin_api(char *str);
     extern char * gvplugin_api_name(api_t api);
     extern void gvplugin_write_status(GVC_t * gvc);
+    extern char *gvplugin_list(GVC_t * gvc, api_t api, const char *str);
 
 /* job */
 
@@ -98,8 +99,8 @@ extern "C" {
     extern void gvrender_end_edge(GVJ_t * job);
     extern void gvrender_begin_context(GVJ_t * job);
     extern void gvrender_end_context(GVJ_t * job);
-    extern void gvrender_begin_anchor(GVJ_t * job, char *href,
-                       char *tooltip, char *target);
+    extern void gvrender_begin_anchor(GVJ_t * job,
+               char *href, char *tooltip, char *target, char *id);
     extern void gvrender_end_anchor(GVJ_t * job);
     extern void gvrender_set_font(GVJ_t * job, char *fontname,
                        double fontsize);
index 7f100c793740d1d4e0089593f70bf30ebf16d5de..1b66c97e4bc77f57de4bb9f97c946926e0a7b7ed 100644 (file)
@@ -45,8 +45,8 @@ extern "C" {
        void (*end_node) (GVJ_t * job);
        void (*begin_edge) (GVJ_t * job);
        void (*end_edge) (GVJ_t * job);
-       void (*begin_anchor) (GVJ_t * job, char *href, char *tooltip,
-                             char *target);
+       void (*begin_anchor) (GVJ_t * job,
+               char *href, char *tooltip, char *target, char *id);
        void (*end_anchor) (GVJ_t * job);
        void (*textpara) (GVJ_t * job, pointf p, textpara_t * str);
        void (*resolve_color) (GVJ_t * job, gvcolor_t * color);
index 17724c89522db7f1c6797ba038eb86891521f8fa..f15614ef80e5aaec83d1b2167bf6a170996c4030 100644 (file)
@@ -590,13 +590,13 @@ void gvrender_end_context(GVJ_t * job)
 #endif
 }
 
-void gvrender_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target)
+void gvrender_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target, char *id)
 {
     gvrender_engine_t *gvre = job->render.engine;
 
     if (gvre) {
        if (gvre->begin_anchor)
-           gvre->begin_anchor(job, href, tooltip, target);
+           gvre->begin_anchor(job, href, tooltip, target, id);
     }
 #ifdef WITH_CODEGENS
     else {
index 9aff7c786230a24316033265b806aea112f8ddfd..033b306589861fcc116de2d606219b0750bfd642 100644 (file)
@@ -31,7 +31,7 @@ extern char *xml_url_string(char *str);
 typedef enum { FORMAT_IMAP, FORMAT_ISMAP, FORMAT_CMAP, FORMAT_CMAPX, } format_type;
 
 static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, int nump,
-                char* url, char *tooltip, char *target)
+                char* url, char *tooltip, char *target, char *id)
 {
     int i;
 
@@ -97,6 +97,11 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in
             assert(0);
             break;
         }
+        if (id && id[0]) {
+            gvputs(job, " id=\"");
+           gvputs(job, xml_url_string(id));
+           gvputs(job, "\"");
+       }
         if (url && url[0]) {
             gvputs(job, " href=\"");
            gvputs(job, xml_url_string(url));
@@ -190,12 +195,14 @@ static void map_end_page(GVJ_t * job)
 
     switch (job->render.id) {
     case FORMAT_CMAP:
-       map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
-                                   obj->url, obj->tooltip, obj->target);
+       map_output_shape(job, obj->url_map_shape,
+               obj->url_map_p,obj->url_map_n,
+               obj->url, obj->tooltip, obj->target, obj->id);
        break;
     case FORMAT_CMAPX:
-       map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
-                                   obj->url, obj->tooltip, obj->target);
+       map_output_shape(job, obj->url_map_shape,
+               obj->url_map_p,obj->url_map_n,
+               obj->url, obj->tooltip, obj->target, obj->id);
         gvputs(job, "</map>\n");
        break;
     default:
@@ -247,12 +254,13 @@ map_begin_edge(GVJ_t * job)
 }
 #endif
 
-static void map_begin_anchor(GVJ_t * job, char *url, char *tooltip, char *target)
+static void map_begin_anchor(GVJ_t * job, char *url, char *tooltip, char *target, char *id)
 {
     obj_state_t *obj = job->obj;
 
-    map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n, 
-               url, tooltip, target);
+    map_output_shape(job, obj->url_map_shape,
+               obj->url_map_p, obj->url_map_n, 
+               url, tooltip, target, id);
 }
 
 static gvrender_engine_t map_engine = {
index 1dbc9d40c194ef829557d44c0d3235af4211d024..1bea4670d17fc0bfb399596ed9e3cf279128cbf9 100644 (file)
@@ -207,7 +207,7 @@ static void psgen_end_edge(GVJ_t * job)
     gvputs(job, "grestore\n");
 }
 
-static void psgen_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target)
+static void psgen_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target, char *id)
 {
     obj_state_t *obj = job->obj;
 
index ec7cd97c6385c4f68fa0f000fd94f1aa7b61acb1..cd6c094e84a906450b0da90056d9f0b9f30b0c83 100644 (file)
@@ -281,9 +281,11 @@ static void svg_end_edge(GVJ_t * job)
 }
 
 static void
-svg_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target)
+svg_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target, char *id)
 {
     gvputs(job, "<a");
+    if (id && id[0])
+       gvprintf(job, " xlink:id=\"%s\"", xml_url_string(id));
     if (href && href[0])
        gvprintf(job, " xlink:href=\"%s\"", xml_url_string(href));
     if (tooltip && tooltip[0])
index eb4a26101dde400d60e5a9bfda2ebefa78a301d9..8313252f55d0718107413186e4530010a3525d97 100644 (file)
@@ -188,9 +188,11 @@ static void vml_end_graph(GVJ_t * job)
 }
 
 static void
-vml_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target)
+vml_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target, char *id)
 {
     gvputs(job, "      <a");
+    if (id && id[0])
+       gvprintf(job, " id=\"%s\"", xml_string(id));
     if (href && href[0])
        gvprintf(job, " href=\"%s\"", xml_string(href));
     if (tooltip && tooltip[0])
index b2b98b1de33979c3ceb804a6265a580d301a2a8b..511357c90255c62ede36bee6297538d9799e1681 100644 (file)
@@ -270,7 +270,7 @@ static void lasi_end_edge(GVJ_t * job)
     gvputs(job, "grestore\n");
 }
 
-static void lasi_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target)
+static void lasi_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target, char *id)
 {
     obj_state_t *obj = job->obj;
 
index c1b5fe9219b2ceadf226bf77c0380df5cba334d4..3151de02f04b4d0c2ac319be2b912af59b3f5b7d 100644 (file)
@@ -158,7 +158,7 @@ static void quartzgen_end_page(GVJ_t *job)
        CGContextEndPage(context);
 }
 
-static void quartzgen_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target)
+static void quartzgen_begin_anchor(GVJ_t *job, char *url, char *tooltip, char *target, char *id)
 {
     pointf *url_map = job->obj->url_map_p;
        if (url && url_map) {