better appendix internal links

This commit is contained in:
Alexander Wang 2023-03-29 12:01:40 -07:00
parent d0c22dfedd
commit 56e46d6260
No known key found for this signature in database
GPG key ID: D89FA31966BDBECE
3 changed files with 161 additions and 1 deletions

View file

@ -11,6 +11,7 @@ import (
"strings" "strings"
"oss.terrastruct.com/d2/d2graph" "oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/d2parser"
"oss.terrastruct.com/d2/d2renderers/d2fonts" "oss.terrastruct.com/d2/d2renderers/d2fonts"
"oss.terrastruct.com/d2/d2renderers/d2svg" "oss.terrastruct.com/d2/d2renderers/d2svg"
"oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/d2target"
@ -162,6 +163,33 @@ func Append(diagram *d2target.Diagram, ruler *textmeasure.Ruler, in []byte) []by
return []byte(svg) 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) { func generateAppendix(diagram *d2target.Diagram, ruler *textmeasure.Ruler, svg string) (string, int, int) {
tl, br := diagram.BoundingBox() tl, br := diagram.BoundingBox()
@ -171,7 +199,7 @@ func generateAppendix(diagram *d2target.Diagram, ruler *textmeasure.Ruler, svg s
i := 1 i := 1
for _, s := range diagram.Shapes { 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 != "" { if txt != "" {
line, w, h := generateLine(i, br.Y+(PAD_TOP*2)+totalHeight, txt, ruler) line, w, h := generateLine(i, br.Y+(PAD_TOP*2)+totalHeight, txt, ruler)
i++ i++

View file

@ -90,6 +90,23 @@ x -> y
script: `x: { link: https://d2lang.com } 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! } 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 x -> y
`,
},
{
name: "internal-links",
script: `x: { link: layers.x }
layers: {
x: {
gooo
home.link: _
next.link: steps.next
steps: {
next: {
hi
}
}
}
}
`, `,
}, },
{ {

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 976 KiB