diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index c81a75f81..d2f41b9d7 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -984,7 +984,7 @@ func Render(diagram *d2target.Diagram) ([]byte, error) { // SVG has no notion of z-index. The z-index is effectively the order it's drawn. // So draw from the least nested to most nested idToShape := make(map[string]d2target.Shape) - allObjects := make([]d2target.DiagramObject, 0, len(diagram.Shapes)+len(diagram.Connections)) + allObjects := make([]DiagramObject, 0, len(diagram.Shapes)+len(diagram.Connections)) for _, s := range diagram.Shapes { idToShape[s.ID] = s allObjects = append(allObjects, s) @@ -1005,7 +1005,7 @@ func Render(diagram *d2target.Diagram) ([]byte, error) { return nil, err } } else { - return nil, fmt.Errorf("unknow object of type %t", obj) + return nil, fmt.Errorf("unknow object of type %T", obj) } } @@ -1015,13 +1015,18 @@ func Render(diagram *d2target.Diagram) ([]byte, error) { return buf.Bytes(), nil } +type DiagramObject interface { + GetID() string + GetZIndex() int +} + // sortObjects sorts all diagrams objects (shapes and connections) in the desired drawing order // the sorting criteria is: // 1. zIndex, lower comes first // 2. two shapes with the same zIndex are sorted by their level (container nesting), containers come first // 3. two shapes with the same zIndex and same level, are sorted in the order they were exported // 4. shape and edge, shapes come first -func sortObjects(allObjects []d2target.DiagramObject) { +func sortObjects(allObjects []DiagramObject) { sort.SliceStable(allObjects, func(i, j int) bool { // first sort by zIndex iZIndex := allObjects[i].GetZIndex() @@ -1030,7 +1035,7 @@ func sortObjects(allObjects []d2target.DiagramObject) { return iZIndex < jZIndex } - // then, if both are shapes, the containers come first + // then, if both are shapes, parents come before their children iShape, iIsShape := allObjects[i].(d2target.Shape) jShape, jIsShape := allObjects[j].(d2target.Shape) if iIsShape && jIsShape { diff --git a/d2renderers/d2svg/d2svg_test.go b/d2renderers/d2svg/d2svg_test.go index 5730edbb2..2d99dfe32 100644 --- a/d2renderers/d2svg/d2svg_test.go +++ b/d2renderers/d2svg/d2svg_test.go @@ -7,7 +7,7 @@ import ( ) func TestSortObjects(t *testing.T) { - allObjects := []d2target.DiagramObject{ + allObjects := []DiagramObject{ // same zIndex and level, should keep in this order d2target.Shape{ ID: "0", @@ -57,7 +57,7 @@ func TestSortObjects(t *testing.T) { }, } - expectedOrder := []d2target.DiagramObject{ + expectedOrder := []DiagramObject{ allObjects[8], allObjects[0], allObjects[1], diff --git a/d2target/d2target.go b/d2target/d2target.go index dd386c72d..3f749fa87 100644 --- a/d2target/d2target.go +++ b/d2target/d2target.go @@ -17,11 +17,6 @@ const ( MAX_ICON_SIZE = 64 ) -type DiagramObject interface { - GetID() string - GetZIndex() int -} - type Diagram struct { Name string `json:"name"` Description string `json:"description,omitempty"`