d2ir: Update links after import

This commit is contained in:
Anmol Sethi 2023-06-06 22:13:49 -07:00
parent d296ba0f1d
commit 7d9f8b6c08
No known key found for this signature in database
GPG key ID: 8CEF1878FF10ADEB
3 changed files with 135 additions and 13 deletions

View file

@ -201,18 +201,7 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
switch n := n.(type) { switch n := n.(type) {
case *Field: case *Field:
if n.Primary_ != nil { if n.Primary_ != nil {
refctx2 := refctx.Copy() f.Primary_ = n.Primary_.Copy(f).(*Scalar)
key2 := *refctx.Key
refctx.Key = &key2
refctx2.Key.Value = d2ast.MakeValueBox(n.Primary_.Value)
// If the link is a board, we need to transform it into an absolute path.
if f.Name == "link" {
c.compileLink(refctx2)
}
f.Primary_ = &Scalar{
parent: f,
Value: refctx2.Key.Value.ScalarBox().Unbox(),
}
} }
if n.Composite != nil { if n.Composite != nil {
f.Composite = n.Composite.Copy(f).(Composite) f.Composite = n.Composite.Copy(f).(Composite)
@ -238,6 +227,7 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
} }
} }
OverlayMap(f.Map(), n) OverlayMap(f.Map(), n)
c.updateLinks(f.Map())
switch NodeBoardKind(f) { switch NodeBoardKind(f) {
case BoardScenario, BoardStep: case BoardScenario, BoardStep:
c.compileClasses(f.Map()) c.compileClasses(f.Map())
@ -255,6 +245,24 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
} }
} }
func (c *compiler) updateLinks(m *Map) {
for _, f := range m.Fields {
if f.Name == "link" {
bida := BoardIDA(f)
aida := IDA(f)
if len(bida) != len(aida) {
prependIDA := aida[:len(aida)-len(bida)]
kp := d2ast.MakeKeyPath(prependIDA)
s := d2format.Format(kp) + "." + f.Primary_.Value.ScalarString()
f.Primary_.Value = d2ast.MakeValueBox(d2ast.RawString(s, true)).ScalarBox().Unbox()
}
}
if f.Map() != nil {
c.updateLinks(f.Map())
}
}
}
func (c *compiler) compileLink(refctx *RefContext) { func (c *compiler) compileLink(refctx *RefContext) {
val := refctx.Key.Value.ScalarBox().Unbox().ScalarString() val := refctx.Key.Value.ScalarBox().Unbox().ScalarString()
link, err := d2parser.ParseKey(val) link, err := d2parser.ParseKey(val)

View file

@ -410,7 +410,11 @@ steps: {
writeFile(t, dir, "y.d2", `meow`) writeFile(t, dir, "y.d2", `meow`)
err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2")) err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2"))
assert.Success(t, err) assert.Success(t, err)
svg := readFile(t, dir, "hello-world.svg") svg := readFile(t, dir, "hello-world/x/y.svg")
assert.Testdata(t, ".svg", svg)
svg = readFile(t, dir, "hello-world/x/index.svg")
assert.Testdata(t, ".svg", svg)
svg = readFile(t, dir, "hello-world/index.svg")
assert.Testdata(t, ".svg", svg) assert.Testdata(t, ".svg", svg)
}, },
}, },

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 304 285"><svg id="d2-svg" class="d2-1110812327" width="304" height="285" viewBox="-101 -118 304 285"><rect x="-101.000000" y="-118.000000" width="304.000000" height="285.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.appendix-icon {
filter: drop-shadow(0px 0px 32px rgba(31, 36, 58, 0.1));
}
.d2-1110812327 .text-bold {
font-family: "d2-1110812327-font-bold";
}
@font-face {
font-family: d2-1110812327-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-1110812327 .fill-N1{fill:#0A0F25;}
.d2-1110812327 .fill-N2{fill:#676C7E;}
.d2-1110812327 .fill-N3{fill:#9499AB;}
.d2-1110812327 .fill-N4{fill:#CFD2DD;}
.d2-1110812327 .fill-N5{fill:#DEE1EB;}
.d2-1110812327 .fill-N6{fill:#EEF1F8;}
.d2-1110812327 .fill-N7{fill:#FFFFFF;}
.d2-1110812327 .fill-B1{fill:#0D32B2;}
.d2-1110812327 .fill-B2{fill:#0D32B2;}
.d2-1110812327 .fill-B3{fill:#E3E9FD;}
.d2-1110812327 .fill-B4{fill:#E3E9FD;}
.d2-1110812327 .fill-B5{fill:#EDF0FD;}
.d2-1110812327 .fill-B6{fill:#F7F8FE;}
.d2-1110812327 .fill-AA2{fill:#4A6FF3;}
.d2-1110812327 .fill-AA4{fill:#EDF0FD;}
.d2-1110812327 .fill-AA5{fill:#F7F8FE;}
.d2-1110812327 .fill-AB4{fill:#EDF0FD;}
.d2-1110812327 .fill-AB5{fill:#F7F8FE;}
.d2-1110812327 .stroke-N1{stroke:#0A0F25;}
.d2-1110812327 .stroke-N2{stroke:#676C7E;}
.d2-1110812327 .stroke-N3{stroke:#9499AB;}
.d2-1110812327 .stroke-N4{stroke:#CFD2DD;}
.d2-1110812327 .stroke-N5{stroke:#DEE1EB;}
.d2-1110812327 .stroke-N6{stroke:#EEF1F8;}
.d2-1110812327 .stroke-N7{stroke:#FFFFFF;}
.d2-1110812327 .stroke-B1{stroke:#0D32B2;}
.d2-1110812327 .stroke-B2{stroke:#0D32B2;}
.d2-1110812327 .stroke-B3{stroke:#E3E9FD;}
.d2-1110812327 .stroke-B4{stroke:#E3E9FD;}
.d2-1110812327 .stroke-B5{stroke:#EDF0FD;}
.d2-1110812327 .stroke-B6{stroke:#F7F8FE;}
.d2-1110812327 .stroke-AA2{stroke:#4A6FF3;}
.d2-1110812327 .stroke-AA4{stroke:#EDF0FD;}
.d2-1110812327 .stroke-AA5{stroke:#F7F8FE;}
.d2-1110812327 .stroke-AB4{stroke:#EDF0FD;}
.d2-1110812327 .stroke-AB5{stroke:#F7F8FE;}
.d2-1110812327 .background-color-N1{background-color:#0A0F25;}
.d2-1110812327 .background-color-N2{background-color:#676C7E;}
.d2-1110812327 .background-color-N3{background-color:#9499AB;}
.d2-1110812327 .background-color-N4{background-color:#CFD2DD;}
.d2-1110812327 .background-color-N5{background-color:#DEE1EB;}
.d2-1110812327 .background-color-N6{background-color:#EEF1F8;}
.d2-1110812327 .background-color-N7{background-color:#FFFFFF;}
.d2-1110812327 .background-color-B1{background-color:#0D32B2;}
.d2-1110812327 .background-color-B2{background-color:#0D32B2;}
.d2-1110812327 .background-color-B3{background-color:#E3E9FD;}
.d2-1110812327 .background-color-B4{background-color:#E3E9FD;}
.d2-1110812327 .background-color-B5{background-color:#EDF0FD;}
.d2-1110812327 .background-color-B6{background-color:#F7F8FE;}
.d2-1110812327 .background-color-AA2{background-color:#4A6FF3;}
.d2-1110812327 .background-color-AA4{background-color:#EDF0FD;}
.d2-1110812327 .background-color-AA5{background-color:#F7F8FE;}
.d2-1110812327 .background-color-AB4{background-color:#EDF0FD;}
.d2-1110812327 .background-color-AB5{background-color:#F7F8FE;}
.d2-1110812327 .color-N1{color:#0A0F25;}
.d2-1110812327 .color-N2{color:#676C7E;}
.d2-1110812327 .color-N3{color:#9499AB;}
.d2-1110812327 .color-N4{color:#CFD2DD;}
.d2-1110812327 .color-N5{color:#DEE1EB;}
.d2-1110812327 .color-N6{color:#EEF1F8;}
.d2-1110812327 .color-N7{color:#FFFFFF;}
.d2-1110812327 .color-B1{color:#0D32B2;}
.d2-1110812327 .color-B2{color:#0D32B2;}
.d2-1110812327 .color-B3{color:#E3E9FD;}
.d2-1110812327 .color-B4{color:#E3E9FD;}
.d2-1110812327 .color-B5{color:#EDF0FD;}
.d2-1110812327 .color-B6{color:#F7F8FE;}
.d2-1110812327 .color-AA2{color:#4A6FF3;}
.d2-1110812327 .color-AA4{color:#EDF0FD;}
.d2-1110812327 .color-AA5{color:#F7F8FE;}
.d2-1110812327 .color-AB4{color:#EDF0FD;}
.d2-1110812327 .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}]]></style><a href="x/index.svg" xlink:href="x/index.svg"><g id="x"><g class="shape" ><rect x="0.000000" y="0.000000" width="85.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="42.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text><g transform="translate(69 -16)" class="appendix-icon"><svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3440_35088111)">
<path d="M16 31.1109C24.3456 31.1109 31.1111 24.3454 31.1111 15.9998C31.1111 7.65415 24.3456 0.888672 16 0.888672C7.65436 0.888672 0.888885 7.65415 0.888885 15.9998C0.888885 24.3454 7.65436 31.1109 16 31.1109Z" fill="white" stroke="#DEE1EB"/>
<path d="M14.3909 16.7965C14.7364 17.2584 15.1772 17.6406 15.6834 17.9171C16.1896 18.1938 16.7494 18.3582 17.3248 18.3993C17.9001 18.4405 18.4777 18.3575 19.0181 18.1559C19.5586 17.9543 20.0492 17.6389 20.4571 17.2309L22.8708 14.8173C23.6036 14.0586 24.0089 13.0425 23.9998 11.9877C23.9906 10.933 23.5676 9.92404 22.8217 9.17821C22.0759 8.43237 21.067 8.00931 20.0123 8.00015C18.9575 7.99098 17.9413 8.39644 17.1827 9.1292L15.7988 10.505" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.609 15.1874C17.2635 14.7255 16.8227 14.3433 16.3165 14.0667C15.8103 13.7902 15.2505 13.6257 14.6752 13.5845C14.0998 13.5433 13.5223 13.6263 12.9819 13.8279C12.4414 14.0295 11.9506 14.345 11.5428 14.753L9.1292 17.1666C8.39644 17.9252 7.99098 18.9414 8.00015 19.9962C8.00931 21.0509 8.43237 22.0598 9.17821 22.8056C9.92405 23.5515 10.933 23.9745 11.9877 23.9837C13.0425 23.9928 14.0586 23.5875 14.8173 22.8547L16.193 21.4788" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_3440_35088111">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>
</g></g></a><mask id="d2-1110812327" maskUnits="userSpaceOnUse" x="-101" y="-118" width="304" height="285">
<rect x="-101" y="-118" width="304" height="285" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 11 KiB