static void svg_begin_anchor(GVJ_t * job, char *href, char *tooltip, char *target, char *id) { gvputs(job, "<g"); if (id) { gvputs(job, " id=\"a_"); gvputs(job, xml_string(id)); gvputs(job, "\""); } gvputs(job, ">"); gvputs(job, "<a"); #if 0 /* the svg spec implies this can be omitted: http://www.w3.org/TR/SVG/linking.html#Links */ gvputs(job, " xlink:type=\"simple\""); #endif if (href && href[0]) { gvputs(job, " xlink:href=\""); gvputs(job, xml_url_string(href)); gvputs(job, "\""); } #if 0 /* linking to itself, just so that it can have a xlink:link in the anchor, seems wrong. * it changes the behavior in browsers, the link apears in the bottom information bar */ else { assert(id && id[0]); /* there should always be an id available */ gvputs(job, " xlink:href=\"#"); gvputs(job, xml_url_string(href)); gvputs(job, "\""); } #endif if (tooltip && tooltip[0]) { gvputs(job, " xlink:title=\""); gvputs(job, xml_string(tooltip)); gvputs(job, "\""); } if (target && target[0]) { gvputs(job, " target=\""); gvputs(job, xml_string(target)); gvputs(job, "\""); } gvputs(job, ">\n"); }
static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, int nump, char* url, char *tooltip, char *target, char *id) { int i; static point *A; static int size_A; if (!AF || !nump) return; if (size_A < nump) { size_A = nump + 10; A = realloc(A, size_A * sizeof(point)); } for (i = 0; i < nump; i++) PF2P(AF[i], A[i]); if (job->render.id == FORMAT_IMAP && url && url[0]) { switch (map_shape) { case MAP_RECTANGLE: /* Y_GOES_DOWN so need UL to LR */ gvprintf(job, "rect %s %d,%d %d,%d\n", url, A[0].x, A[1].y, A[1].x, A[0].y); break; case MAP_CIRCLE: gvprintf(job, "circle %s %d,%d,%d\n", url, A[0].x, A[0].y, A[1].x-A[0].x); break; case MAP_POLYGON: gvprintf(job, "poly %s", url); for (i = 0; i < nump; i++) gvprintf(job, " %d,%d", A[i].x, A[i].y); gvputs(job, "\n"); break; default: assert(0); break; } } else if (job->render.id == FORMAT_ISMAP && url && url[0]) { switch (map_shape) { case MAP_RECTANGLE: /* Y_GOES_DOWN so need UL to LR */ gvprintf(job, "rectangle (%d,%d) (%d,%d) %s %s\n", A[0].x, A[1].y, A[1].x, A[0].y, url, tooltip); break; default: assert(0); break; } } else if (job->render.id == FORMAT_CMAP || job->render.id == FORMAT_CMAPX) { switch (map_shape) { case MAP_CIRCLE: gvputs(job, "<area shape=\"circle\""); break; case MAP_RECTANGLE: gvputs(job, "<area shape=\"rect\""); break; case MAP_POLYGON: gvputs(job, "<area shape=\"poly\""); break; default: 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)); gvputs(job, "\""); } if (target && target[0]) { gvputs(job, " target=\""); gvputs(job, xml_string(target)); gvputs(job, "\""); } if (tooltip && tooltip[0]) { gvputs(job, " title=\""); gvputs(job, xml_string(tooltip)); gvputs(job, "\""); } /* * alt text is intended for the visually impaired, but such * folk are not likely to be clicking around on a graph anyway. * IE on the PC platform (but not on Macs) incorrectly * uses (non-empty) alt strings instead of title strings for tooltips. * To make tooltips work and avoid this IE issue, * while still satisfying usability guidelines * that require that there is always an alt string, * we generate just an empty alt string. */ gvputs(job, " alt=\"\""); gvputs(job, " coords=\""); switch (map_shape) { case MAP_CIRCLE: gvprintf(job, "%d,%d,%d", A[0].x, A[0].y, A[1].x-A[0].x); break; case MAP_RECTANGLE: /* Y_GOES_DOWN so need UL to LR */ gvprintf(job, "%d,%d,%d,%d", A[0].x, A[1].y, A[1].x, A[0].y); break; case MAP_POLYGON: gvprintf(job, "%d,%d", A[0].x, A[0].y); for (i = 1; i < nump; i++) gvprintf(job, ",%d,%d", A[i].x, A[i].y); break; default: break; } if (job->render.id == FORMAT_CMAPX) gvputs(job, "\"/>\n"); else gvputs(job, "\">\n"); } }