d2sequence: ensure order for child boards

This commit is contained in:
Alexander Wang 2024-09-11 11:05:04 -06:00
parent 4e93f70db3
commit 7c967954e0
No known key found for this signature in database
GPG key ID: BE3937D0D52D8927
5 changed files with 240 additions and 1 deletions

View file

@ -1,6 +1,8 @@
package d2graph package d2graph
import "oss.terrastruct.com/d2/d2target" import (
"oss.terrastruct.com/d2/d2target"
)
func (obj *Object) IsSequenceDiagram() bool { func (obj *Object) IsSequenceDiagram() bool {
return obj != nil && obj.Shape.Value == d2target.ShapeSequenceDiagram return obj != nil && obj.Shape.Value == d2target.ShapeSequenceDiagram

View file

@ -1,9 +1,11 @@
package d2sequence package d2sequence
import ( import (
"cmp"
"errors" "errors"
"fmt" "fmt"
"math" "math"
"slices"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
@ -76,6 +78,13 @@ func newSequenceDiagram(objects []*d2graph.Object, messages []*d2graph.Edge) (*s
var actors []*d2graph.Object var actors []*d2graph.Object
var groups []*d2graph.Object var groups []*d2graph.Object
slices.SortFunc(objects, func(a, b *d2graph.Object) int {
return cmp.Compare(getObjEarliestLineNum(a), getObjEarliestLineNum(b))
})
slices.SortFunc(messages, func(a, b *d2graph.Edge) int {
return cmp.Compare(getEdgeEarliestLineNum(a), getEdgeEarliestLineNum(b))
})
for _, obj := range objects { for _, obj := range objects {
if obj.IsSequenceDiagramGroup() { if obj.IsSequenceDiagramGroup() {
queue := []*d2graph.Object{obj} queue := []*d2graph.Object{obj}

View file

@ -94,6 +94,30 @@ func TestCLI_E2E(t *testing.T) {
assert.TestdataDir(t, filepath.Join(dir, "layer-link")) assert.TestdataDir(t, filepath.Join(dir, "layer-link"))
}, },
}, },
{
name: "sequence-layer",
run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
writeFile(t, dir, "index.d2", `k; layers: { seq: @seq.d2 }`)
writeFile(t, dir, "seq.d2", `shape: sequence_diagram
a: me
b: github.com/terrastruct/d2
a -> b: issue about a bug
a."some note about the bug"
if i'm right: {
a <- b: fix
}
if i'm wrong: {
a <- b: nah, intended
}`)
err := runTestMain(t, ctx, dir, env, "index.d2")
assert.Success(t, err)
assert.TestdataDir(t, filepath.Join(dir, "index"))
},
},
{ {
// Skip the empty base board so the animation doesn't show blank for 1400ms // Skip the empty base board so the animation doesn't show blank for 1400ms
name: "empty-base", name: "empty-base",

View file

@ -0,0 +1,95 @@
<?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.6.6-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 255 268"><svg id="d2-svg" class="d2-1573652205" width="255" height="268" viewBox="-101 -101 255 268"><rect x="-101.000000" y="-101.000000" width="255.000000" height="268.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1573652205 .text-bold {
font-family: "d2-1573652205-font-bold";
}
@font-face {
font-family: d2-1573652205-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-1573652205 .fill-N1{fill:#0A0F25;}
.d2-1573652205 .fill-N2{fill:#676C7E;}
.d2-1573652205 .fill-N3{fill:#9499AB;}
.d2-1573652205 .fill-N4{fill:#CFD2DD;}
.d2-1573652205 .fill-N5{fill:#DEE1EB;}
.d2-1573652205 .fill-N6{fill:#EEF1F8;}
.d2-1573652205 .fill-N7{fill:#FFFFFF;}
.d2-1573652205 .fill-B1{fill:#0D32B2;}
.d2-1573652205 .fill-B2{fill:#0D32B2;}
.d2-1573652205 .fill-B3{fill:#E3E9FD;}
.d2-1573652205 .fill-B4{fill:#E3E9FD;}
.d2-1573652205 .fill-B5{fill:#EDF0FD;}
.d2-1573652205 .fill-B6{fill:#F7F8FE;}
.d2-1573652205 .fill-AA2{fill:#4A6FF3;}
.d2-1573652205 .fill-AA4{fill:#EDF0FD;}
.d2-1573652205 .fill-AA5{fill:#F7F8FE;}
.d2-1573652205 .fill-AB4{fill:#EDF0FD;}
.d2-1573652205 .fill-AB5{fill:#F7F8FE;}
.d2-1573652205 .stroke-N1{stroke:#0A0F25;}
.d2-1573652205 .stroke-N2{stroke:#676C7E;}
.d2-1573652205 .stroke-N3{stroke:#9499AB;}
.d2-1573652205 .stroke-N4{stroke:#CFD2DD;}
.d2-1573652205 .stroke-N5{stroke:#DEE1EB;}
.d2-1573652205 .stroke-N6{stroke:#EEF1F8;}
.d2-1573652205 .stroke-N7{stroke:#FFFFFF;}
.d2-1573652205 .stroke-B1{stroke:#0D32B2;}
.d2-1573652205 .stroke-B2{stroke:#0D32B2;}
.d2-1573652205 .stroke-B3{stroke:#E3E9FD;}
.d2-1573652205 .stroke-B4{stroke:#E3E9FD;}
.d2-1573652205 .stroke-B5{stroke:#EDF0FD;}
.d2-1573652205 .stroke-B6{stroke:#F7F8FE;}
.d2-1573652205 .stroke-AA2{stroke:#4A6FF3;}
.d2-1573652205 .stroke-AA4{stroke:#EDF0FD;}
.d2-1573652205 .stroke-AA5{stroke:#F7F8FE;}
.d2-1573652205 .stroke-AB4{stroke:#EDF0FD;}
.d2-1573652205 .stroke-AB5{stroke:#F7F8FE;}
.d2-1573652205 .background-color-N1{background-color:#0A0F25;}
.d2-1573652205 .background-color-N2{background-color:#676C7E;}
.d2-1573652205 .background-color-N3{background-color:#9499AB;}
.d2-1573652205 .background-color-N4{background-color:#CFD2DD;}
.d2-1573652205 .background-color-N5{background-color:#DEE1EB;}
.d2-1573652205 .background-color-N6{background-color:#EEF1F8;}
.d2-1573652205 .background-color-N7{background-color:#FFFFFF;}
.d2-1573652205 .background-color-B1{background-color:#0D32B2;}
.d2-1573652205 .background-color-B2{background-color:#0D32B2;}
.d2-1573652205 .background-color-B3{background-color:#E3E9FD;}
.d2-1573652205 .background-color-B4{background-color:#E3E9FD;}
.d2-1573652205 .background-color-B5{background-color:#EDF0FD;}
.d2-1573652205 .background-color-B6{background-color:#F7F8FE;}
.d2-1573652205 .background-color-AA2{background-color:#4A6FF3;}
.d2-1573652205 .background-color-AA4{background-color:#EDF0FD;}
.d2-1573652205 .background-color-AA5{background-color:#F7F8FE;}
.d2-1573652205 .background-color-AB4{background-color:#EDF0FD;}
.d2-1573652205 .background-color-AB5{background-color:#F7F8FE;}
.d2-1573652205 .color-N1{color:#0A0F25;}
.d2-1573652205 .color-N2{color:#676C7E;}
.d2-1573652205 .color-N3{color:#9499AB;}
.d2-1573652205 .color-N4{color:#CFD2DD;}
.d2-1573652205 .color-N5{color:#DEE1EB;}
.d2-1573652205 .color-N6{color:#EEF1F8;}
.d2-1573652205 .color-N7{color:#FFFFFF;}
.d2-1573652205 .color-B1{color:#0D32B2;}
.d2-1573652205 .color-B2{color:#0D32B2;}
.d2-1573652205 .color-B3{color:#E3E9FD;}
.d2-1573652205 .color-B4{color:#E3E9FD;}
.d2-1573652205 .color-B5{color:#EDF0FD;}
.d2-1573652205 .color-B6{color:#F7F8FE;}
.d2-1573652205 .color-AA2{color:#4A6FF3;}
.d2-1573652205 .color-AA4{color:#EDF0FD;}
.d2-1573652205 .color-AA5{color:#F7F8FE;}
.d2-1573652205 .color-AB4{color:#EDF0FD;}
.d2-1573652205 .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><g id="k"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">k</text></g><mask id="d2-1573652205" maskUnits="userSpaceOnUse" x="-101" y="-101" width="255" height="268">
<rect x="-101" y="-101" width="255" height="268" fill="white"></rect>
<rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB