diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index ce882cb59..64657d011 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -11,6 +11,7 @@ import ( "strings" "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2parser" "oss.terrastruct.com/d2/d2renderers/d2fonts" "oss.terrastruct.com/d2/d2renderers/d2svg" "oss.terrastruct.com/d2/d2target" @@ -162,6 +163,33 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by return []byte(svg) } +// transformInternalLink turns +// "root.layers.x.layers.y" +// into +// "[name] > x > y" +func transformInternalLink(rootName, link string) string { + if link == "" || !strings.HasPrefix(link, "root") { + return link + } + + mk, err := d2parser.ParseMapKey(link) + if err != nil { + return "" + } + + key := d2graph.Key(mk.Key) + + key[0] = rootName + + if len(key) > 1 { + for i := 1; i < len(key); i += 2 { + key[i] = ">" + } + } + + return strings.Join(key, " ") +} + func generateAppendix(diagram *d2target.Diagram, ruler *textmeasure.Ruler, svg string) (string, int, int) { tl, br := diagram.BoundingBox() @@ -171,7 +199,7 @@ func generateAppendix(diagram *d2target.Diagram, ruler *textmeasure.Ruler, svg s i := 1 for _, s := range diagram.Shapes { - for _, txt := range []string{s.Tooltip, s.Link} { + for _, txt := range []string{s.Tooltip, transformInternalLink(diagram.Name, s.Link)} { if txt != "" { line, w, h := generateLine(i, br.Y+(PAD_TOP*2)+totalHeight, txt, ruler) i++ diff --git a/d2renderers/d2svg/appendix/appendix_test.go b/d2renderers/d2svg/appendix/appendix_test.go index 26126327e..d9bec84a9 100644 --- a/d2renderers/d2svg/appendix/appendix_test.go +++ b/d2renderers/d2svg/appendix/appendix_test.go @@ -90,6 +90,23 @@ x -> y script: `x: { link: https://d2lang.com } y: { link: https://fosny.eu; tooltip: Gee, I feel kind of LIGHT in the head now,\nknowing I can't make my satellite dish PAYMENTS! } x -> y +`, + }, + { + name: "internal-links", + script: `x: { link: layers.x } +layers: { + x: { + gooo + home.link: _ + next.link: steps.next + steps: { + next: { + hi + } + } + } +} `, }, { diff --git a/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg b/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg new file mode 100644 index 000000000..091ed3418 --- /dev/null +++ b/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg @@ -0,0 +1,115 @@ +x1 + + +1 > x + \ No newline at end of file