Merge pull request #923 from nhooyr/layers-containers-97eb

cli: Improve multiboard output
This commit is contained in:
Anmol Sethi 2023-02-27 14:42:10 -08:00 committed by GitHub
commit 233a3fddd3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
647 changed files with 5935 additions and 59 deletions

1
.gitignore vendored
View file

@ -6,3 +6,4 @@
e2e_report.html
bin
out
d2

View file

@ -11,6 +11,7 @@
- `class` and `sql_table` shape respect `font-color` styling as header font color. [#899](https://github.com/terrastruct/d2/issues/899)
- SVG fits to screen by default in both watch mode and as a standalone SVG (this time with just CSS, no JS). [#725](https://github.com/terrastruct/d2/issues/725)
- Only chromium is installed when rendering png diagrams instead of also installing webkit and firefox. [#835](https://github.com/terrastruct/d2/issues/835)
- Multiboard output is now self-contained and less confusing. See [#923](https://github.com/terrastruct/d2/pull/923)
#### Bugfixes ⛑️

View file

@ -71,6 +71,11 @@ func (c *compiler) compileBoard(g *d2graph.Graph, ir *d2ir.Map) *d2graph.Graph {
c.compileBoardsField(g, ir, "layers")
c.compileBoardsField(g, ir, "scenarios")
c.compileBoardsField(g, ir, "steps")
if d2ir.ParentMap(ir).CopyBase(nil).Equal(ir.CopyBase(nil)) {
if len(g.Layers) > 0 || len(g.Scenarios) > 0 || len(g.Steps) > 0 {
g.IsFolderOnly = true
}
}
return g
}

View file

@ -2099,9 +2099,9 @@ layers: {
}
}
`, "")
assert.JSON(t, 2, len(g.Layers))
assert.JSON(t, "one", g.Layers[0].Name)
assert.JSON(t, "two", g.Layers[1].Name)
assert.Equal(t, 2, len(g.Layers))
assert.Equal(t, "one", g.Layers[0].Name)
assert.Equal(t, "two", g.Layers[1].Name)
},
},
{
@ -2132,6 +2132,37 @@ layers: {
assert.Equal(t, 2, len(g.Layers[1].Steps))
},
},
{
name: "isFolderOnly",
run: func(t *testing.T) {
g := assertCompile(t, `
layers: {
one: {
santa
}
two: {
clause
scenarios: {
seinfeld: {
}
missoula: {
steps: {
missus: one two three
}
}
}
}
}
`, "")
assert.True(t, g.IsFolderOnly)
assert.Equal(t, 2, len(g.Layers))
assert.Equal(t, "one", g.Layers[0].Name)
assert.Equal(t, "two", g.Layers[1].Name)
assert.Equal(t, 2, len(g.Layers[1].Scenarios))
assert.False(t, g.Layers[1].Scenarios[0].IsFolderOnly)
assert.False(t, g.Layers[1].Scenarios[1].IsFolderOnly)
},
},
{
name: "errs/duplicate_board",
run: func(t *testing.T) {

View file

@ -16,6 +16,7 @@ func Export(ctx context.Context, g *d2graph.Graph, fontFamily *d2fonts.FontFamil
diagram := d2target.NewDiagram()
applyStyles(&diagram.Root, g.Root)
diagram.Name = g.Name
diagram.IsFolderOnly = g.IsFolderOnly
if fontFamily == nil {
fontFamily = go2.Pointer(d2fonts.SourceSansPro)
}

View file

@ -28,8 +28,12 @@ const DEFAULT_SHAPE_SIZE = 100.
const MIN_SHAPE_SIZE = 5
type Graph struct {
Name string `json:"name"`
AST *d2ast.Map `json:"ast"`
Name string `json:"name"`
// IsFolderOnly indicates a board or scenario itself makes no modifications from its
// base. Folder only boards do not have a render and are used purely for organizing
// the board tree.
IsFolderOnly bool `json:"isFolderOnly"`
AST *d2ast.Map `json:"ast"`
Root *Object `json:"root"`
Edges []*Edge `json:"edges"`

View file

@ -23,6 +23,7 @@ type Node interface {
Parent() Node
Primary() *Scalar
Map() *Map
Equal(n2 Node) bool
ast() d2ast.Node
fmt.Stringer
@ -139,7 +140,8 @@ func (s *Scalar) Copy(newParent Node) Node {
return s
}
func (s *Scalar) Equal(s2 *Scalar) bool {
func (s *Scalar) Equal(n2 Node) bool {
s2 := n2.(*Scalar)
if _, ok := s.Value.(d2ast.String); ok {
if _, ok = s2.Value.(d2ast.String); ok {
return s.Value.ScalarString() == s2.Value.ScalarString()
@ -187,6 +189,10 @@ func (m *Map) Copy(newParent Node) Node {
// CopyBase copies the map m without layers/scenarios/steps.
func (m *Map) CopyBase(newParent Node) *Map {
if m == nil {
return (&Map{}).Copy(newParent).(*Map)
}
layers := m.DeleteField("layers")
scenarios := m.DeleteField("scenarios")
steps := m.DeleteField("steps")
@ -1054,3 +1060,73 @@ func reverseIDA(ida []string) {
ida[len(ida)-i-1] = tmp
}
}
func (f *Field) Equal(n2 Node) bool {
f2 := n2.(*Field)
if f.Name != f2.Name {
return false
}
if !f.Primary_.Equal(f2.Primary_) {
return false
}
if !f.Composite.Equal(f2.Composite) {
return false
}
return true
}
func (e *Edge) Equal(n2 Node) bool {
e2 := n2.(*Edge)
if !e.ID.Match(e2.ID) {
return false
}
if !e.Primary_.Equal(e2.Primary_) {
return false
}
if !e.Map_.Equal(e2.Map_) {
return false
}
return true
}
func (a *Array) Equal(n2 Node) bool {
a2 := n2.(*Array)
if len(a.Values) != len(a2.Values) {
return false
}
for i := range a.Values {
if !a.Values[i].Equal(a2.Values[i]) {
return false
}
}
return true
}
func (m *Map) Equal(n2 Node) bool {
m2 := n2.(*Map)
if len(m.Fields) != len(m2.Fields) {
return false
}
if len(m.Edges) != len(m2.Edges) {
return false
}
for i := range m.Fields {
if !m.Fields[i].Equal(m2.Fields[i]) {
return false
}
}
for i := range m.Edges {
if !m.Edges[i].Equal(m2.Edges[i]) {
return false
}
}
return true
}

View file

@ -34,9 +34,11 @@ const (
var BorderOffset = geo.NewVector(5, 5)
type Diagram struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
FontFamily *d2fonts.FontFamily `json:"fontFamily,omitempty"`
Name string `json:"name"`
// See docs on the same field in d2graph to understand what it means.
IsFolderOnly bool `json:"isFolderOnly"`
Description string `json:"description,omitempty"`
FontFamily *d2fonts.FontFamily `json:"fontFamily,omitempty"`
Shapes []Shape `json:"shapes"`
Connections []Connection `json:"connections"`

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [],
"connections": [],

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [],
"connections": [],

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

View file

@ -1,5 +1,6 @@
{
"name": "",
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{

Some files were not shown because too many files have changed in this diff Show more