diff --git a/d2renderers/d2animate/d2animate.go b/d2renderers/d2animate/d2animate.go index d428b1eb2..b2f1b3074 100644 --- a/d2renderers/d2animate/d2animate.go +++ b/d2renderers/d2animate/d2animate.go @@ -74,7 +74,7 @@ func Wrap(rootDiagram *d2target.Diagram, svgs [][]byte, renderOpts d2svg.RenderO return nil, err } - d2svg.EmbedFonts(buf, diagramHash, svgsStr, rootDiagram.FontFamily, rootDiagram.GetNestedUniqueChars()) + d2svg.EmbedFonts(buf, diagramHash, svgsStr, rootDiagram.FontFamily, rootDiagram.GetNestedCorpus()) themeStylesheet, err := d2svg.ThemeCSS(diagramHash, renderOpts.ThemeID, renderOpts.DarkThemeID) if err != nil { diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 8f3df93b3..a8e50d979 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -33,9 +33,18 @@ func (f FontFamily) Font(size int, style FontStyle) Font { } func (f Font) GetEncodedSubset(corpus string) string { + var uniqueChars string + uniqueMap := make(map[rune]bool) + for _, char := range corpus { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } + fontBuf := make([]byte, len(FontFaces[f])) copy(fontBuf, FontFaces[f]) - fontBuf = gofpdf.UTF8CutFont(fontBuf, corpus) + fontBuf = gofpdf.UTF8CutFont(fontBuf, uniqueChars) fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index c737ef29c..a2f158756 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -1727,7 +1727,7 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) { // generate style elements that will be appended to the SVG tag upperBuf := &bytes.Buffer{} if opts.MasterID == "" { - EmbedFonts(upperBuf, diagramHash, buf.String(), diagram.FontFamily, diagram.GetUniqueChars()) // EmbedFonts *must* run before `d2sketch.DefineFillPatterns`, but after all elements are appended to `buf` + EmbedFonts(upperBuf, diagramHash, buf.String(), diagram.FontFamily, diagram.GetCorpus()) // EmbedFonts *must* run before `d2sketch.DefineFillPatterns`, but after all elements are appended to `buf` themeStylesheet, err := ThemeCSS(diagramHash, themeID, darkThemeID) if err != nil { return nil, err diff --git a/d2target/class.go b/d2target/class.go index 202edf60c..c08f11144 100644 --- a/d2target/class.go +++ b/d2target/class.go @@ -44,18 +44,6 @@ func (cf ClassField) VisibilityToken() string { } } -func (cf ClassField) GetUniqueChars() string { - var uniqueChars string - uniqueMap := make(map[rune]bool) - for _, char := range fmt.Sprintf("%s%s%s", cf.VisibilityToken(), cf.Name, cf.Type) { - if _, exists := uniqueMap[char]; !exists { - uniqueMap[char] = true - uniqueChars = uniqueChars + string(char) - } - } - return uniqueChars -} - type ClassMethod struct { Name string `json:"name"` Return string `json:"return"` @@ -82,15 +70,3 @@ func (cm ClassMethod) VisibilityToken() string { return "+" } } - -func (cm ClassMethod) GetUniqueChars() string { - var uniqueChars string - uniqueMap := make(map[rune]bool) - for _, char := range fmt.Sprintf("%s%s%s", cm.VisibilityToken(), cm.Name, cm.Return) { - if _, exists := uniqueMap[char]; !exists { - uniqueMap[char] = true - uniqueChars = uniqueChars + string(char) - } - } - return uniqueChars -} diff --git a/d2target/d2target.go b/d2target/d2target.go index 4123afb4d..882f307d7 100644 --- a/d2target/d2target.go +++ b/d2target/d2target.go @@ -237,61 +237,47 @@ func (diagram Diagram) BoundingBox() (topLeft, bottomRight Point) { return Point{x1, y1}, Point{x2, y2} } -func (diagram Diagram) GetNestedUniqueChars() string { - chars := diagram.GetUniqueChars() +func (diagram Diagram) GetNestedCorpus() string { + corpus := diagram.GetCorpus() for _, d := range diagram.Layers { - chars = chars + d.GetNestedUniqueChars() + corpus += d.GetNestedCorpus() } for _, d := range diagram.Scenarios { - chars = chars + d.GetNestedUniqueChars() + corpus += d.GetNestedCorpus() } for _, d := range diagram.Steps { - chars = chars + d.GetNestedUniqueChars() + corpus += d.GetNestedCorpus() } - var uniqueChars string - uniqueMap := make(map[rune]bool) - for _, char := range chars { - if _, exists := uniqueMap[char]; !exists { - uniqueMap[char] = true - uniqueChars = uniqueChars + string(char) - } - } - return uniqueChars + return corpus } -func (diagram Diagram) GetUniqueChars() string { - var chars string +func (diagram Diagram) GetCorpus() string { + var corpus string for _, s := range diagram.Shapes { - chars = chars + s.Label + s.Tooltip + s.Link + corpus += s.Label + s.Tooltip + s.Link if s.Type == ShapeClass { for _, cf := range s.Fields { - chars = chars + cf.GetUniqueChars() + corpus += cf.Text(0).Text + cf.VisibilityToken() } for _, cm := range s.Methods { - chars = chars + cm.GetUniqueChars() + corpus += cm.Text(0).Text + cm.VisibilityToken() } } if s.Type == ShapeSQLTable { for _, c := range s.Columns { - chars = chars + c.GetUniqueChars() + for _, t := range c.Texts(0) { + corpus = corpus + t.Text + } + corpus += c.ConstraintAbbr() } } } for _, c := range diagram.Connections { - chars = chars + c.Label + corpus += c.Label } - var uniqueChars string - uniqueMap := make(map[rune]bool) - for _, char := range chars { - if _, exists := uniqueMap[char]; !exists { - uniqueMap[char] = true - uniqueChars = uniqueChars + string(char) - } - } - - return uniqueChars + return corpus } func NewDiagram() *Diagram { diff --git a/d2target/sqltable.go b/d2target/sqltable.go index 342951b1b..6ffbddf05 100644 --- a/d2target/sqltable.go +++ b/d2target/sqltable.go @@ -1,7 +1,5 @@ package d2target -import "fmt" - const ( NamePadding = 10 TypePadding = 20 @@ -54,15 +52,3 @@ func (c SQLColumn) ConstraintAbbr() string { return "" } } - -func (c SQLColumn) GetUniqueChars() string { - var uniqueChars string - uniqueMap := make(map[rune]bool) - for _, char := range fmt.Sprintf("%s%s%s", c.Name.Label, c.Type.Label, c.ConstraintAbbr()) { - if _, exists := uniqueMap[char]; !exists { - uniqueMap[char] = true - uniqueChars = uniqueChars + string(char) - } - } - return uniqueChars -}