assert(obj);
+ free(obj->id);
free(obj->url);
free(obj->labelurl);
free(obj->tailurl);
* 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;
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]) {
}
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");
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)
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)) {
}
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]))
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);
}
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);
}
}
/* 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];
}
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);
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;
*/
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);
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;
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;
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);
}
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;
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 */
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 *)))
{
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);
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;
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);
}
}
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;
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);
}
}
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)
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);
}
}
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,
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);
}
}
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 */
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);
char *headlabel;
char *url; /* if GVRENDER_DOES_MAPS */
+ char *id;
char *labelurl;
char *tailurl;
char *headurl;
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 */
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);
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);
#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 {
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;
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));
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:
}
#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 = {
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;
}
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])
}
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])
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;
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) {