From d8a0279d3aaa9e74a4e8f7d861926e56392231f0 Mon Sep 17 00:00:00 2001 From: Bernard Xie Date: Wed, 29 Mar 2023 12:59:57 -0700 Subject: [PATCH] fix animated --- d2renderers/d2animate/d2animate.go | 2 +- d2target/class.go | 6 +- d2target/d2target.go | 57 +++++++++++++++++- d2target/sqltable.go | 3 +- .../testdata/TestCLI_E2E/animation.exp.svg | 4 +- .../TestCLI_E2E/internal_linked_pdf.exp.pdf | Bin 81770 -> 81770 bytes 6 files changed, 63 insertions(+), 9 deletions(-) diff --git a/d2renderers/d2animate/d2animate.go b/d2renderers/d2animate/d2animate.go index cacda6194..d428b1eb2 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.GetUniqueChars()) + d2svg.EmbedFonts(buf, diagramHash, svgsStr, rootDiagram.FontFamily, rootDiagram.GetNestedUniqueChars()) themeStylesheet, err := d2svg.ThemeCSS(diagramHash, renderOpts.ThemeID, renderOpts.DarkThemeID) if err != nil { diff --git a/d2target/class.go b/d2target/class.go index f72b532e2..202edf60c 100644 --- a/d2target/class.go +++ b/d2target/class.go @@ -44,8 +44,9 @@ func (cf ClassField) VisibilityToken() string { } } -func (cf ClassField) GetUniqueChars(uniqueMap map[rune]bool) 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 @@ -82,8 +83,9 @@ func (cm ClassMethod) VisibilityToken() string { } } -func (cm ClassMethod) GetUniqueChars(uniqueMap map[rune]bool) string { +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 diff --git a/d2target/d2target.go b/d2target/d2target.go index 2f4f4444e..dbf6efdc0 100644 --- a/d2target/d2target.go +++ b/d2target/d2target.go @@ -237,6 +237,42 @@ func (diagram Diagram) BoundingBox() (topLeft, bottomRight Point) { return Point{x1, y1}, Point{x2, y2} } +func (diagram Diagram) GetNestedUniqueChars() string { + var uniqueChars string + uniqueMap := make(map[rune]bool) + for _, char := range diagram.GetUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } + for _, d := range diagram.Layers { + for _, char := range d.GetNestedUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } + } + for _, d := range diagram.Scenarios { + for _, char := range d.GetNestedUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } + } + for _, d := range diagram.Steps { + for _, char := range d.GetNestedUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } + } + return uniqueChars +} + func (diagram Diagram) GetUniqueChars() string { var uniqueChars string uniqueMap := make(map[rune]bool) @@ -261,15 +297,30 @@ func (diagram Diagram) GetUniqueChars() string { } if s.Type == ShapeClass { for _, cf := range s.Fields { - uniqueChars = uniqueChars + cf.GetUniqueChars(uniqueMap) + for _, char := range cf.GetUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } } for _, cm := range s.Methods { - uniqueChars = uniqueChars + cm.GetUniqueChars(uniqueMap) + for _, char := range cm.GetUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } } } if s.Type == ShapeSQLTable { for _, c := range s.Columns { - uniqueChars = uniqueChars + c.GetUniqueChars(uniqueMap) + for _, char := range c.GetUniqueChars() { + if _, exists := uniqueMap[char]; !exists { + uniqueMap[char] = true + uniqueChars = uniqueChars + string(char) + } + } } } } diff --git a/d2target/sqltable.go b/d2target/sqltable.go index c779222cf..342951b1b 100644 --- a/d2target/sqltable.go +++ b/d2target/sqltable.go @@ -55,8 +55,9 @@ func (c SQLColumn) ConstraintAbbr() string { } } -func (c SQLColumn) GetUniqueChars(uniqueMap map[rune]bool) string { +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 diff --git a/e2etests-cli/testdata/TestCLI_E2E/animation.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/animation.exp.svg index 2ec3e2f90..f7ba04200 100644 --- a/e2etests-cli/testdata/TestCLI_E2E/animation.exp.svg +++ b/e2etests-cli/testdata/TestCLI_E2E/animation.exp.svg @@ -4,14 +4,14 @@ } @font-face { font-family: d2-1015877328-font-regular; - src: url("data:application/font-woff;base64,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"); + src: url("data:application/font-woff;base64,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"); } .d2-1015877328 .text-bold { font-family: "d2-1015877328-font-bold"; } @font-face { font-family: d2-1015877328-font-bold; - src: url("data:application/font-woff;base64,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"); + src: url("data:application/font-woff;base64,d09GRgABAAAAAAusAAoAAAAAEggAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXxHXrmNtYXAAAAFUAAAAkQAAAMADlQPeZ2x5ZgAAAegAAAVpAAAG4Mx7UqRoZWFkAAAHVAAAADYAAAA2G38e1GhoZWEAAAeMAAAAJAAAACQKfwXXaG10eAAAB7AAAABgAAAAYC0lA+5sb2NhAAAIEAAAADIAAAAyFv4VQm1heHAAAAhEAAAAIAAAACAAMAD3bmFtZQAACGQAAAMoAAAIKgjwVkFwb3N0AAALjAAAAB0AAAAg/9EAMgADAioCvAAFAAACigJYAAAASwKKAlgAAAFeADIBKQAAAgsHAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPACAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAfAClAAAACAAA3icfM1NSgIBAIbhZ5rpf5qmv2206xzRukNEBEURUUR0lkod9A5u9ShewCt8guDCje/2WbwolArUKh0utUqNK9du3Lpz79GzV+8+ffn2k7DmD568ePOx8swyzzSTjDPKMF0G6aeX//zld3nbVOHCllJl245de/YdOFQ70jjWOnHqzDkLAAAA//8BAAD//y9UJ1sAAAB4nFyUW2wbWRnHv3M8nhM7TpzxeGZsx/cTz9i5OI3H9jTNxXVuTrrOXUl22SZZohW7q7RJ1U3ZsELaF7qC3VQVOEiFAC0SSCC1lSpeoCggkGiRmre29IVLESivtVCEaOWM0dhuk/bBsh+s7/v//v//+cAMUwB4BW+DCSxgBwcIACoX4iKqolCiqZpGJZOmII5MYYf+858pMSYWY1qD1wKfLi+j8SW8fXju3fGVlf8u9/ToP/nNXf0K+vguAC6/AMCDeAsswAHwRFVkWaEsa+JVniqU7Dd9aW9obmBs7hd7d/Z+FL0fRWd6e7vW1OR5/TLeOtzY2QEAQBAvH+AT+Bo0A5jDspxKptNqQpSILNMwywpOUU2kNYlFizNfzM5dmcm8H5pwa7R9rG1+NJpxTczY8t8/f+4H02p4SfIllgbev9DiPvseIBgHwLfwFgQMXpUXRUlNpzVe5aixQqOEUEWhfiwI4z/9yOqwMlbO+sGNz4nFxKQWpxeTDFNH8Jb+d2+/39/vReHDjWfByanAzvPnO4GpyeAzAAyt5QP0CJXADRRAChvitYpuolQoBI4anmiJtJaqsPxuaOpbBUxjgdMtqc7VU8tf27QygVydO8JP9AZsC5mJt+0hxSV81deydlH/t+qlFyV+wdrmc0kVr1rKB2gXlcDzplc0fOQUi9zD69nRrw/Fc95hGkxlMidccf5UZN7Wd2lmdqPPLy378tnT44L9vWCzkQEGpXyASngXeAi+5KgMVlLqMQK5tuY/Z9d7lpOxk262sGllPCPYpTj4NidNd9q+/Mb0pX6vK//Lw8EuD910uh84GgdzY8OAK9r/iUrgMhI5pl4UnCwJiaKaMLSb1KSxBQVyFwcGz/XkFjsZrD+xjnSl0l3y0g9/pbSH07b+jZnpjUxmdYiPWNJq6B2PH52KpTqrfcoaQHgXnJXcBfIyCK4ymHDZAvG+lZgeK/iC3qgL7958x922uqjvoVA66pb0O1AugwYAf8MPsQwiABCQ4ItXs/14F2yV2ZyqqYSnChGyV5kf37j92+sXMnhXX/vTnv7XP+Q+Nf5fPkAOvAv2qqucyr0K6c/5ngJnMRPWYYvY3n0L08MnkgOh82bykgGVagxGcd9g2LQywfFXEKiY8Xe8xlD1GxNUAvsbL8vwm1US6VSyFicSM+tDQ+uZzNrQ0FqmIx7viHd01LrStzE7c6nvk/HT2bxRGWNutjyKRVQCHvwA0pE6J8vSsKxIAm/MpmEiiKKh0zemfOXD3uV0sNdjnpTT822tzuiv8S+6PPQ7H89tZprdk99FLSP5zzseOBprHqOrqASO4+y1c1Alb87LgtfqanA3efucqLiQ6DKbP2OYWEJ/CgiE8gG6jkqgVDxXNKNZBqysxHEqeTRMcIqSHwtO9mHXB/JAOBMI+X1xj78n+tFc90JgwJP0dHfLwb7YhzY5cNbdLPGcyFttLd2x4XnF9bZTVFzuxnraHR9crPaut3yA/oeKRmavZc3VntBfpscK/qBXFgub9abAGdvqIkrq/0jFPD40qjcNR9oBgQsAF1ERQgCqSZVqN0s79stEa3eWkO1vfu8Ea2UZ0mDRPjtpsROGWEjntz+52UEaCEPqSTsq7kdGZfkM3a98j0b29aZ7dCQaHaH3Kppt5X50iIpGQ4680rTjq02NeFMM2T3EUReJWsnvt3P1DitTx1l6r9yUTk7+kWUuIHOLz4P+9Tg8EqE5+liv759rrXqSRyvwFN8GMwCvKCohaz7zttmHVu5fvny/mjU8QkUwVd9TtoCKehOg8i3cDbP4IdQDcJVrVC1YJB6PROJx3N1Kaavxgf8DAAD//wEAAP//VmN0NQAAAAABAAAAAguFYS7IJ18PPPUAAQPoAAAAANhdoIQAAAAA3WYvNv43/sQIbQPxAAEAAwACAAAAAAAAAAEAAAPY/u8AAAiY/jf+NwhtAAEAAAAAAAAAAAAAAAAAAAAYArIAUADIAAACPf/6AkYALgL6AE0CDwAqAdMAJAI9ACcCBgAkAjsAQQEUADcCJABBAR4AQQI8AEECKwAkAj0AQQGOAEEBuwAVAjgAPAMIABgCCQAMASwATAEUAEEAAP+tAAAALAAsAFAAfACuAOYBEgFEAXgBmgGmAb4B2gH8AigCWAJ4ArQC1gMOAz4DTgNaA3AAAAABAAAAGACQAAwAYwAHAAEAAAAAAAAAAAAAAAAABAADeJyclM9uG1UUxn9ObNMKwQJFVbqJ7oJFkejYVEnVNiuH1IpFFAePC0JCSBPP+I8ynhl5Jg7hCVjzFrxFVzwEz4FYo/l87NgF0SaKknx37vnznXO+c4Ed/mabSvUh8Ec9MVxhr35ueIsH9RPD27TrW4arPKn9abhGWJsbrvN5rWf4I95WfzP8gP3qT4YfslttG/6YZ9Udw59sO/4y/Cn7vF3gCrzgV8MVdskMb7HDj4a3eYTFrFR5RNNwjc/YM1xnD+gzoSBmQsIIx5AJI66YEZHjEzFjwpCIEEeHFjGFviYEQo7Rf34N8CmYESjimAJHjE9MQM7YIv4ir5RzZRzqNLO7FgVjAi7kcUlAgiNlREpCxKXiFBRkvKJBg5yB+GYU5HjkTIjxSJkxokGXNqf0GTMhx9FWpJKZT8qQgmsC5XdmUXZmQERCbqyuSAjF04lfJO8Opzi6ZLJdj3y6EeFLHN/Ju+SWyvYrPP26NWabeZdsAubqZ6yuxLq51gTHui3ztvhWuOAV7l792WTy/h6F+l8o8gVXmn+oSSVikuDcLi18Kch3j3Ec6dzBV0e+p0OfE7q8oa9zix49WpzRp8Nr+Xbp4fiaLmccy6MjvLhrSzFn/IDjGzqyKWNH1p/FxCJ+JjN15+I4Ux1TMvW8ZO6p1kgV3n3C5Q6lG+rI5TPQHpWWTvNLtGcBI1NFJoZT9XKpjdz6F5oipqqlnO3tfbkNc9u95RbfkGqHS7UuOJWTWzB631S9dzRzrR+PgJCUC1kMSJnSoOBGvM8JuCLGcazunWhLClornzLPjVQSMRWDDonizMj0NzDd+MZ9sKF7Z29JKP+S6eWqqvtkcerV7YzeqHvLO9+6HK1NoGFTTdfUNBDXxLQfaafW+fvyzfW6pTzliJSY8F8vwDM8muxzwCFjZRjoZm6vQ1MvRJOXHKr6SyJZDaXnyCIc4PGcAw54yfN3+rhk4oyLW3FZz93imCO6HH5QFQv7Lke8Xn37/6y/i2lTtTierk4v7j3FJ3dQ6xfas9v3sqeJlZOYW7TbrTgjYFpycbvrNbnHeP8AAAD//wEAAP//9LdPUXicYmBmAIP/5xiMGLAAAAAAAP//AQAA//8vAQIDAAAA"); }]]>