diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index 14878ca73..da3a38d00 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -4,12 +4,6 @@ #### Improvements 🧹 -- Use shape specific sizing for grid containers [#1294](https://github.com/terrastruct/d2/pull/1294) -- Grid diagrams now support nested shapes or grid diagrams [#1309](https://github.com/terrastruct/d2/pull/1309) -- Grid diagrams will now also use `grid-gap`, `vertical-gap`, and `horizontal-gap` for padding [#1309](https://github.com/terrastruct/d2/pull/1309) -- Watch mode browser uses an error favicon to easily indicate compiler errors. Thanks @sinyo-matu ! [#1240](https://github.com/terrastruct/d2/pull/1240) -- Improves grid layout performance when there are many similarly sized shapes. [#1315](https://github.com/terrastruct/d2/pull/1315) -- Connections and labels now are adjusted for shapes with `3d` or `multiple`. [#1340](https://github.com/terrastruct/d2/pull/1340) - Display version on CLI help invocation [#1400](https://github.com/terrastruct/d2/pull/1400) - Improved readability of connection labels when they overlap another connection. [#447](https://github.com/terrastruct/d2/pull/447) - Error message when `shape` is given a composite [#1415](https://github.com/terrastruct/d2/pull/1415) diff --git a/d2format/format.go b/d2format/format.go index 5d5b71271..34b00410e 100644 --- a/d2format/format.go +++ b/d2format/format.go @@ -275,36 +275,15 @@ func (p *printer) _map(m *d2ast.Map) { } } - nodes := []d2ast.MapNodeBox{} - // extract out layer, scenario, and step nodes - layerNodes := []d2ast.MapNodeBox{} - scenarioNodes := []d2ast.MapNodeBox{} - stepNodes := []d2ast.MapNodeBox{} - for i := 0; i < len(m.Nodes); i++ { - node := m.Nodes[i] - if node.IsBoardNode() { - switch node.MapKey.Key.Path[0].Unbox().ScalarString() { - case "layers": - layerNodes = append(layerNodes, node) - case "scenarios": - scenarioNodes = append(scenarioNodes, node) - case "steps": - stepNodes = append(stepNodes, node) - } - } else { - nodes = append(nodes, node) - } - } - - // append layers, scenarios, and steps at the end - nodes = append(nodes, layerNodes...) - nodes = append(nodes, scenarioNodes...) - nodes = append(nodes, stepNodes...) - prev := d2ast.Node(m) - for i := 0; i < len(nodes); i++ { - nb := nodes[i] + for i := 0; i < len(m.Nodes); i++ { + nb := m.Nodes[i] n := nb.Unbox() + // skip board nodes as we'll write them at the end + if nb.IsBoardNode() { + prev = n + continue + } // Handle inline comments. if i > 0 && (nb.Comment != nil || nb.BlockComment != nil) { @@ -328,12 +307,43 @@ func (p *printer) _map(m *d2ast.Map) { p.sb.WriteString("; ") } - if m.IsFileMap() && nb.IsBoardNode() { - currString := p.sb.String() - // if the two characters before the board node is not a double newline, we add one - if currString[len(currString)-2:] != "\n\n" { - p.newline() - } + p.node(n) + prev = n + } + + // extract out layer, scenario, and step nodes + layerNodes := []d2ast.MapNodeBox{} + scenarioNodes := []d2ast.MapNodeBox{} + stepNodes := []d2ast.MapNodeBox{} + for i := 0; i < len(m.Nodes); i++ { + node := m.Nodes[i] + if !node.IsBoardNode() { + continue + } + switch node.MapKey.Key.Path[0].Unbox().ScalarString() { + case "layers": + layerNodes = append(layerNodes, node) + case "scenarios": + scenarioNodes = append(scenarioNodes, node) + case "steps": + stepNodes = append(stepNodes, node) + } + } + + boards := []d2ast.MapNodeBox{} + boards = append(boards, layerNodes...) + boards = append(boards, scenarioNodes...) + boards = append(boards, stepNodes...) + + // draw board nodes + for i := 0; i < len(boards); i++ { + n := boards[i].Unbox() + // if this board is the very first line of the file, don't add an extra indent + if n.GetRange().Start.Line != 0 { + p.newline() + } + if len(m.Nodes) > len(boards) { + p.newline() } p.node(n) prev = n diff --git a/d2format/format_test.go b/d2format/format_test.go index 7e034c7cb..de0ccd1cd 100644 --- a/d2format/format_test.go +++ b/d2format/format_test.go @@ -152,8 +152,8 @@ meow representation: {type: jsonb} diagram: int {constraint: foreign_key} } - meow <- diagrams.id + steps: { shape: sql_table id: {type: int; constraint: primary_key} @@ -661,28 +661,21 @@ x: @"x/../file" }, { name: "layers_scenarios_steps_bottom_simple", - in: `a - -layers: { + in: `layers: { b: { + e scenarios: { p: { x } } - e } } - -g `, - exp: `a - -g - -layers: { + exp: `layers: { b: { e + scenarios: { p: { x @@ -741,21 +734,35 @@ scenarios: { c d + +only-layers: { + layers: { + X + Y + } +} `, exp: `a - b c d +only-layers: { + layers: { + X + Y + } +} + layers: { Test super nested: { base-layer - last-layer + layers: { layer-board + layers: { grand-child-layer: { grand-child-board @@ -768,6 +775,7 @@ layers: { scenarios: { scenario-1: { non-step + steps: { step-1: { Test