From 56e46d62608b7615b7565f7aef6535080c8bea3d Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Wed, 29 Mar 2023 12:01:40 -0700 Subject: [PATCH 1/3] better appendix internal links --- d2renderers/d2svg/appendix/appendix.go | 30 ++++- d2renderers/d2svg/appendix/appendix_test.go | 17 +++ .../testdata/internal-links/sketch.exp.svg | 115 ++++++++++++++++++ 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg 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 From eacbd596c50f8feb43cc23cd24e30cf429db62e3 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Wed, 29 Mar 2023 14:50:17 -0700 Subject: [PATCH 2/3] regen --- d2renderers/d2svg/appendix/appendix.go | 8 +++----- .../d2svg/appendix/testdata/internal-links/sketch.exp.svg | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/d2renderers/d2svg/appendix/appendix.go b/d2renderers/d2svg/appendix/appendix.go index 64657d011..a0eb21077 100644 --- a/d2renderers/d2svg/appendix/appendix.go +++ b/d2renderers/d2svg/appendix/appendix.go @@ -166,8 +166,8 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by // transformInternalLink turns // "root.layers.x.layers.y" // into -// "[name] > x > y" -func transformInternalLink(rootName, link string) string { +// "root > x > y" +func transformInternalLink(link string) string { if link == "" || !strings.HasPrefix(link, "root") { return link } @@ -179,8 +179,6 @@ func transformInternalLink(rootName, link string) string { key := d2graph.Key(mk.Key) - key[0] = rootName - if len(key) > 1 { for i := 1; i < len(key); i += 2 { key[i] = ">" @@ -199,7 +197,7 @@ func generateAppendix(diagram *d2target.Diagram, ruler *textmeasure.Ruler, svg s i := 1 for _, s := range diagram.Shapes { - for _, txt := range []string{s.Tooltip, transformInternalLink(diagram.Name, s.Link)} { + for _, txt := range []string{s.Tooltip, transformInternalLink(s.Link)} { if txt != "" { line, w, h := generateLine(i, br.Y+(PAD_TOP*2)+totalHeight, txt, ruler) i++ diff --git a/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg b/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg index 091ed3418..5a9da7228 100644 --- a/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg +++ b/d2renderers/d2svg/appendix/testdata/internal-links/sketch.exp.svg @@ -95,7 +95,7 @@ .d2-3205202238 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>x1 -1 > x +1root > x