thread inlineTheme
This commit is contained in:
parent
0e08d35f54
commit
00278b4a62
5 changed files with 125 additions and 118 deletions
|
|
@ -95,7 +95,7 @@ func Rect(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
output := ""
|
output := ""
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -106,7 +106,7 @@ func Rect(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
sketchOEl := d2themes.NewThemableElement("rect")
|
sketchOEl := d2themes.NewThemableElement("rect", nil)
|
||||||
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
sketchOEl.Width = float64(shape.Width)
|
sketchOEl.Width = float64(shape.Width)
|
||||||
sketchOEl.Height = float64(shape.Height)
|
sketchOEl.Height = float64(shape.Height)
|
||||||
|
|
@ -143,7 +143,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
|
|
||||||
output := ""
|
output := ""
|
||||||
|
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -154,7 +154,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl = d2themes.NewThemableElement("path")
|
pathEl = d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X+d2target.INNER_BORDER_OFFSET), float64(shape.Pos.Y+d2target.INNER_BORDER_OFFSET))
|
pathEl.SetTranslate(float64(shape.Pos.X+d2target.INNER_BORDER_OFFSET), float64(shape.Pos.Y+d2target.INNER_BORDER_OFFSET))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
// No need for inner to double paint
|
// No need for inner to double paint
|
||||||
|
|
@ -166,7 +166,7 @@ func DoubleRect(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
sketchOEl := d2themes.NewThemableElement("rect")
|
sketchOEl := d2themes.NewThemableElement("rect", nil)
|
||||||
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
sketchOEl.Width = float64(shape.Width)
|
sketchOEl.Width = float64(shape.Width)
|
||||||
sketchOEl.Height = float64(shape.Height)
|
sketchOEl.Height = float64(shape.Height)
|
||||||
|
|
@ -191,7 +191,7 @@ func Oval(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
output := ""
|
output := ""
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -202,7 +202,7 @@ func Oval(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
soElement := d2themes.NewThemableElement("ellipse")
|
soElement := d2themes.NewThemableElement("ellipse", nil)
|
||||||
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
|
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
|
||||||
soElement.Rx = float64(shape.Width / 2)
|
soElement.Rx = float64(shape.Width / 2)
|
||||||
soElement.Ry = float64(shape.Height / 2)
|
soElement.Ry = float64(shape.Height / 2)
|
||||||
|
|
@ -242,7 +242,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
|
|
||||||
output := ""
|
output := ""
|
||||||
|
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -253,7 +253,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl = d2themes.NewThemableElement("path")
|
pathEl = d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
// No need for inner to double paint
|
// No need for inner to double paint
|
||||||
|
|
@ -264,7 +264,7 @@ func DoubleOval(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
pathEl.D = p
|
pathEl.D = p
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
soElement := d2themes.NewThemableElement("ellipse")
|
soElement := d2themes.NewThemableElement("ellipse", nil)
|
||||||
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
|
soElement.SetTranslate(float64(shape.Pos.X+shape.Width/2), float64(shape.Pos.Y+shape.Height/2))
|
||||||
soElement.Rx = float64(shape.Width / 2)
|
soElement.Rx = float64(shape.Width / 2)
|
||||||
soElement.Ry = float64(shape.Height / 2)
|
soElement.Ry = float64(shape.Height / 2)
|
||||||
|
|
@ -294,7 +294,7 @@ func Paths(r *Runner, shape d2target.Shape, paths []string) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
pathEl.ClassName = "shape"
|
pathEl.ClassName = "shape"
|
||||||
|
|
@ -304,7 +304,7 @@ func Paths(r *Runner, shape d2target.Shape, paths []string) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
soElement := d2themes.NewThemableElement("path")
|
soElement := d2themes.NewThemableElement("path", nil)
|
||||||
for _, p := range sketchPaths {
|
for _, p := range sketchPaths {
|
||||||
soElement.D = p
|
soElement.D = p
|
||||||
renderedSO, err := d2themes.NewThemableSketchOverlay(
|
renderedSO, err := d2themes.NewThemableSketchOverlay(
|
||||||
|
|
@ -336,7 +336,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl1 := d2themes.NewThemableElement("path")
|
pathEl1 := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl1.D = path1
|
pathEl1.D = path1
|
||||||
pathEl1.Fill = color.None
|
pathEl1.Fill = color.None
|
||||||
pathEl1.Stroke = connection.Stroke
|
pathEl1.Stroke = connection.Stroke
|
||||||
|
|
@ -345,7 +345,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
|
||||||
pathEl1.Style += "animation-direction: reverse;"
|
pathEl1.Style += "animation-direction: reverse;"
|
||||||
pathEl1.Attributes = attrs
|
pathEl1.Attributes = attrs
|
||||||
|
|
||||||
pathEl2 := d2themes.NewThemableElement("path")
|
pathEl2 := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl2.D = path2
|
pathEl2.D = path2
|
||||||
pathEl2.Fill = color.None
|
pathEl2.Fill = color.None
|
||||||
pathEl2.Stroke = connection.Stroke
|
pathEl2.Stroke = connection.Stroke
|
||||||
|
|
@ -354,7 +354,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
|
||||||
pathEl2.Attributes = attrs
|
pathEl2.Attributes = attrs
|
||||||
return pathEl1.Render() + " " + pathEl2.Render(), nil
|
return pathEl1.Render() + " " + pathEl2.Render(), nil
|
||||||
} else {
|
} else {
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.D = path
|
pathEl.D = path
|
||||||
pathEl.Fill = color.None
|
pathEl.Fill = color.None
|
||||||
pathEl.Stroke = connection.Stroke
|
pathEl.Stroke = connection.Stroke
|
||||||
|
|
@ -373,7 +373,7 @@ func Connection(r *Runner, connection d2target.Connection, path, attrs string) (
|
||||||
|
|
||||||
output := ""
|
output := ""
|
||||||
|
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.Fill = color.None
|
pathEl.Fill = color.None
|
||||||
pathEl.Stroke = connection.Stroke
|
pathEl.Stroke = connection.Stroke
|
||||||
pathEl.ClassName = fmt.Sprintf("connection%s", animatedClass)
|
pathEl.ClassName = fmt.Sprintf("connection%s", animatedClass)
|
||||||
|
|
@ -400,7 +400,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -427,7 +427,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl = d2themes.NewThemableElement("path")
|
pathEl = d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill = shape.Fill
|
pathEl.Fill = shape.Fill
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -445,7 +445,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
float64(shape.LabelHeight),
|
float64(shape.LabelHeight),
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", nil)
|
||||||
textEl.X = tl.X
|
textEl.X = tl.X
|
||||||
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
|
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
|
||||||
textEl.Fill = shape.GetFontColor()
|
textEl.Fill = shape.GetFontColor()
|
||||||
|
|
@ -478,7 +478,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
float64(shape.FontSize),
|
float64(shape.FontSize),
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", nil)
|
||||||
textEl.X = nameTL.X
|
textEl.X = nameTL.X
|
||||||
textEl.Y = nameTL.Y + float64(shape.FontSize)*3/4
|
textEl.Y = nameTL.Y + float64(shape.FontSize)*3/4
|
||||||
textEl.Fill = shape.PrimaryAccentColor
|
textEl.Fill = shape.PrimaryAccentColor
|
||||||
|
|
@ -508,7 +508,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.Fill = shape.Fill
|
pathEl.Fill = shape.Fill
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
for _, p := range paths {
|
for _, p := range paths {
|
||||||
|
|
@ -517,7 +517,7 @@ func Table(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sketchOEl := d2themes.NewThemableElement("rect")
|
sketchOEl := d2themes.NewThemableElement("rect", nil)
|
||||||
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
sketchOEl.Width = float64(shape.Width)
|
sketchOEl.Width = float64(shape.Width)
|
||||||
sketchOEl.Height = float64(shape.Height)
|
sketchOEl.Height = float64(shape.Height)
|
||||||
|
|
@ -542,7 +542,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
pathEl.Fill, pathEl.Stroke = d2themes.ShapeTheme(shape)
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -570,7 +570,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl = d2themes.NewThemableElement("path")
|
pathEl = d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
pathEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
pathEl.Fill = shape.Fill
|
pathEl.Fill = shape.Fill
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
|
|
@ -580,7 +580,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
output += pathEl.Render()
|
output += pathEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
sketchOEl := d2themes.NewThemableElement("rect")
|
sketchOEl := d2themes.NewThemableElement("rect", nil)
|
||||||
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
sketchOEl.SetTranslate(float64(shape.Pos.X), float64(shape.Pos.Y))
|
||||||
sketchOEl.Width = float64(shape.Width)
|
sketchOEl.Width = float64(shape.Width)
|
||||||
sketchOEl.Height = headerBox.Height
|
sketchOEl.Height = headerBox.Height
|
||||||
|
|
@ -598,7 +598,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
float64(shape.LabelHeight),
|
float64(shape.LabelHeight),
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", nil)
|
||||||
textEl.X = tl.X + float64(shape.LabelWidth)/2
|
textEl.X = tl.X + float64(shape.LabelWidth)/2
|
||||||
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
|
textEl.Y = tl.Y + float64(shape.LabelHeight)*3/4
|
||||||
textEl.Fill = shape.GetFontColor()
|
textEl.Fill = shape.GetFontColor()
|
||||||
|
|
@ -625,7 +625,7 @@ func Class(r *Runner, shape d2target.Shape) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
pathEl = d2themes.NewThemableElement("path")
|
pathEl = d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.Fill = shape.Fill
|
pathEl.Fill = shape.Fill
|
||||||
pathEl.FillPattern = shape.FillPattern
|
pathEl.FillPattern = shape.FillPattern
|
||||||
pathEl.ClassName = "class_header"
|
pathEl.ClassName = "class_header"
|
||||||
|
|
@ -657,7 +657,7 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
|
||||||
fontSize,
|
fontSize,
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", nil)
|
||||||
textEl.X = prefixTL.X
|
textEl.X = prefixTL.X
|
||||||
textEl.Y = prefixTL.Y + fontSize*3/4
|
textEl.Y = prefixTL.Y + fontSize*3/4
|
||||||
textEl.Fill = shape.PrimaryAccentColor
|
textEl.Fill = shape.PrimaryAccentColor
|
||||||
|
|
@ -883,7 +883,7 @@ func Arrowheads(r *Runner, connection d2target.Connection, srcAdj, dstAdj *geo.P
|
||||||
roughPaths = append(roughPaths, extraPaths...)
|
roughPaths = append(roughPaths, extraPaths...)
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.ClassName = "connection"
|
pathEl.ClassName = "connection"
|
||||||
pathEl.Attributes = transform
|
pathEl.Attributes = transform
|
||||||
for _, rp := range roughPaths {
|
for _, rp := range roughPaths {
|
||||||
|
|
@ -922,7 +922,7 @@ func Arrowheads(r *Runner, connection d2target.Connection, srcAdj, dstAdj *geo.P
|
||||||
roughPaths = append(roughPaths, extraPaths...)
|
roughPaths = append(roughPaths, extraPaths...)
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", nil)
|
||||||
pathEl.ClassName = "connection"
|
pathEl.ClassName = "connection"
|
||||||
pathEl.Attributes = transform
|
pathEl.Attributes = transform
|
||||||
for _, rp := range roughPaths {
|
for _, rp := range roughPaths {
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ import (
|
||||||
"oss.terrastruct.com/d2/lib/svg"
|
"oss.terrastruct.com/d2/lib/svg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64) string {
|
func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64, inlineTheme *d2themes.Theme) string {
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
|
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
|
||||||
rectEl.Width, rectEl.Height = box.Width, box.Height
|
rectEl.Width, rectEl.Height = box.Width, box.Height
|
||||||
rectEl.Fill = shape.Fill
|
rectEl.Fill = shape.Fill
|
||||||
|
|
@ -33,7 +33,7 @@ func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
|
||||||
textHeight,
|
textHeight,
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = tl.X + textWidth/2
|
textEl.X = tl.X + textWidth/2
|
||||||
textEl.Y = tl.Y + fontSize
|
textEl.Y = tl.Y + fontSize
|
||||||
textEl.Fill = shape.GetFontColor()
|
textEl.Fill = shape.GetFontColor()
|
||||||
|
|
@ -47,7 +47,7 @@ func classHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText string, fontSize float64) string {
|
func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText string, fontSize float64, inlineTheme *d2themes.Theme) string {
|
||||||
// Row is made up of prefix, name, and type
|
// Row is made up of prefix, name, and type
|
||||||
// e.g. | + firstName string |
|
// e.g. | + firstName string |
|
||||||
prefixTL := label.InsideMiddleLeft.GetPointOnBox(
|
prefixTL := label.InsideMiddleLeft.GetPointOnBox(
|
||||||
|
|
@ -63,7 +63,7 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
|
||||||
fontSize,
|
fontSize,
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = prefixTL.X
|
textEl.X = prefixTL.X
|
||||||
textEl.Y = prefixTL.Y + fontSize*3/4
|
textEl.Y = prefixTL.Y + fontSize*3/4
|
||||||
textEl.Fill = shape.PrimaryAccentColor
|
textEl.Fill = shape.PrimaryAccentColor
|
||||||
|
|
@ -87,8 +87,8 @@ func classRow(shape d2target.Shape, box *geo.Box, prefix, nameText, typeText str
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape) {
|
func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape, inlineTheme *d2themes.Theme) {
|
||||||
el := d2themes.NewThemableElement("rect")
|
el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X)
|
el.X = float64(targetShape.Pos.X)
|
||||||
el.Y = float64(targetShape.Pos.Y)
|
el.Y = float64(targetShape.Pos.Y)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -111,19 +111,19 @@ func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape)
|
||||||
headerBox := geo.NewBox(box.TopLeft, box.Width, math.Max(2*rowHeight, float64(targetShape.LabelHeight)+2*label.PADDING))
|
headerBox := geo.NewBox(box.TopLeft, box.Width, math.Max(2*rowHeight, float64(targetShape.LabelHeight)+2*label.PADDING))
|
||||||
|
|
||||||
fmt.Fprint(writer,
|
fmt.Fprint(writer,
|
||||||
classHeader(diagramHash, targetShape, headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)),
|
classHeader(diagramHash, targetShape, headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize), inlineTheme),
|
||||||
)
|
)
|
||||||
|
|
||||||
rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight)
|
rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight)
|
||||||
rowBox.TopLeft.Y += headerBox.Height
|
rowBox.TopLeft.Y += headerBox.Height
|
||||||
for _, f := range targetShape.Fields {
|
for _, f := range targetShape.Fields {
|
||||||
fmt.Fprint(writer,
|
fmt.Fprint(writer,
|
||||||
classRow(targetShape, rowBox, f.VisibilityToken(), f.Name, f.Type, float64(targetShape.FontSize)),
|
classRow(targetShape, rowBox, f.VisibilityToken(), f.Name, f.Type, float64(targetShape.FontSize), inlineTheme),
|
||||||
)
|
)
|
||||||
rowBox.TopLeft.Y += rowHeight
|
rowBox.TopLeft.Y += rowHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
lineEl := d2themes.NewThemableElement("line")
|
lineEl := d2themes.NewThemableElement("line", inlineTheme)
|
||||||
|
|
||||||
if targetShape.BorderRadius != 0 && len(targetShape.Methods) == 0 {
|
if targetShape.BorderRadius != 0 && len(targetShape.Methods) == 0 {
|
||||||
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
||||||
|
|
@ -139,7 +139,7 @@ func drawClass(writer io.Writer, diagramHash string, targetShape d2target.Shape)
|
||||||
|
|
||||||
for _, m := range targetShape.Methods {
|
for _, m := range targetShape.Methods {
|
||||||
fmt.Fprint(writer,
|
fmt.Fprint(writer,
|
||||||
classRow(targetShape, rowBox, m.VisibilityToken(), m.Name, m.Return, float64(targetShape.FontSize)),
|
classRow(targetShape, rowBox, m.VisibilityToken(), m.Name, m.Return, float64(targetShape.FontSize), inlineTheme),
|
||||||
)
|
)
|
||||||
rowBox.TopLeft.Y += rowHeight
|
rowBox.TopLeft.Y += rowHeight
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ import (
|
||||||
"oss.terrastruct.com/d2/lib/svg"
|
"oss.terrastruct.com/d2/lib/svg"
|
||||||
"oss.terrastruct.com/d2/lib/textmeasure"
|
"oss.terrastruct.com/d2/lib/textmeasure"
|
||||||
"oss.terrastruct.com/d2/lib/version"
|
"oss.terrastruct.com/d2/lib/version"
|
||||||
|
"oss.terrastruct.com/util-go/go2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -109,7 +110,7 @@ func arrowheadMarkerID(isTarget bool, connection d2target.Connection) string {
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) string {
|
func arrowheadMarker(isTarget bool, id string, connection d2target.Connection, inlineTheme *d2themes.Theme) string {
|
||||||
arrowhead := connection.DstArrow
|
arrowhead := connection.DstArrow
|
||||||
if !isTarget {
|
if !isTarget {
|
||||||
arrowhead = connection.SrcArrow
|
arrowhead = connection.SrcArrow
|
||||||
|
|
@ -120,7 +121,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
var path string
|
var path string
|
||||||
switch arrowhead {
|
switch arrowhead {
|
||||||
case d2target.ArrowArrowhead:
|
case d2target.ArrowArrowhead:
|
||||||
polygonEl := d2themes.NewThemableElement("polygon")
|
polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
polygonEl.Fill = connection.Stroke
|
polygonEl.Fill = connection.Stroke
|
||||||
polygonEl.ClassName = "connection"
|
polygonEl.ClassName = "connection"
|
||||||
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
||||||
|
|
@ -142,7 +143,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
}
|
}
|
||||||
path = polygonEl.Render()
|
path = polygonEl.Render()
|
||||||
case d2target.UnfilledTriangleArrowhead:
|
case d2target.UnfilledTriangleArrowhead:
|
||||||
polygonEl := d2themes.NewThemableElement("polygon")
|
polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
polygonEl.Fill = d2target.BG_COLOR
|
polygonEl.Fill = d2target.BG_COLOR
|
||||||
polygonEl.Stroke = connection.Stroke
|
polygonEl.Stroke = connection.Stroke
|
||||||
polygonEl.ClassName = "connection"
|
polygonEl.ClassName = "connection"
|
||||||
|
|
@ -165,7 +166,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
path = polygonEl.Render()
|
path = polygonEl.Render()
|
||||||
|
|
||||||
case d2target.TriangleArrowhead:
|
case d2target.TriangleArrowhead:
|
||||||
polygonEl := d2themes.NewThemableElement("polygon")
|
polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
polygonEl.Fill = connection.Stroke
|
polygonEl.Fill = connection.Stroke
|
||||||
polygonEl.ClassName = "connection"
|
polygonEl.ClassName = "connection"
|
||||||
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
||||||
|
|
@ -185,7 +186,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
}
|
}
|
||||||
path = polygonEl.Render()
|
path = polygonEl.Render()
|
||||||
case d2target.LineArrowhead:
|
case d2target.LineArrowhead:
|
||||||
polylineEl := d2themes.NewThemableElement("polyline")
|
polylineEl := d2themes.NewThemableElement("polyline", inlineTheme)
|
||||||
polylineEl.Fill = color.None
|
polylineEl.Fill = color.None
|
||||||
polylineEl.ClassName = "connection"
|
polylineEl.ClassName = "connection"
|
||||||
polylineEl.Stroke = connection.Stroke
|
polylineEl.Stroke = connection.Stroke
|
||||||
|
|
@ -206,7 +207,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
}
|
}
|
||||||
path = polylineEl.Render()
|
path = polylineEl.Render()
|
||||||
case d2target.FilledDiamondArrowhead:
|
case d2target.FilledDiamondArrowhead:
|
||||||
polygonEl := d2themes.NewThemableElement("polygon")
|
polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
polygonEl.ClassName = "connection"
|
polygonEl.ClassName = "connection"
|
||||||
polygonEl.Fill = connection.Stroke
|
polygonEl.Fill = connection.Stroke
|
||||||
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
polygonEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
||||||
|
|
@ -228,7 +229,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
}
|
}
|
||||||
path = polygonEl.Render()
|
path = polygonEl.Render()
|
||||||
case d2target.DiamondArrowhead:
|
case d2target.DiamondArrowhead:
|
||||||
polygonEl := d2themes.NewThemableElement("polygon")
|
polygonEl := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
polygonEl.ClassName = "connection"
|
polygonEl.ClassName = "connection"
|
||||||
polygonEl.Fill = d2target.BG_COLOR
|
polygonEl.Fill = d2target.BG_COLOR
|
||||||
polygonEl.Stroke = connection.Stroke
|
polygonEl.Stroke = connection.Stroke
|
||||||
|
|
@ -253,7 +254,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
case d2target.FilledCircleArrowhead:
|
case d2target.FilledCircleArrowhead:
|
||||||
radius := width / 2
|
radius := width / 2
|
||||||
|
|
||||||
circleEl := d2themes.NewThemableElement("circle")
|
circleEl := d2themes.NewThemableElement("circle", inlineTheme)
|
||||||
circleEl.Cy = radius
|
circleEl.Cy = radius
|
||||||
circleEl.R = radius - strokeWidth/2
|
circleEl.R = radius - strokeWidth/2
|
||||||
circleEl.Fill = connection.Stroke
|
circleEl.Fill = connection.Stroke
|
||||||
|
|
@ -270,7 +271,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
case d2target.CircleArrowhead:
|
case d2target.CircleArrowhead:
|
||||||
radius := width / 2
|
radius := width / 2
|
||||||
|
|
||||||
circleEl := d2themes.NewThemableElement("circle")
|
circleEl := d2themes.NewThemableElement("circle", inlineTheme)
|
||||||
circleEl.Cy = radius
|
circleEl.Cy = radius
|
||||||
circleEl.R = radius - strokeWidth
|
circleEl.R = radius - strokeWidth
|
||||||
circleEl.Fill = d2target.BG_COLOR
|
circleEl.Fill = d2target.BG_COLOR
|
||||||
|
|
@ -289,7 +290,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
|
|
||||||
var modifierEl *d2themes.ThemableElement
|
var modifierEl *d2themes.ThemableElement
|
||||||
if arrowhead == d2target.CfOneRequired || arrowhead == d2target.CfManyRequired {
|
if arrowhead == d2target.CfOneRequired || arrowhead == d2target.CfManyRequired {
|
||||||
modifierEl = d2themes.NewThemableElement("path")
|
modifierEl = d2themes.NewThemableElement("path", inlineTheme)
|
||||||
modifierEl.D = fmt.Sprintf("M%f,%f %f,%f",
|
modifierEl.D = fmt.Sprintf("M%f,%f %f,%f",
|
||||||
offset, 0.,
|
offset, 0.,
|
||||||
offset, height,
|
offset, height,
|
||||||
|
|
@ -299,7 +300,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
modifierEl.ClassName = "connection"
|
modifierEl.ClassName = "connection"
|
||||||
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
||||||
} else {
|
} else {
|
||||||
modifierEl = d2themes.NewThemableElement("circle")
|
modifierEl = d2themes.NewThemableElement("circle", inlineTheme)
|
||||||
modifierEl.Cx = offset/2.0 + 2.0
|
modifierEl.Cx = offset/2.0 + 2.0
|
||||||
modifierEl.Cy = height / 2.0
|
modifierEl.Cy = height / 2.0
|
||||||
modifierEl.R = offset / 2.0
|
modifierEl.R = offset / 2.0
|
||||||
|
|
@ -309,7 +310,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
modifierEl.Attributes = fmt.Sprintf(`stroke-width="%d"`, connection.StrokeWidth)
|
||||||
}
|
}
|
||||||
|
|
||||||
childPathEl := d2themes.NewThemableElement("path")
|
childPathEl := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
if arrowhead == d2target.CfMany || arrowhead == d2target.CfManyRequired {
|
if arrowhead == d2target.CfMany || arrowhead == d2target.CfManyRequired {
|
||||||
childPathEl.D = fmt.Sprintf("M%f,%f %f,%f M%f,%f %f,%f M%f,%f %f,%f",
|
childPathEl.D = fmt.Sprintf("M%f,%f %f,%f M%f,%f %f,%f M%f,%f %f,%f",
|
||||||
width-3.0, height/2.0,
|
width-3.0, height/2.0,
|
||||||
|
|
@ -328,7 +329,7 @@ func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) s
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
gEl := d2themes.NewThemableElement("g")
|
gEl := d2themes.NewThemableElement("g", inlineTheme)
|
||||||
if !isTarget {
|
if !isTarget {
|
||||||
gEl.Transform = fmt.Sprintf("scale(-1) translate(-%f, -%f)", width, height)
|
gEl.Transform = fmt.Sprintf("scale(-1) translate(-%f, -%f)", width, height)
|
||||||
}
|
}
|
||||||
|
|
@ -495,7 +496,7 @@ func makeLabelMask(labelTL *geo.Point, width, height int, opacity float64) strin
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Connection, markers map[string]struct{}, idToShape map[string]d2target.Shape, sketchRunner *d2sketch.Runner) (labelMask string, _ error) {
|
func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Connection, markers map[string]struct{}, idToShape map[string]d2target.Shape, sketchRunner *d2sketch.Runner, inlineTheme *d2themes.Theme) (labelMask string, _ error) {
|
||||||
opacityStyle := ""
|
opacityStyle := ""
|
||||||
if connection.Opacity != 1.0 {
|
if connection.Opacity != 1.0 {
|
||||||
opacityStyle = fmt.Sprintf(" style='opacity:%f'", connection.Opacity)
|
opacityStyle = fmt.Sprintf(" style='opacity:%f'", connection.Opacity)
|
||||||
|
|
@ -510,7 +511,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
if connection.SrcArrow != d2target.NoArrowhead {
|
if connection.SrcArrow != d2target.NoArrowhead {
|
||||||
id := arrowheadMarkerID(false, connection)
|
id := arrowheadMarkerID(false, connection)
|
||||||
if _, in := markers[id]; !in {
|
if _, in := markers[id]; !in {
|
||||||
marker := arrowheadMarker(false, id, connection)
|
marker := arrowheadMarker(false, id, connection, inlineTheme)
|
||||||
if marker == "" {
|
if marker == "" {
|
||||||
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
|
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
|
||||||
}
|
}
|
||||||
|
|
@ -524,7 +525,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
if connection.DstArrow != d2target.NoArrowhead {
|
if connection.DstArrow != d2target.NoArrowhead {
|
||||||
id := arrowheadMarkerID(true, connection)
|
id := arrowheadMarkerID(true, connection)
|
||||||
if _, in := markers[id]; !in {
|
if _, in := markers[id]; !in {
|
||||||
marker := arrowheadMarker(true, id, connection)
|
marker := arrowheadMarker(true, id, connection, inlineTheme)
|
||||||
if marker == "" {
|
if marker == "" {
|
||||||
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
|
panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection))
|
||||||
}
|
}
|
||||||
|
|
@ -579,7 +580,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
pathEl1 := d2themes.NewThemableElement("path")
|
pathEl1 := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
pathEl1.D = path1
|
pathEl1.D = path1
|
||||||
pathEl1.Fill = color.None
|
pathEl1.Fill = color.None
|
||||||
pathEl1.Stroke = connection.Stroke
|
pathEl1.Stroke = connection.Stroke
|
||||||
|
|
@ -589,7 +590,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
pathEl1.Attributes = fmt.Sprintf("%s%s", markerStart, mask)
|
pathEl1.Attributes = fmt.Sprintf("%s%s", markerStart, mask)
|
||||||
fmt.Fprint(writer, pathEl1.Render())
|
fmt.Fprint(writer, pathEl1.Render())
|
||||||
|
|
||||||
pathEl2 := d2themes.NewThemableElement("path")
|
pathEl2 := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
pathEl2.D = path2
|
pathEl2.D = path2
|
||||||
pathEl2.Fill = color.None
|
pathEl2.Fill = color.None
|
||||||
pathEl2.Stroke = connection.Stroke
|
pathEl2.Stroke = connection.Stroke
|
||||||
|
|
@ -598,7 +599,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
pathEl2.Attributes = fmt.Sprintf("%s%s", markerEnd, mask)
|
pathEl2.Attributes = fmt.Sprintf("%s%s", markerEnd, mask)
|
||||||
fmt.Fprint(writer, pathEl2.Render())
|
fmt.Fprint(writer, pathEl2.Render())
|
||||||
} else {
|
} else {
|
||||||
pathEl := d2themes.NewThemableElement("path")
|
pathEl := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
pathEl.D = path
|
pathEl.D = path
|
||||||
pathEl.Fill = color.None
|
pathEl.Fill = color.None
|
||||||
pathEl.Stroke = connection.Stroke
|
pathEl.Stroke = connection.Stroke
|
||||||
|
|
@ -623,7 +624,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
fontClass += " text-underline"
|
fontClass += " text-underline"
|
||||||
}
|
}
|
||||||
if connection.Fill != color.Empty {
|
if connection.Fill != color.Empty {
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.Rx = 10
|
rectEl.Rx = 10
|
||||||
rectEl.X, rectEl.Y = labelTL.X-4, labelTL.Y-3
|
rectEl.X, rectEl.Y = labelTL.X-4, labelTL.Y-3
|
||||||
rectEl.Width, rectEl.Height = float64(connection.LabelWidth)+8, float64(connection.LabelHeight)+6
|
rectEl.Width, rectEl.Height = float64(connection.LabelWidth)+8, float64(connection.LabelHeight)+6
|
||||||
|
|
@ -631,7 +632,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
fmt.Fprint(writer, rectEl.Render())
|
fmt.Fprint(writer, rectEl.Render())
|
||||||
}
|
}
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = labelTL.X + float64(connection.LabelWidth)/2
|
textEl.X = labelTL.X + float64(connection.LabelWidth)/2
|
||||||
textEl.Y = labelTL.Y + float64(connection.FontSize)
|
textEl.Y = labelTL.Y + float64(connection.FontSize)
|
||||||
textEl.Fill = connection.GetFontColor()
|
textEl.Fill = connection.GetFontColor()
|
||||||
|
|
@ -642,16 +643,16 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
if connection.SrcLabel != nil && connection.SrcLabel.Label != "" {
|
if connection.SrcLabel != nil && connection.SrcLabel.Label != "" {
|
||||||
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.SrcLabel.Label, false))
|
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.SrcLabel.Label, false, inlineTheme))
|
||||||
}
|
}
|
||||||
if connection.DstLabel != nil && connection.DstLabel.Label != "" {
|
if connection.DstLabel != nil && connection.DstLabel.Label != "" {
|
||||||
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.DstLabel.Label, true))
|
fmt.Fprint(writer, renderArrowheadLabel(connection, connection.DstLabel.Label, true, inlineTheme))
|
||||||
}
|
}
|
||||||
fmt.Fprintf(writer, `</g>`)
|
fmt.Fprintf(writer, `</g>`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderArrowheadLabel(connection d2target.Connection, text string, isDst bool) string {
|
func renderArrowheadLabel(connection d2target.Connection, text string, isDst bool, inlineTheme *d2themes.Theme) string {
|
||||||
var width, height float64
|
var width, height float64
|
||||||
if isDst {
|
if isDst {
|
||||||
width = float64(connection.DstLabel.LabelWidth)
|
width = float64(connection.DstLabel.LabelWidth)
|
||||||
|
|
@ -669,7 +670,7 @@ func renderArrowheadLabel(connection d2target.Connection, text string, isDst boo
|
||||||
Y: labelTL.Y + float64(connection.FontSize),
|
Y: labelTL.Y + float64(connection.FontSize),
|
||||||
}
|
}
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = baselineCenter.X
|
textEl.X = baselineCenter.X
|
||||||
textEl.Y = baselineCenter.Y
|
textEl.Y = baselineCenter.Y
|
||||||
textEl.Fill = d2target.FG_COLOR
|
textEl.Fill = d2target.FG_COLOR
|
||||||
|
|
@ -688,8 +689,8 @@ func renderArrowheadLabel(connection d2target.Connection, text string, isDst boo
|
||||||
return textEl.Render()
|
return textEl.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke, style string) string {
|
func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke, style string, inlineTheme *d2themes.Theme) string {
|
||||||
el := d2themes.NewThemableElement("ellipse")
|
el := d2themes.NewThemableElement("ellipse", inlineTheme)
|
||||||
el.Rx = width / 2
|
el.Rx = width / 2
|
||||||
el.Ry = height / 2
|
el.Ry = height / 2
|
||||||
el.Cx = tl.X + el.Rx
|
el.Cx = tl.X + el.Rx
|
||||||
|
|
@ -701,9 +702,9 @@ func renderOval(tl *geo.Point, width, height float64, fill, fillPattern, stroke,
|
||||||
return el.Render()
|
return el.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderDoubleOval(tl *geo.Point, width, height float64, fill, fillStroke, stroke, style string) string {
|
func renderDoubleOval(tl *geo.Point, width, height float64, fill, fillStroke, stroke, style string, inlineTheme *d2themes.Theme) string {
|
||||||
var innerTL *geo.Point = tl.AddVector(geo.NewVector(d2target.INNER_BORDER_OFFSET, d2target.INNER_BORDER_OFFSET))
|
var innerTL *geo.Point = tl.AddVector(geo.NewVector(d2target.INNER_BORDER_OFFSET, d2target.INNER_BORDER_OFFSET))
|
||||||
return renderOval(tl, width, height, fill, fillStroke, stroke, style) + renderOval(innerTL, width-10, height-10, fill, "", stroke, style)
|
return renderOval(tl, width, height, fill, fillStroke, stroke, style, inlineTheme) + renderOval(innerTL, width-10, height-10, fill, "", stroke, style, inlineTheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
func defineGradients(writer io.Writer, cssGradient string) {
|
func defineGradients(writer io.Writer, cssGradient string) {
|
||||||
|
|
@ -723,7 +724,7 @@ func defineShadowFilter(writer io.Writer) {
|
||||||
</defs>`)
|
</defs>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func render3DRect(targetShape d2target.Shape) string {
|
func render3DRect(targetShape d2target.Shape, inlineTheme *d2themes.Theme) string {
|
||||||
moveTo := func(p d2target.Point) string {
|
moveTo := func(p d2target.Point) string {
|
||||||
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
|
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
|
||||||
}
|
}
|
||||||
|
|
@ -755,7 +756,7 @@ func render3DRect(targetShape d2target.Shape) string {
|
||||||
borderSegments = append(borderSegments,
|
borderSegments = append(borderSegments,
|
||||||
lineTo(d2target.Point{X: targetShape.Width + d2target.THREE_DEE_OFFSET, Y: -d2target.THREE_DEE_OFFSET}),
|
lineTo(d2target.Point{X: targetShape.Width + d2target.THREE_DEE_OFFSET, Y: -d2target.THREE_DEE_OFFSET}),
|
||||||
)
|
)
|
||||||
border := d2themes.NewThemableElement("path")
|
border := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
border.D = strings.Join(borderSegments, " ")
|
border.D = strings.Join(borderSegments, " ")
|
||||||
border.Fill = color.None
|
border.Fill = color.None
|
||||||
_, borderStroke := d2themes.ShapeTheme(targetShape)
|
_, borderStroke := d2themes.ShapeTheme(targetShape)
|
||||||
|
|
@ -778,7 +779,7 @@ func render3DRect(targetShape d2target.Shape) string {
|
||||||
}, "\n")
|
}, "\n")
|
||||||
|
|
||||||
// render the main rectangle without stroke and the border mask
|
// render the main rectangle without stroke and the border mask
|
||||||
mainShape := d2themes.NewThemableElement("rect")
|
mainShape := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
mainShape.X = float64(targetShape.Pos.X)
|
mainShape.X = float64(targetShape.Pos.X)
|
||||||
mainShape.Y = float64(targetShape.Pos.Y)
|
mainShape.Y = float64(targetShape.Pos.Y)
|
||||||
mainShape.Width = float64(targetShape.Width)
|
mainShape.Width = float64(targetShape.Width)
|
||||||
|
|
@ -809,7 +810,7 @@ func render3DRect(targetShape d2target.Shape) string {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
darkerColor = targetShape.Fill
|
darkerColor = targetShape.Fill
|
||||||
}
|
}
|
||||||
sideShape := d2themes.NewThemableElement("polygon")
|
sideShape := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
sideShape.Fill = darkerColor
|
sideShape.Fill = darkerColor
|
||||||
sideShape.Points = strings.Join(sidePoints, " ")
|
sideShape.Points = strings.Join(sidePoints, " ")
|
||||||
sideShape.SetMaskUrl(maskID)
|
sideShape.SetMaskUrl(maskID)
|
||||||
|
|
@ -819,7 +820,7 @@ func render3DRect(targetShape d2target.Shape) string {
|
||||||
return borderMask + mainShapeRendered + renderedSides + renderedBorder
|
return borderMask + mainShapeRendered + renderedSides + renderedBorder
|
||||||
}
|
}
|
||||||
|
|
||||||
func render3DHexagon(targetShape d2target.Shape) string {
|
func render3DHexagon(targetShape d2target.Shape, inlineTheme *d2themes.Theme) string {
|
||||||
moveTo := func(p d2target.Point) string {
|
moveTo := func(p d2target.Point) string {
|
||||||
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
|
return fmt.Sprintf("M%d,%d", p.X+targetShape.Pos.X, p.Y+targetShape.Pos.Y)
|
||||||
}
|
}
|
||||||
|
|
@ -864,7 +865,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
|
||||||
d2target.Point{X: v.X + d2target.THREE_DEE_OFFSET, Y: v.Y - Y_OFFSET},
|
d2target.Point{X: v.X + d2target.THREE_DEE_OFFSET, Y: v.Y - Y_OFFSET},
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
border := d2themes.NewThemableElement("path")
|
border := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
border.D = strings.Join(borderSegments, " ")
|
border.D = strings.Join(borderSegments, " ")
|
||||||
border.Fill = color.None
|
border.Fill = color.None
|
||||||
_, borderStroke := d2themes.ShapeTheme(targetShape)
|
_, borderStroke := d2themes.ShapeTheme(targetShape)
|
||||||
|
|
@ -901,7 +902,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
|
||||||
strings.Join(borderSegments, ""), borderStyle),
|
strings.Join(borderSegments, ""), borderStyle),
|
||||||
}, "\n")
|
}, "\n")
|
||||||
// render the main hexagon without stroke and the border mask
|
// render the main hexagon without stroke and the border mask
|
||||||
mainShape := d2themes.NewThemableElement("polygon")
|
mainShape := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
mainShape.X = float64(targetShape.Pos.X)
|
mainShape.X = float64(targetShape.Pos.X)
|
||||||
mainShape.Y = float64(targetShape.Pos.Y)
|
mainShape.Y = float64(targetShape.Pos.Y)
|
||||||
mainShape.Points = mainPointsPoly
|
mainShape.Points = mainPointsPoly
|
||||||
|
|
@ -934,7 +935,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
darkerColor = targetShape.Fill
|
darkerColor = targetShape.Fill
|
||||||
}
|
}
|
||||||
sideShape := d2themes.NewThemableElement("polygon")
|
sideShape := d2themes.NewThemableElement("polygon", inlineTheme)
|
||||||
sideShape.Fill = darkerColor
|
sideShape.Fill = darkerColor
|
||||||
sideShape.Points = strings.Join(sidePoints, " ")
|
sideShape.Points = strings.Join(sidePoints, " ")
|
||||||
sideShape.SetMaskUrl(maskID)
|
sideShape.SetMaskUrl(maskID)
|
||||||
|
|
@ -944,7 +945,7 @@ func render3DHexagon(targetShape d2target.Shape) string {
|
||||||
return borderMask + mainShapeRendered + renderedSides + renderedBorder
|
return borderMask + mainShapeRendered + renderedSides + renderedBorder
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape d2target.Shape, sketchRunner *d2sketch.Runner) (labelMask string, err error) {
|
func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape d2target.Shape, sketchRunner *d2sketch.Runner, inlineTheme *d2themes.Theme) (labelMask string, err error) {
|
||||||
closingTag := "</g>"
|
closingTag := "</g>"
|
||||||
if targetShape.Link != "" {
|
if targetShape.Link != "" {
|
||||||
|
|
||||||
|
|
@ -1011,7 +1012,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
drawClass(writer, diagramHash, targetShape)
|
drawClass(writer, diagramHash, targetShape, inlineTheme)
|
||||||
}
|
}
|
||||||
addAppendixItems(appendixWriter, targetShape, s)
|
addAppendixItems(appendixWriter, targetShape, s)
|
||||||
fmt.Fprint(writer, `</g>`)
|
fmt.Fprint(writer, `</g>`)
|
||||||
|
|
@ -1025,7 +1026,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
drawTable(writer, diagramHash, targetShape)
|
drawTable(writer, diagramHash, targetShape, inlineTheme)
|
||||||
}
|
}
|
||||||
addAppendixItems(appendixWriter, targetShape, s)
|
addAppendixItems(appendixWriter, targetShape, s)
|
||||||
fmt.Fprint(writer, `</g>`)
|
fmt.Fprint(writer, `</g>`)
|
||||||
|
|
@ -1034,7 +1035,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
case d2target.ShapeOval:
|
case d2target.ShapeOval:
|
||||||
if targetShape.DoubleBorder {
|
if targetShape.DoubleBorder {
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
fmt.Fprint(writer, renderDoubleOval(multipleTL, width, height, fill, "", stroke, style))
|
fmt.Fprint(writer, renderDoubleOval(multipleTL, width, height, fill, "", stroke, style, inlineTheme))
|
||||||
}
|
}
|
||||||
if sketchRunner != nil {
|
if sketchRunner != nil {
|
||||||
out, err := d2sketch.DoubleOval(sketchRunner, targetShape)
|
out, err := d2sketch.DoubleOval(sketchRunner, targetShape)
|
||||||
|
|
@ -1043,11 +1044,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprint(writer, renderDoubleOval(tl, width, height, fill, targetShape.FillPattern, stroke, style))
|
fmt.Fprint(writer, renderDoubleOval(tl, width, height, fill, targetShape.FillPattern, stroke, style, inlineTheme))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
fmt.Fprint(writer, renderOval(multipleTL, width, height, fill, "", stroke, style))
|
fmt.Fprint(writer, renderOval(multipleTL, width, height, fill, "", stroke, style, inlineTheme))
|
||||||
}
|
}
|
||||||
if sketchRunner != nil {
|
if sketchRunner != nil {
|
||||||
out, err := d2sketch.Oval(sketchRunner, targetShape)
|
out, err := d2sketch.Oval(sketchRunner, targetShape)
|
||||||
|
|
@ -1056,12 +1057,12 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprint(writer, renderOval(tl, width, height, fill, targetShape.FillPattern, stroke, style))
|
fmt.Fprint(writer, renderOval(tl, width, height, fill, targetShape.FillPattern, stroke, style, inlineTheme))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case d2target.ShapeImage:
|
case d2target.ShapeImage:
|
||||||
el := d2themes.NewThemableElement("image")
|
el := d2themes.NewThemableElement("image", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X)
|
el.X = float64(targetShape.Pos.X)
|
||||||
el.Y = float64(targetShape.Pos.Y)
|
el.Y = float64(targetShape.Pos.Y)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -1079,11 +1080,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
borderRadius = float64(targetShape.BorderRadius)
|
borderRadius = float64(targetShape.BorderRadius)
|
||||||
}
|
}
|
||||||
if targetShape.ThreeDee {
|
if targetShape.ThreeDee {
|
||||||
fmt.Fprint(writer, render3DRect(targetShape))
|
fmt.Fprint(writer, render3DRect(targetShape, inlineTheme))
|
||||||
} else {
|
} else {
|
||||||
if !targetShape.DoubleBorder {
|
if !targetShape.DoubleBorder {
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
el := d2themes.NewThemableElement("rect")
|
el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X + 10)
|
el.X = float64(targetShape.Pos.X + 10)
|
||||||
el.Y = float64(targetShape.Pos.Y - 10)
|
el.Y = float64(targetShape.Pos.Y - 10)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -1101,7 +1102,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
el := d2themes.NewThemableElement("rect")
|
el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X)
|
el.X = float64(targetShape.Pos.X)
|
||||||
el.Y = float64(targetShape.Pos.Y)
|
el.Y = float64(targetShape.Pos.Y)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -1115,7 +1116,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
el := d2themes.NewThemableElement("rect")
|
el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X + 10)
|
el.X = float64(targetShape.Pos.X + 10)
|
||||||
el.Y = float64(targetShape.Pos.Y - 10)
|
el.Y = float64(targetShape.Pos.Y - 10)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -1127,7 +1128,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
el.Rx = borderRadius
|
el.Rx = borderRadius
|
||||||
fmt.Fprint(writer, el.Render())
|
fmt.Fprint(writer, el.Render())
|
||||||
|
|
||||||
el = d2themes.NewThemableElement("rect")
|
el = d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X + 10 + d2target.INNER_BORDER_OFFSET)
|
el.X = float64(targetShape.Pos.X + 10 + d2target.INNER_BORDER_OFFSET)
|
||||||
el.Y = float64(targetShape.Pos.Y - 10 + d2target.INNER_BORDER_OFFSET)
|
el.Y = float64(targetShape.Pos.Y - 10 + d2target.INNER_BORDER_OFFSET)
|
||||||
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
|
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
|
||||||
|
|
@ -1145,7 +1146,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
el := d2themes.NewThemableElement("rect")
|
el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X)
|
el.X = float64(targetShape.Pos.X)
|
||||||
el.Y = float64(targetShape.Pos.Y)
|
el.Y = float64(targetShape.Pos.Y)
|
||||||
el.Width = float64(targetShape.Width)
|
el.Width = float64(targetShape.Width)
|
||||||
|
|
@ -1157,7 +1158,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
el.Rx = borderRadius
|
el.Rx = borderRadius
|
||||||
fmt.Fprint(writer, el.Render())
|
fmt.Fprint(writer, el.Render())
|
||||||
|
|
||||||
el = d2themes.NewThemableElement("rect")
|
el = d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
el.X = float64(targetShape.Pos.X + d2target.INNER_BORDER_OFFSET)
|
el.X = float64(targetShape.Pos.X + d2target.INNER_BORDER_OFFSET)
|
||||||
el.Y = float64(targetShape.Pos.Y + d2target.INNER_BORDER_OFFSET)
|
el.Y = float64(targetShape.Pos.Y + d2target.INNER_BORDER_OFFSET)
|
||||||
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
|
el.Width = float64(targetShape.Width - 2*d2target.INNER_BORDER_OFFSET)
|
||||||
|
|
@ -1172,11 +1173,11 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
case d2target.ShapeHexagon:
|
case d2target.ShapeHexagon:
|
||||||
if targetShape.ThreeDee {
|
if targetShape.ThreeDee {
|
||||||
fmt.Fprint(writer, render3DHexagon(targetShape))
|
fmt.Fprint(writer, render3DHexagon(targetShape, inlineTheme))
|
||||||
} else {
|
} else {
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
|
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
|
||||||
el := d2themes.NewThemableElement("path")
|
el := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
el.Fill = fill
|
el.Fill = fill
|
||||||
el.Stroke = stroke
|
el.Stroke = stroke
|
||||||
el.Style = style
|
el.Style = style
|
||||||
|
|
@ -1193,7 +1194,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
el := d2themes.NewThemableElement("path")
|
el := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
el.Fill = fill
|
el.Fill = fill
|
||||||
el.FillPattern = targetShape.FillPattern
|
el.FillPattern = targetShape.FillPattern
|
||||||
el.Stroke = stroke
|
el.Stroke = stroke
|
||||||
|
|
@ -1208,7 +1209,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
default:
|
default:
|
||||||
if targetShape.Multiple {
|
if targetShape.Multiple {
|
||||||
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
|
multiplePathData := shape.NewShape(shapeType, geo.NewBox(multipleTL, width, height)).GetSVGPathData()
|
||||||
el := d2themes.NewThemableElement("path")
|
el := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
el.Fill = fill
|
el.Fill = fill
|
||||||
el.Stroke = stroke
|
el.Stroke = stroke
|
||||||
el.Style = style
|
el.Style = style
|
||||||
|
|
@ -1225,7 +1226,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
}
|
}
|
||||||
fmt.Fprint(writer, out)
|
fmt.Fprint(writer, out)
|
||||||
} else {
|
} else {
|
||||||
el := d2themes.NewThemableElement("path")
|
el := d2themes.NewThemableElement("path", inlineTheme)
|
||||||
el.Fill = fill
|
el.Fill = fill
|
||||||
el.FillPattern = targetShape.FillPattern
|
el.FillPattern = targetShape.FillPattern
|
||||||
el.Stroke = stroke
|
el.Stroke = stroke
|
||||||
|
|
@ -1239,7 +1240,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
|
|
||||||
// // to examine shape's innerBox
|
// // to examine shape's innerBox
|
||||||
// innerBox := s.GetInnerBox()
|
// innerBox := s.GetInnerBox()
|
||||||
// el := d2themes.NewThemableElement("rect")
|
// el := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
// el.X = float64(innerBox.TopLeft.X)
|
// el.X = float64(innerBox.TopLeft.X)
|
||||||
// el.Y = float64(innerBox.TopLeft.Y)
|
// el.Y = float64(innerBox.TopLeft.Y)
|
||||||
// el.Width = float64(innerBox.Width)
|
// el.Width = float64(innerBox.Width)
|
||||||
|
|
@ -1347,7 +1348,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
fmt.Fprintf(writer, `<g transform="translate(%f %f)" class="%s"%s>`,
|
fmt.Fprintf(writer, `<g transform="translate(%f %f)" class="%s"%s>`,
|
||||||
box.TopLeft.X, box.TopLeft.Y, class, fontSize,
|
box.TopLeft.X, box.TopLeft.Y, class, fontSize,
|
||||||
)
|
)
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.Width = float64(targetShape.Width)
|
rectEl.Width = float64(targetShape.Width)
|
||||||
rectEl.Height = float64(targetShape.Height)
|
rectEl.Height = float64(targetShape.Height)
|
||||||
rectEl.Stroke = targetShape.Stroke
|
rectEl.Stroke = targetShape.Stroke
|
||||||
|
|
@ -1381,7 +1382,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return labelMask, err
|
return labelMask, err
|
||||||
}
|
}
|
||||||
gEl := d2themes.NewThemableElement("g")
|
gEl := d2themes.NewThemableElement("g", inlineTheme)
|
||||||
gEl.SetTranslate(float64(box.TopLeft.X), float64(box.TopLeft.Y))
|
gEl.SetTranslate(float64(box.TopLeft.X), float64(box.TopLeft.Y))
|
||||||
gEl.Color = targetShape.Stroke
|
gEl.Color = targetShape.Stroke
|
||||||
gEl.Content = render
|
gEl.Content = render
|
||||||
|
|
@ -1397,7 +1398,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
// we need the self closing form in this svg/xhtml context
|
// we need the self closing form in this svg/xhtml context
|
||||||
render = strings.ReplaceAll(render, "<hr>", "<hr />")
|
render = strings.ReplaceAll(render, "<hr>", "<hr />")
|
||||||
|
|
||||||
mdEl := d2themes.NewThemableElement("div")
|
mdEl := d2themes.NewThemableElement("div", inlineTheme)
|
||||||
mdEl.ClassName = "md"
|
mdEl.ClassName = "md"
|
||||||
mdEl.Content = render
|
mdEl.Content = render
|
||||||
|
|
||||||
|
|
@ -1420,7 +1421,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
fmt.Fprint(writer, `</foreignObject></g>`)
|
fmt.Fprint(writer, `</foreignObject></g>`)
|
||||||
} else {
|
} else {
|
||||||
if targetShape.LabelFill != "" {
|
if targetShape.LabelFill != "" {
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.X = labelTL.X
|
rectEl.X = labelTL.X
|
||||||
rectEl.Y = labelTL.Y
|
rectEl.Y = labelTL.Y
|
||||||
rectEl.Width = float64(targetShape.LabelWidth)
|
rectEl.Width = float64(targetShape.LabelWidth)
|
||||||
|
|
@ -1428,7 +1429,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
|
||||||
rectEl.Fill = targetShape.LabelFill
|
rectEl.Fill = targetShape.LabelFill
|
||||||
fmt.Fprint(writer, rectEl.Render())
|
fmt.Fprint(writer, rectEl.Render())
|
||||||
}
|
}
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = labelTL.X + float64(targetShape.LabelWidth)/2
|
textEl.X = labelTL.X + float64(targetShape.LabelWidth)/2
|
||||||
// text is vertically positioned at its baseline which is at labelTL+FontSize
|
// text is vertically positioned at its baseline which is at labelTL+FontSize
|
||||||
textEl.Y = labelTL.Y + float64(targetShape.FontSize)
|
textEl.Y = labelTL.Y + float64(targetShape.FontSize)
|
||||||
|
|
@ -1881,9 +1882,15 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
|
||||||
|
|
||||||
var labelMasks []string
|
var labelMasks []string
|
||||||
markers := map[string]struct{}{}
|
markers := map[string]struct{}{}
|
||||||
|
// We only want to inline when no dark theme is specified, otherwise the inline style will override the CSS
|
||||||
|
var inlineTheme *d2themes.Theme
|
||||||
|
if darkThemeID != nil {
|
||||||
|
inlineTheme = go2.Pointer(d2themescatalog.Find(themeID))
|
||||||
|
inlineTheme.ApplyOverrides(opts.ThemeOverrides)
|
||||||
|
}
|
||||||
for _, obj := range allObjects {
|
for _, obj := range allObjects {
|
||||||
if c, is := obj.(d2target.Connection); is {
|
if c, is := obj.(d2target.Connection); is {
|
||||||
labelMask, err := drawConnection(buf, isolatedDiagramHash, c, markers, idToShape, sketchRunner)
|
labelMask, err := drawConnection(buf, isolatedDiagramHash, c, markers, idToShape, sketchRunner, inlineTheme)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -1891,7 +1898,7 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
|
||||||
labelMasks = append(labelMasks, labelMask)
|
labelMasks = append(labelMasks, labelMask)
|
||||||
}
|
}
|
||||||
} else if s, is := obj.(d2target.Shape); is {
|
} else if s, is := obj.(d2target.Shape); is {
|
||||||
labelMask, err := drawShape(buf, appendixItemBuf, diagramHash, s, sketchRunner)
|
labelMask, err := drawShape(buf, appendixItemBuf, diagramHash, s, sketchRunner, inlineTheme)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if labelMask != "" {
|
} else if labelMask != "" {
|
||||||
|
|
@ -1955,7 +1962,7 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) {
|
||||||
top -= int(math.Ceil(float64(diagram.Root.StrokeWidth) / 2.))
|
top -= int(math.Ceil(float64(diagram.Root.StrokeWidth) / 2.))
|
||||||
w += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
|
w += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
|
||||||
h += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
|
h += int(math.Ceil(float64(diagram.Root.StrokeWidth)/2.) * 2.)
|
||||||
backgroundEl := d2themes.NewThemableElement("rect")
|
backgroundEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
// We don't want to change the document viewbox, only the background el
|
// We don't want to change the document viewbox, only the background el
|
||||||
backgroundEl.X = float64(left)
|
backgroundEl.X = float64(left)
|
||||||
backgroundEl.Y = float64(top)
|
backgroundEl.Y = float64(top)
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,8 @@ func clipPathForBorderRadius(diagramHash string, shape d2target.Shape) string {
|
||||||
return out + `fill="none" /> </clipPath>`
|
return out + `fill="none" /> </clipPath>`
|
||||||
}
|
}
|
||||||
|
|
||||||
func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64) string {
|
func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text string, textWidth, textHeight, fontSize float64, inlineTheme *d2themes.Theme) string {
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
|
rectEl.X, rectEl.Y = box.TopLeft.X, box.TopLeft.Y
|
||||||
rectEl.Width, rectEl.Height = box.Width, box.Height
|
rectEl.Width, rectEl.Height = box.Width, box.Height
|
||||||
rectEl.Fill = shape.Fill
|
rectEl.Fill = shape.Fill
|
||||||
|
|
@ -61,7 +61,7 @@ func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
|
||||||
textHeight,
|
textHeight,
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = tl.X
|
textEl.X = tl.X
|
||||||
textEl.Y = tl.Y + textHeight*3/4
|
textEl.Y = tl.Y + textHeight*3/4
|
||||||
textEl.Fill = shape.GetFontColor()
|
textEl.Fill = shape.GetFontColor()
|
||||||
|
|
@ -75,7 +75,7 @@ func tableHeader(diagramHash string, shape d2target.Shape, box *geo.Box, text st
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraintText string, fontSize, longestNameWidth, longestTypeWidth float64) string {
|
func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraintText string, fontSize, longestNameWidth, longestTypeWidth float64, inlineTheme *d2themes.Theme) string {
|
||||||
// Row is made up of name, type, and constraint
|
// Row is made up of name, type, and constraint
|
||||||
// e.g. | diagram int FK |
|
// e.g. | diagram int FK |
|
||||||
nameTL := label.InsideMiddleLeft.GetPointOnBox(
|
nameTL := label.InsideMiddleLeft.GetPointOnBox(
|
||||||
|
|
@ -85,7 +85,7 @@ func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraint
|
||||||
fontSize,
|
fontSize,
|
||||||
)
|
)
|
||||||
|
|
||||||
textEl := d2themes.NewThemableElement("text")
|
textEl := d2themes.NewThemableElement("text", inlineTheme)
|
||||||
textEl.X = nameTL.X
|
textEl.X = nameTL.X
|
||||||
textEl.Y = nameTL.Y + fontSize*3/4
|
textEl.Y = nameTL.Y + fontSize*3/4
|
||||||
textEl.Fill = shape.PrimaryAccentColor
|
textEl.Fill = shape.PrimaryAccentColor
|
||||||
|
|
@ -108,8 +108,8 @@ func tableRow(shape d2target.Shape, box *geo.Box, nameText, typeText, constraint
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape) {
|
func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape, inlineTheme *d2themes.Theme) {
|
||||||
rectEl := d2themes.NewThemableElement("rect")
|
rectEl := d2themes.NewThemableElement("rect", inlineTheme)
|
||||||
rectEl.X = float64(targetShape.Pos.X)
|
rectEl.X = float64(targetShape.Pos.X)
|
||||||
rectEl.Y = float64(targetShape.Pos.Y)
|
rectEl.Y = float64(targetShape.Pos.Y)
|
||||||
rectEl.Width = float64(targetShape.Width)
|
rectEl.Width = float64(targetShape.Width)
|
||||||
|
|
@ -134,7 +134,7 @@ func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape)
|
||||||
|
|
||||||
fmt.Fprint(writer,
|
fmt.Fprint(writer,
|
||||||
tableHeader(diagramHash, targetShape, headerBox, targetShape.Label,
|
tableHeader(diagramHash, targetShape, headerBox, targetShape.Label,
|
||||||
float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)),
|
float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize), inlineTheme),
|
||||||
)
|
)
|
||||||
|
|
||||||
var longestNameWidth int
|
var longestNameWidth int
|
||||||
|
|
@ -148,11 +148,11 @@ func drawTable(writer io.Writer, diagramHash string, targetShape d2target.Shape)
|
||||||
rowBox.TopLeft.Y += headerBox.Height
|
rowBox.TopLeft.Y += headerBox.Height
|
||||||
for idx, f := range targetShape.Columns {
|
for idx, f := range targetShape.Columns {
|
||||||
fmt.Fprint(writer,
|
fmt.Fprint(writer,
|
||||||
tableRow(targetShape, rowBox, f.Name.Label, f.Type.Label, f.ConstraintAbbr(), float64(targetShape.FontSize), float64(longestNameWidth), float64(longestTypeWidth)),
|
tableRow(targetShape, rowBox, f.Name.Label, f.Type.Label, f.ConstraintAbbr(), float64(targetShape.FontSize), float64(longestNameWidth), float64(longestTypeWidth), inlineTheme),
|
||||||
)
|
)
|
||||||
rowBox.TopLeft.Y += rowHeight
|
rowBox.TopLeft.Y += rowHeight
|
||||||
|
|
||||||
lineEl := d2themes.NewThemableElement("line")
|
lineEl := d2themes.NewThemableElement("line", inlineTheme)
|
||||||
if idx == len(targetShape.Columns)-1 && targetShape.BorderRadius != 0 {
|
if idx == len(targetShape.Columns)-1 && targetShape.BorderRadius != 0 {
|
||||||
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
lineEl.X1, lineEl.Y1 = rowBox.TopLeft.X+float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
||||||
lineEl.X2, lineEl.Y2 = rowBox.TopLeft.X+rowBox.Width-float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
lineEl.X2, lineEl.Y2 = rowBox.TopLeft.X+rowBox.Width-float64(targetShape.BorderRadius), rowBox.TopLeft.Y
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ type ThemableElement struct {
|
||||||
FillPattern string
|
FillPattern string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewThemableElement(tag string) *ThemableElement {
|
func NewThemableElement(tag string, inlineTheme *Theme) *ThemableElement {
|
||||||
xmlns := ""
|
xmlns := ""
|
||||||
if tag == "div" {
|
if tag == "div" {
|
||||||
xmlns = "http://www.w3.org/1999/xhtml"
|
xmlns = "http://www.w3.org/1999/xhtml"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue