diff --git a/d2renderers/d2svg/class.go b/d2renderers/d2svg/class.go index befe5c47e..af71ac1af 100644 --- a/d2renderers/d2svg/class.go +++ b/d2renderers/d2svg/class.go @@ -97,8 +97,8 @@ func visibilityToken(visibility string) string { } func drawClass(writer io.Writer, targetShape d2target.Shape) { - fmt.Fprintf(writer, ``, - targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height) + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape)) box := geo.NewBox( geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)), diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index d8f1bb2d0..4dd6cebe8 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -37,6 +37,9 @@ const ( var multipleOffset = geo.NewVector(10, -10) +//go:embed style.css +var styleCSS string + //go:embed github-markdown.css var mdCSS string @@ -446,12 +449,12 @@ func drawConnection(writer io.Writer, connection d2target.Connection, markers ma } } -func renderOval(tl *geo.Point, width, height float64) string { +func renderOval(tl *geo.Point, width, height float64, style string) string { rx := width / 2 ry := height / 2 cx := tl.X + rx cy := tl.Y + ry - return fmt.Sprintf(``, cx, cy, rx, ry) + return fmt.Sprintf(``, cx, cy, rx, ry, style) } func defineShadowFilter(writer io.Writer) { @@ -487,7 +490,7 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error { } } - fmt.Fprintf(writer, ``, style, shadowAttr) + fmt.Fprintf(writer, ``, shadowAttr) var multipleTL *geo.Point if targetShape.Multiple { @@ -503,14 +506,14 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error { return nil case d2target.ShapeOval: if targetShape.Multiple { - fmt.Fprint(writer, renderOval(multipleTL, width, height)) + fmt.Fprint(writer, renderOval(multipleTL, width, height, style)) } - fmt.Fprint(writer, renderOval(tl, width, height)) + fmt.Fprint(writer, renderOval(tl, width, height, style)) case d2target.ShapeImage: - fmt.Fprintf(writer, ``, + fmt.Fprintf(writer, ``, targetShape.Icon.String(), - targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height) + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style) // TODO should standardize "" to rectangle case d2target.ShapeRectangle, "": @@ -550,11 +553,11 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error { strings.Join(rightPolygonPoints, ""), darkerColor) } if targetShape.Multiple { - fmt.Fprintf(writer, ``, - targetShape.Pos.X+10, targetShape.Pos.Y-10, targetShape.Width, targetShape.Height) + fmt.Fprintf(writer, ``, + targetShape.Pos.X+10, targetShape.Pos.Y-10, targetShape.Width, targetShape.Height, style) } - fmt.Fprintf(writer, ``, - targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height) + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style) case d2target.ShapeText, d2target.ShapeCode: default: @@ -566,7 +569,7 @@ func drawShape(writer io.Writer, targetShape d2target.Shape) error { } for _, pathData := range s.GetSVGPathData() { - fmt.Fprintf(writer, ``, pathData) + fmt.Fprintf(writer, ``, pathData, style) } } @@ -837,18 +840,11 @@ func Render(diagram *d2target.Diagram) ([]byte, error) { buf := &bytes.Buffer{} _, _ = setViewbox(buf, diagram) - buf.WriteString(``) +`, styleCSS)) hasMarkdown := false for _, s := range diagram.Shapes { diff --git a/d2renderers/d2svg/style.css b/d2renderers/d2svg/style.css new file mode 100644 index 000000000..f5cffa9cc --- /dev/null +++ b/d2renderers/d2svg/style.css @@ -0,0 +1,8 @@ +.shape { + shape-rendering: geometricPrecision; + stroke-linejoin: round; +} +.connection { + stroke-linecap: round; + stroke-linejoin: round; +} diff --git a/d2renderers/d2svg/table.go b/d2renderers/d2svg/table.go index de378793e..ce9e79536 100644 --- a/d2renderers/d2svg/table.go +++ b/d2renderers/d2svg/table.go @@ -98,8 +98,8 @@ func constraintAbbr(constraint string) string { } func drawTable(writer io.Writer, targetShape d2target.Shape) { - fmt.Fprintf(writer, ``, - targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height) + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape)) box := geo.NewBox( geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)),