diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index 990739bc3..d5137c37f 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -17,6 +17,7 @@ import ( "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/d2themes" "oss.terrastruct.com/d2/lib/color" + svglib "oss.terrastruct.com/d2/lib/svg" "oss.terrastruct.com/d2/lib/textmeasure" "oss.terrastruct.com/util-go/go2" ) @@ -176,13 +177,17 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by return renderOrder[i].shape.Level < renderOrder[j].shape.Level }) + diagramHash, err := diagram.HashID() + if err != nil { + return nil + } // replace each rendered svg icon for _, icon := range renderOrder { // The clip-path has a unique ID, so this won't replace any user icons // In the existing SVG, the transform places it top-left, so we adjust var iconStr string if icon.isTooltip { - iconStr = d2svg.TooltipIcon + iconStr = fmt.Sprintf(d2svg.TooltipIcon, diagramHash, svglib.SVGID(icon.shape.ID)) } else { iconStr = d2svg.LinkIcon } diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index 2ad69ddda..40e050459 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -1033,7 +1033,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape } else { drawClass(writer, diagramHash, targetShape, inlineTheme) } - addAppendixItems(appendixWriter, targetShape, s) + addAppendixItems(appendixWriter, diagramHash, targetShape, s) fmt.Fprint(writer, ``) fmt.Fprint(writer, closingTag) return labelMask, nil @@ -1047,7 +1047,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape } else { drawTable(writer, diagramHash, targetShape, inlineTheme) } - addAppendixItems(appendixWriter, targetShape, s) + addAppendixItems(appendixWriter, diagramHash, targetShape, s) fmt.Fprint(writer, ``) fmt.Fprint(writer, closingTag) return labelMask, nil @@ -1467,13 +1467,13 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape svg.EscapeText(targetShape.Tooltip), ) } - addAppendixItems(appendixWriter, targetShape, s) + addAppendixItems(appendixWriter, diagramHash, targetShape, s) fmt.Fprint(writer, closingTag) return labelMask, nil } -func addAppendixItems(writer io.Writer, targetShape d2target.Shape, s shape.Shape) { +func addAppendixItems(writer io.Writer, diagramHash string, targetShape d2target.Shape, s shape.Shape) { var p1, p2 *geo.Point if targetShape.Tooltip != "" || targetShape.Link != "" { bothIcons := targetShape.Tooltip != "" && targetShape.Link != "" @@ -1519,7 +1519,7 @@ func addAppendixItems(writer io.Writer, targetShape d2target.Shape, s shape.Shap x-appendixIconRadius, y-appendixIconRadius, svg.EscapeText(targetShape.Tooltip), - TooltipIcon, + fmt.Sprintf(TooltipIcon, diagramHash, svg.SVGID(targetShape.ID)), ) } if targetShape.Link != "" { diff --git a/d2renderers/d2svg/tooltip.svg b/d2renderers/d2svg/tooltip.svg index eb29cc2eb..4fe3a7e4d 100644 --- a/d2renderers/d2svg/tooltip.svg +++ b/d2renderers/d2svg/tooltip.svg @@ -1,12 +1,12 @@ - + - + diff --git a/lib/svg/text.go b/lib/svg/text.go index a729d5675..24d28c088 100644 --- a/lib/svg/text.go +++ b/lib/svg/text.go @@ -2,7 +2,9 @@ package svg import ( "bytes" + "encoding/base32" "encoding/xml" + "strings" ) func EscapeText(text string) string { @@ -10,3 +12,7 @@ func EscapeText(text string) string { _ = xml.EscapeText(buf, []byte(text)) return buf.String() } + +func SVGID(text string) string { + return strings.TrimRight(base32.StdEncoding.EncodeToString([]byte(text)), "=") +}