diff --git a/d2compiler/compile.go b/d2compiler/compile.go
index c49a95a43..901f6bcee 100644
--- a/d2compiler/compile.go
+++ b/d2compiler/compile.go
@@ -669,8 +669,8 @@ func (c *compiler) compileSQLTable(obj *d2graph.Object) {
typ = ""
}
d2Col := d2target.SQLColumn{
- Name: col.IDVal,
- Type: typ,
+ Name: d2target.Text{Label: col.IDVal},
+ Type: d2target.Text{Label: typ},
}
// The only map a sql table field could have is to specify constraint
if col.Map != nil {
diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go
index f29db2f16..5923293fc 100644
--- a/d2compiler/compile_test.go
+++ b/d2compiler/compile_test.go
@@ -1465,8 +1465,8 @@ b`, g.Objects[0].Attributes.Label.Value)
if len(g.Objects) != 1 {
t.Fatal(g.Objects)
}
- assert.String(t, `GetType()`, g.Objects[0].SQLTable.Columns[0].Name)
- assert.String(t, `Is()`, g.Objects[0].SQLTable.Columns[1].Name)
+ assert.String(t, `GetType()`, g.Objects[0].SQLTable.Columns[0].Name.Label)
+ assert.String(t, `Is()`, g.Objects[0].SQLTable.Columns[1].Name.Label)
},
},
{
@@ -1490,8 +1490,8 @@ b`, g.Objects[0].Attributes.Label.Value)
if len(g.Objects[0].ChildrenArray) != 1 {
t.Fatal(g.Objects)
}
- assert.String(t, `GetType()`, g.Objects[1].SQLTable.Columns[0].Name)
- assert.String(t, `Is()`, g.Objects[1].SQLTable.Columns[1].Name)
+ assert.String(t, `GetType()`, g.Objects[1].SQLTable.Columns[0].Name.Label)
+ assert.String(t, `Is()`, g.Objects[1].SQLTable.Columns[1].Name.Label)
},
},
{
diff --git a/d2graph/d2graph.go b/d2graph/d2graph.go
index 4001d3fb0..7661270f0 100644
--- a/d2graph/d2graph.go
+++ b/d2graph/d2graph.go
@@ -995,23 +995,32 @@ func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler
obj.Width = float64(maxWidth + 100)
case d2target.ShapeSQLTable:
- maxNameWidth := 0.
- maxTypeWidth := 0.
- constraintWidth := 0.
+ maxNameWidth := 0
+ maxTypeWidth := 0
+ constraintWidth := 0
font := d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_L, d2fonts.FONT_STYLE_REGULAR)
- for _, c := range obj.SQLTable.Columns {
- nameWidth, _ := ruler.MeasurePrecise(font, c.Name)
+ for i := range obj.SQLTable.Columns {
+ // Note: we want to set dimensions of actual column not the for loop copy of the struct
+ c := &obj.SQLTable.Columns[i]
+
+ nameWidth, nameHeight := ruler.Measure(font, c.Name.Label)
+ c.Name.LabelWidth = nameWidth
+ c.Name.LabelHeight = nameHeight
if maxNameWidth < nameWidth {
maxNameWidth = nameWidth
}
- typeWidth, _ := ruler.MeasurePrecise(font, c.Type)
+
+ typeWidth, typeHeight := ruler.Measure(font, c.Type.Label)
+ c.Type.LabelWidth = typeWidth
+ c.Type.LabelHeight = typeHeight
if maxTypeWidth < typeWidth {
maxTypeWidth = typeWidth
}
+
if c.Constraint != "" {
// covers UNQ constraint with padding
- constraintWidth = 60.
+ constraintWidth = 60
}
}
diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go
index e9e94b686..41a0c63a6 100644
--- a/d2renderers/d2svg/d2svg.go
+++ b/d2renderers/d2svg/d2svg.go
@@ -589,7 +589,7 @@ func render3dRect(targetShape d2target.Shape) string {
return borderMask + mainRect + renderedSides + renderedBorder
}
-func drawShape(writer io.Writer, targetShape d2target.Shape, ruler *textmeasure.Ruler) (labelMask string, err error) {
+func drawShape(writer io.Writer, targetShape d2target.Shape) (labelMask string, err error) {
fmt.Fprintf(writer, ``, escapeText(targetShape.ID))
tl := geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y))
width := float64(targetShape.Width)
@@ -629,7 +629,7 @@ func drawShape(writer io.Writer, targetShape d2target.Shape, ruler *textmeasure.
fmt.Fprintf(writer, ``)
return labelMask, nil
case d2target.ShapeSQLTable:
- drawTable(writer, targetShape, ruler)
+ drawTable(writer, targetShape)
fmt.Fprintf(writer, ``)
return labelMask, nil
case d2target.ShapeOval:
@@ -963,7 +963,7 @@ func embedFonts(buf *bytes.Buffer) {
}
// TODO minify output at end
-func Render(diagram *d2target.Diagram, ruler *textmeasure.Ruler, pad int) ([]byte, error) {
+func Render(diagram *d2target.Diagram, pad int) ([]byte, error) {
buf := &bytes.Buffer{}
w, h := setViewbox(buf, diagram, pad)
@@ -1022,7 +1022,7 @@ func Render(diagram *d2target.Diagram, ruler *textmeasure.Ruler, pad int) ([]byt
labelMasks = append(labelMasks, labelMask)
}
} else if s, is := obj.(d2target.Shape); is {
- labelMask, err := drawShape(buf, s, ruler)
+ labelMask, err := drawShape(buf, s)
if err != nil {
return nil, err
} else if labelMask != "" {
diff --git a/d2renderers/d2svg/table.go b/d2renderers/d2svg/table.go
index 43b0b69bb..94258e4ff 100644
--- a/d2renderers/d2svg/table.go
+++ b/d2renderers/d2svg/table.go
@@ -3,14 +3,12 @@ package d2svg
import (
"fmt"
"io"
- "math"
"strings"
- "oss.terrastruct.com/d2/d2renderers/d2fonts"
"oss.terrastruct.com/d2/d2target"
"oss.terrastruct.com/d2/lib/geo"
"oss.terrastruct.com/d2/lib/label"
- "oss.terrastruct.com/d2/lib/textmeasure"
+ "oss.terrastruct.com/util-go/go2"
)
const namePadding = 10
@@ -101,7 +99,7 @@ func constraintAbbr(constraint string) string {
}
}
-func drawTable(writer io.Writer, targetShape d2target.Shape, ruler *textmeasure.Ruler) {
+func drawTable(writer io.Writer, targetShape d2target.Shape) {
fmt.Fprintf(writer, ``,
targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape))
@@ -117,18 +115,16 @@ func drawTable(writer io.Writer, targetShape d2target.Shape, ruler *textmeasure.
tableHeader(headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)),
)
- font := d2fonts.SourceSansPro.Font(targetShape.FontSize, d2fonts.FONT_STYLE_REGULAR)
- var longestNameWidth float64
+ var longestNameWidth int
for _, f := range targetShape.SQLTable.Columns {
- w, _ := ruler.MeasurePrecise(font, f.Name)
- longestNameWidth = math.Max(longestNameWidth, w)
+ longestNameWidth = go2.Max(longestNameWidth, f.Name.LabelWidth)
}
rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight)
rowBox.TopLeft.Y += headerBox.Height
for _, f := range targetShape.SQLTable.Columns {
fmt.Fprint(writer,
- tableRow(rowBox, f.Name, f.Type, constraintAbbr(f.Constraint), float64(targetShape.FontSize), longestNameWidth),
+ tableRow(rowBox, f.Name.Label, f.Type.Label, constraintAbbr(f.Constraint), float64(targetShape.FontSize), float64(longestNameWidth)),
)
rowBox.TopLeft.Y += rowHeight
fmt.Fprintf(writer, ``,
@@ -136,5 +132,4 @@ func drawTable(writer io.Writer, targetShape d2target.Shape, ruler *textmeasure.
rowBox.TopLeft.X+rowBox.Width, rowBox.TopLeft.Y,
)
}
-
}
diff --git a/d2target/sqltable.go b/d2target/sqltable.go
index 3007dd178..d928af3e3 100644
--- a/d2target/sqltable.go
+++ b/d2target/sqltable.go
@@ -11,15 +11,15 @@ type SQLTable struct {
}
type SQLColumn struct {
- Name string `json:"name"`
- Type string `json:"type"`
+ Name Text `json:"name"`
+ Type Text `json:"type"`
Constraint string `json:"constraint"`
Reference string `json:"reference"`
}
func (c SQLColumn) Text() *MText {
return &MText{
- Text: fmt.Sprintf("%s%s%s%s", c.Name, c.Type, c.Constraint, c.Reference),
+ Text: fmt.Sprintf("%s%s%s%s", c.Name.Label, c.Type.Label, c.Constraint, c.Reference),
FontSize: d2fonts.FONT_SIZE_L,
IsBold: false,
IsItalic: false,
diff --git a/docs/examples/lib/1-d2lib/d2lib.go b/docs/examples/lib/1-d2lib/d2lib.go
index fc16a313b..8e157d62a 100644
--- a/docs/examples/lib/1-d2lib/d2lib.go
+++ b/docs/examples/lib/1-d2lib/d2lib.go
@@ -20,6 +20,6 @@ func main() {
Ruler: ruler,
ThemeID: d2themescatalog.GrapeSoda.ID,
})
- out, _ := d2svg.Render(diagram, ruler, d2svg.DEFAULT_PADDING)
+ out, _ := d2svg.Render(diagram, d2svg.DEFAULT_PADDING)
_ = ioutil.WriteFile(filepath.Join("out.svg"), out, 0600)
}
diff --git a/docs/examples/lib/3-lowlevel/lowlevel.go b/docs/examples/lib/3-lowlevel/lowlevel.go
index 70c579dba..066558e42 100644
--- a/docs/examples/lib/3-lowlevel/lowlevel.go
+++ b/docs/examples/lib/3-lowlevel/lowlevel.go
@@ -21,6 +21,6 @@ func main() {
_ = graph.SetDimensions(nil, ruler)
_ = d2dagrelayout.Layout(context.Background(), graph)
diagram, _ := d2exporter.Export(context.Background(), graph, d2themescatalog.NeutralDefault.ID)
- out, _ := d2svg.Render(diagram, ruler, d2svg.DEFAULT_PADDING)
+ out, _ := d2svg.Render(diagram, d2svg.DEFAULT_PADDING)
_ = ioutil.WriteFile(filepath.Join("out.svg"), out, 0600)
}
diff --git a/e2etests/e2e_test.go b/e2etests/e2e_test.go
index bf69db6dc..bade9f613 100644
--- a/e2etests/e2e_test.go
+++ b/e2etests/e2e_test.go
@@ -125,7 +125,7 @@ func run(t *testing.T, tc testCase) {
dataPath := filepath.Join("testdata", strings.TrimPrefix(t.Name(), "TestE2E/"), layoutName)
pathGotSVG := filepath.Join(dataPath, "sketch.got.svg")
- svgBytes, err := d2svg.Render(diagram, ruler, d2svg.DEFAULT_PADDING)
+ svgBytes, err := d2svg.Render(diagram, d2svg.DEFAULT_PADDING)
assert.Success(t, err)
err = os.MkdirAll(dataPath, 0755)
assert.Success(t, err)
diff --git a/main.go b/main.go
index b7f8d617a..53ef5d201 100644
--- a/main.go
+++ b/main.go
@@ -214,7 +214,7 @@ func compile(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, pad,
return nil, false, err
}
- svg, err := d2svg.Render(diagram, ruler, int(pad))
+ svg, err := d2svg.Render(diagram, int(pad))
if err != nil {
return nil, false, err
}