From 48a74726671fb7f1218bbe5ad7d0ccd0d1a50b60 Mon Sep 17 00:00:00 2001 From: Bernard Xie Date: Mon, 27 Mar 2023 19:19:12 -0700 Subject: [PATCH] add and fix utf8cutfont --- d2renderers/d2fonts/d2fonts.go | 4 +- d2renderers/d2fonts/d2fonts_test.go | 4 +- .../d2fonts/testdata/d2fonts/cut.exp.txt | Bin 4996 -> 4904 bytes .../testdata/all_shapes/sketch.exp.svg | 2 +- .../testdata/all_shapes_dark/sketch.exp.svg | 2 +- .../d2sketch/testdata/animated/sketch.exp.svg | 4 +- .../testdata/animated_dark/sketch.exp.svg | 4 +- .../testdata/arrowheads/sketch.exp.svg | 4 +- .../testdata/arrowheads_dark/sketch.exp.svg | 4 +- .../d2sketch/testdata/basic/sketch.exp.svg | 2 +- .../testdata/basic_dark/sketch.exp.svg | 2 +- .../testdata/child_to_child/sketch.exp.svg | 4 +- .../child_to_child_dark/sketch.exp.svg | 4 +- .../d2sketch/testdata/class/sketch.exp.svg | 2 +- .../sketch.exp.svg | 4 +- .../testdata/class_dark/sketch.exp.svg | 2 +- .../testdata/connection_label/sketch.exp.svg | 4 +- .../connection_label_dark/sketch.exp.svg | 4 +- .../testdata/crows_feet/sketch.exp.svg | 2 +- .../testdata/crows_feet_dark/sketch.exp.svg | 2 +- .../d2sketch/testdata/dots-3d/sketch.exp.svg | 2 +- .../d2sketch/testdata/dots-all/sketch.exp.svg | 2 +- .../testdata/dots-multiple/sketch.exp.svg | 2 +- .../testdata/dots-real/sketch.exp.svg | 4 +- .../testdata/double-border/sketch.exp.svg | 4 +- .../testdata/elk_corners/sketch.exp.svg | 2 +- .../d2sketch/testdata/opacity/sketch.exp.svg | 6 +- .../testdata/opacity_dark/sketch.exp.svg | 6 +- .../d2sketch/testdata/overlay/sketch.exp.svg | 2 +- .../testdata/paper-real/sketch.exp.svg | 4 +- .../testdata/root-fill/sketch.exp.svg | 4 +- .../testdata/sql_tables/sketch.exp.svg | 2 +- .../testdata/sql_tables_dark/sketch.exp.svg | 2 +- .../d2sketch/testdata/terminal/sketch.exp.svg | 4 +- .../d2sketch/testdata/twitter/sketch.exp.svg | 6 +- .../testdata/twitter_dark/sketch.exp.svg | 6 +- .../diagram_wider_than_tooltip/sketch.exp.svg | 4 +- .../appendix/testdata/links/sketch.exp.svg | 2 +- .../testdata/links_dark/sketch.exp.svg | 2 +- .../testdata/tooltip_fill/sketch.exp.svg | 2 +- .../tooltip_wider_than_diagram/sketch.exp.svg | 2 +- .../testdata/all_shapes/dark_theme.exp.svg | 2 +- .../testdata/animated/dark_theme.exp.svg | 4 +- .../testdata/arrowheads/dark_theme.exp.svg | 4 +- .../testdata/basic/dark_theme.exp.svg | 2 +- .../child_to_child/dark_theme.exp.svg | 4 +- .../testdata/class/dark_theme.exp.svg | 2 +- .../testdata/code/dark_theme.exp.svg | 8 +- .../connection_label/dark_theme.exp.svg | 4 +- .../testdata/opacity/dark_theme.exp.svg | 6 +- .../testdata/overlay/dark_theme.exp.svg | 2 +- .../testdata/sql_tables/dark_theme.exp.svg | 2 +- .../testdata/twitter/dark_theme.exp.svg | 6 +- .../testdata/TestCLI_E2E/abspath.exp.svg | 2 +- .../testdata/TestCLI_E2E/animation.exp.svg | 4 +- .../testdata/TestCLI_E2E/center.exp.svg | 2 +- .../TestCLI_E2E/hello_world_png.exp.png | Bin 15387 -> 15366 bytes .../TestCLI_E2E/hello_world_png_pad.exp.png | Bin 73590 -> 73552 bytes .../hello_world_png_sketch.exp.png | Bin 28841 -> 28757 bytes .../TestCLI_E2E/internal_linked_pdf.exp.pdf | Bin 81770 -> 81313 bytes .../TestCLI_E2E/multiboard/life/index.exp.svg | 2 +- .../multiboard/life/layers/broker.exp.svg | 2 +- .../multiboard/life/layers/core.exp.svg | 2 +- .../multiboard/life/layers/stocks.exp.svg | 2 +- .../multiboard/life/scenarios/why.exp.svg | 2 +- .../multiboard/life_index_d2/index.exp.svg | 2 +- .../life_index_d2/layers/broker.exp.svg | 2 +- .../life_index_d2/layers/core.exp.svg | 2 +- .../life_index_d2/layers/stocks.exp.svg | 2 +- .../life_index_d2/scenarios/why.exp.svg | 2 +- .../testdata/TestCLI_E2E/stdin.exp.svg | 2 +- e2etests/regression_test.go | 11 +- .../empty-markdown/dagre/sketch.exp.svg | 2 +- .../testdata/patterns/3d/dagre/sketch.exp.svg | 2 +- .../patterns/all_shapes/dagre/sketch.exp.svg | 2 +- .../patterns/multiple/dagre/sketch.exp.svg | 2 +- .../patterns/paper/dagre/sketch.exp.svg | 2 +- .../patterns/real-lines/dagre/sketch.exp.svg | 6 +- .../patterns/real/dagre/sketch.exp.svg | 4 +- .../root-dots-with-fill/dagre/sketch.exp.svg | 2 +- .../patterns/root-dots/dagre/sketch.exp.svg | 2 +- .../patterns/shape/dagre/sketch.exp.svg | 2 +- .../ampersand-escape/dagre/sketch.exp.svg | 2 +- .../ampersand-escape/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 6 +- .../elk/sketch.exp.svg | 6 +- .../dagre-disconnect/dagre/sketch.exp.svg | 6 +- .../dagre-disconnect/elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 6 +- .../dagre_broken_arrowhead/elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 6 +- .../elk/sketch.exp.svg | 6 +- .../dagre_special_ids/dagre/sketch.exp.svg | 2 +- .../dagre_special_ids/elk/sketch.exp.svg | 2 +- .../elk_alignment/dagre/sketch.exp.svg | 6 +- .../elk_alignment/elk/sketch.exp.svg | 6 +- .../elk_loop_panic/dagre/sketch.exp.svg | 4 +- .../elk_loop_panic/elk/sketch.exp.svg | 4 +- .../regression/elk_order/dagre/sketch.exp.svg | 4 +- .../regression/elk_order/elk/sketch.exp.svg | 4 +- .../empty_class_height/dagre/board.exp.json | 84 +- .../empty_class_height/dagre/sketch.exp.svg | 156 +-- .../empty_class_height/elk/board.exp.json | 84 +- .../empty_class_height/elk/sketch.exp.svg | 156 +-- .../empty_sequence/dagre/sketch.exp.svg | 2 +- .../empty_sequence/elk/sketch.exp.svg | 2 +- .../regression/hex-fill/dagre/sketch.exp.svg | 2 +- .../regression/hex-fill/elk/sketch.exp.svg | 2 +- .../just-width/dagre/sketch.exp.svg | 2 +- .../regression/just-width/elk/sketch.exp.svg | 2 +- .../link_with_ampersand/dagre/sketch.exp.svg | 2 +- .../link_with_ampersand/elk/sketch.exp.svg | 2 +- .../md_h1_li_li/dagre/sketch.exp.svg | 4 +- .../regression/md_h1_li_li/elk/sketch.exp.svg | 4 +- .../nested_steps/dagre/sketch.exp.svg | 4 +- .../nested_steps/elk/sketch.exp.svg | 4 +- .../regression/no-lexer/dagre/sketch.exp.svg | 2 +- .../regression/no-lexer/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../opacity-on-label/dagre/sketch.exp.svg | 6 +- .../opacity-on-label/elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 6 +- .../overlapping-edge-label/elk/sketch.exp.svg | 6 +- .../query_param_escape/dagre/sketch.exp.svg | 2 +- .../query_param_escape/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../sql_table_overflow/dagre/sketch.exp.svg | 2 +- .../sql_table_overflow/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../unconnected/dagre/sketch.exp.svg | 4 +- .../regression/unconnected/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 6 +- .../elk/sketch.exp.svg | 6 +- .../root/border-radius/dagre/sketch.exp.svg | 2 +- .../root/border-radius/elk/sketch.exp.svg | 2 +- .../root/double-border/dagre/sketch.exp.svg | 2 +- .../root/double-border/elk/sketch.exp.svg | 2 +- .../even-stroke-width/dagre/sketch.exp.svg | 2 +- .../root/even-stroke-width/elk/sketch.exp.svg | 2 +- .../testdata/root/fill/dagre/sketch.exp.svg | 2 +- .../testdata/root/fill/elk/sketch.exp.svg | 2 +- .../root/stroke-dash/dagre/sketch.exp.svg | 2 +- .../root/stroke-dash/elk/sketch.exp.svg | 2 +- .../root/stroke-no-width/dagre/sketch.exp.svg | 2 +- .../root/stroke-no-width/elk/sketch.exp.svg | 2 +- .../root/stroke-width/dagre/sketch.exp.svg | 2 +- .../root/stroke-width/elk/sketch.exp.svg | 2 +- .../sanity/1_to_2/dagre/sketch.exp.svg | 2 +- .../testdata/sanity/1_to_2/elk/sketch.exp.svg | 2 +- .../sanity/basic/dagre/sketch.exp.svg | 2 +- .../testdata/sanity/basic/elk/sketch.exp.svg | 2 +- .../child_to_child/dagre/sketch.exp.svg | 4 +- .../sanity/child_to_child/elk/sketch.exp.svg | 4 +- .../connection_label/dagre/sketch.exp.svg | 4 +- .../connection_label/elk/sketch.exp.svg | 4 +- .../3d_fill_and_stroke/dagre/sketch.exp.svg | 2 +- .../3d_fill_and_stroke/elk/sketch.exp.svg | 2 +- .../stable/all_shapes/dagre/sketch.exp.svg | 2 +- .../stable/all_shapes/elk/sketch.exp.svg | 2 +- .../all_shapes_multiple/dagre/sketch.exp.svg | 2 +- .../all_shapes_multiple/elk/sketch.exp.svg | 2 +- .../all_shapes_shadow/dagre/sketch.exp.svg | 2 +- .../all_shapes_shadow/elk/sketch.exp.svg | 2 +- .../stable/animated/dagre/sketch.exp.svg | 4 +- .../stable/animated/elk/sketch.exp.svg | 4 +- .../arrowhead_adjustment/dagre/sketch.exp.svg | 4 +- .../arrowhead_adjustment/elk/sketch.exp.svg | 4 +- .../arrowhead_labels/dagre/sketch.exp.svg | 4 +- .../arrowhead_labels/elk/sketch.exp.svg | 4 +- .../stable/binary_tree/dagre/sketch.exp.svg | 2 +- .../stable/binary_tree/elk/sketch.exp.svg | 2 +- .../stable/border-radius/dagre/sketch.exp.svg | 2 +- .../stable/border-radius/elk/sketch.exp.svg | 2 +- .../testdata/stable/br/dagre/sketch.exp.svg | 2 +- .../testdata/stable/br/elk/sketch.exp.svg | 2 +- .../stable/chaos2/dagre/sketch.exp.svg | 6 +- .../testdata/stable/chaos2/elk/sketch.exp.svg | 6 +- .../circle_arrowhead/dagre/sketch.exp.svg | 4 +- .../circle_arrowhead/elk/sketch.exp.svg | 4 +- .../circular_dependency/dagre/sketch.exp.svg | 2 +- .../circular_dependency/elk/sketch.exp.svg | 2 +- .../stable/class/dagre/sketch.exp.svg | 2 +- .../testdata/stable/class/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../stable/code_snippet/dagre/sketch.exp.svg | 8 +- .../stable/code_snippet/elk/sketch.exp.svg | 8 +- .../complex-layers/dagre/sketch.exp.svg | 2 +- .../stable/complex-layers/elk/sketch.exp.svg | 2 +- .../connected_container/dagre/sketch.exp.svg | 4 +- .../connected_container/elk/sketch.exp.svg | 4 +- .../constant_near_stress/dagre/sketch.exp.svg | 4 +- .../constant_near_stress/elk/sketch.exp.svg | 4 +- .../constant_near_title/dagre/sketch.exp.svg | 4 +- .../constant_near_title/elk/sketch.exp.svg | 4 +- .../container_edges/dagre/sketch.exp.svg | 4 +- .../stable/container_edges/elk/sketch.exp.svg | 4 +- .../crow_foot_arrowhead/dagre/sketch.exp.svg | 2 +- .../crow_foot_arrowhead/elk/sketch.exp.svg | 2 +- .../stable/dense/dagre/sketch.exp.svg | 2 +- .../testdata/stable/dense/elk/sketch.exp.svg | 2 +- .../different_subgraphs/dagre/sketch.exp.svg | 4 +- .../different_subgraphs/elk/sketch.exp.svg | 4 +- .../stable/direction/dagre/sketch.exp.svg | 4 +- .../stable/direction/elk/sketch.exp.svg | 4 +- .../elk_border_radius/dagre/sketch.exp.svg | 2 +- .../elk_border_radius/elk/sketch.exp.svg | 2 +- .../elk_container_height/dagre/sketch.exp.svg | 4 +- .../elk_container_height/elk/sketch.exp.svg | 4 +- .../stable/elk_shim/dagre/sketch.exp.svg | 6 +- .../stable/elk_shim/elk/sketch.exp.svg | 6 +- .../stable/font_colors/dagre/sketch.exp.svg | 4 +- .../stable/font_colors/elk/sketch.exp.svg | 4 +- .../stable/font_sizes/dagre/sketch.exp.svg | 4 +- .../stable/font_sizes/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../giant_markdown_test/dagre/sketch.exp.svg | 8 +- .../giant_markdown_test/elk/sketch.exp.svg | 8 +- .../stable/hexagon_3d/dagre/sketch.exp.svg | 2 +- .../stable/hexagon_3d/elk/sketch.exp.svg | 2 +- .../testdata/stable/hr/dagre/sketch.exp.svg | 4 +- .../testdata/stable/hr/elk/sketch.exp.svg | 4 +- .../icon-containers/dagre/sketch.exp.svg | 4 +- .../stable/icon-containers/elk/sketch.exp.svg | 4 +- .../stable/icon-label/dagre/sketch.exp.svg | 2 +- .../stable/icon-label/elk/sketch.exp.svg | 2 +- .../stable/images/dagre/sketch.exp.svg | 2 +- .../testdata/stable/images/elk/sketch.exp.svg | 2 +- .../stable/investigate/dagre/sketch.exp.svg | 6 +- .../stable/investigate/elk/sketch.exp.svg | 6 +- .../stable/large_arch/dagre/sketch.exp.svg | 4 +- .../stable/large_arch/elk/sketch.exp.svg | 4 +- .../stable/latex/dagre/sketch.exp.svg | 4 +- .../testdata/stable/latex/elk/sketch.exp.svg | 4 +- .../testdata/stable/li1/dagre/sketch.exp.svg | 4 +- .../testdata/stable/li1/elk/sketch.exp.svg | 4 +- .../testdata/stable/li2/dagre/sketch.exp.svg | 6 +- .../testdata/stable/li2/elk/sketch.exp.svg | 6 +- .../testdata/stable/li3/dagre/sketch.exp.svg | 4 +- .../testdata/stable/li3/elk/sketch.exp.svg | 4 +- .../testdata/stable/li4/dagre/sketch.exp.svg | 6 +- .../testdata/stable/li4/elk/sketch.exp.svg | 6 +- .../stable/links/dagre/sketch.exp.svg | 2 +- .../testdata/stable/links/elk/sketch.exp.svg | 2 +- .../stable/lone_h1/dagre/sketch.exp.svg | 4 +- .../stable/lone_h1/elk/sketch.exp.svg | 4 +- .../stable/markdown/dagre/sketch.exp.svg | 6 +- .../stable/markdown/elk/sketch.exp.svg | 6 +- .../markdown_stroke_fill/dagre/sketch.exp.svg | 4 +- .../markdown_stroke_fill/elk/sketch.exp.svg | 4 +- .../md_2space_newline/dagre/sketch.exp.svg | 2 +- .../md_2space_newline/elk/sketch.exp.svg | 2 +- .../md_backslash_newline/dagre/sketch.exp.svg | 2 +- .../md_backslash_newline/elk/sketch.exp.svg | 2 +- .../md_code_block_fenced/dagre/sketch.exp.svg | 6 +- .../md_code_block_fenced/elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 6 +- .../md_code_block_indented/elk/sketch.exp.svg | 6 +- .../md_code_inline/dagre/sketch.exp.svg | 6 +- .../stable/md_code_inline/elk/sketch.exp.svg | 6 +- .../stable/mono-edge/dagre/sketch.exp.svg | 6 +- .../stable/mono-edge/elk/sketch.exp.svg | 6 +- .../stable/mono-font/dagre/sketch.exp.svg | 4 +- .../stable/mono-font/elk/sketch.exp.svg | 4 +- .../multiline_text/dagre/sketch.exp.svg | 2 +- .../stable/multiline_text/elk/sketch.exp.svg | 2 +- .../multiple_trees/dagre/sketch.exp.svg | 2 +- .../stable/multiple_trees/elk/sketch.exp.svg | 2 +- .../stable/n22_e32/dagre/sketch.exp.svg | 2 +- .../stable/n22_e32/elk/sketch.exp.svg | 2 +- .../stable/near-alone/dagre/sketch.exp.svg | 2 +- .../stable/near-alone/elk/sketch.exp.svg | 2 +- .../number_connections/dagre/sketch.exp.svg | 2 +- .../number_connections/elk/sketch.exp.svg | 2 +- .../one_container_loop/dagre/sketch.exp.svg | 4 +- .../one_container_loop/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../stable/ovals/dagre/sketch.exp.svg | 2 +- .../testdata/stable/ovals/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 6 +- .../elk/sketch.exp.svg | 6 +- .../testdata/stable/p/dagre/sketch.exp.svg | 4 +- e2etests/testdata/stable/p/elk/sketch.exp.svg | 4 +- .../stable/people/dagre/sketch.exp.svg | 2 +- .../testdata/stable/people/elk/sketch.exp.svg | 2 +- .../testdata/stable/pre/dagre/sketch.exp.svg | 6 +- .../testdata/stable/pre/elk/sketch.exp.svg | 6 +- .../self-referencing/dagre/sketch.exp.svg | 4 +- .../self-referencing/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 8 +- .../elk/sketch.exp.svg | 8 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../sequence_diagram_note/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../sequence_diagram_real/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../sequence_diagram_span/elk/sketch.exp.svg | 4 +- .../sequence_diagrams/dagre/sketch.exp.svg | 6 +- .../sequence_diagrams/elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../stable/sql_tables/dagre/sketch.exp.svg | 2 +- .../stable/sql_tables/elk/sketch.exp.svg | 2 +- .../stable/square_3d/dagre/sketch.exp.svg | 2 +- .../stable/square_3d/elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../stable/stylish/dagre/sketch.exp.svg | 4 +- .../stable/stylish/elk/sketch.exp.svg | 4 +- .../text_font_sizes/dagre/sketch.exp.svg | 6 +- .../stable/text_font_sizes/elk/sketch.exp.svg | 6 +- .../stable/tooltips/dagre/sketch.exp.svg | 2 +- .../stable/tooltips/elk/sketch.exp.svg | 2 +- .../transparent_3d/dagre/sketch.exp.svg | 2 +- .../stable/transparent_3d/elk/sketch.exp.svg | 2 +- .../unnamed_only_height/dagre/sketch.exp.svg | 6 +- .../unnamed_only_height/elk/sketch.exp.svg | 6 +- .../unnamed_only_width/dagre/sketch.exp.svg | 6 +- .../unnamed_only_width/elk/sketch.exp.svg | 6 +- .../stable/us_map/dagre/sketch.exp.svg | 2 +- .../testdata/stable/us_map/elk/sketch.exp.svg | 2 +- .../themes/terminal/dagre/sketch.exp.svg | 8 +- .../themes/terminal/elk/sketch.exp.svg | 8 +- .../terminal_grayscale/dagre/sketch.exp.svg | 4 +- .../terminal_grayscale/elk/sketch.exp.svg | 4 +- .../container_icon_label/dagre/sketch.exp.svg | 4 +- .../container_icon_label/elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 6 +- .../elk/sketch.exp.svg | 6 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 2 +- .../elk/sketch.exp.svg | 2 +- .../dagre/sketch.exp.svg | 4 +- .../elk/sketch.exp.svg | 4 +- .../dagre/sketch.exp.svg | 8 +- .../shape_set_width_height/elk/sketch.exp.svg | 8 +- .../unicode/chinese/dagre/sketch.exp.svg | 4 +- .../unicode/chinese/elk/sketch.exp.svg | 4 +- .../unicode/emojis/dagre/sketch.exp.svg | 2 +- .../unicode/emojis/elk/sketch.exp.svg | 2 +- .../japanese-basic/dagre/sketch.exp.svg | 2 +- .../unicode/japanese-basic/elk/sketch.exp.svg | 2 +- .../japanese-full/dagre/sketch.exp.svg | 4 +- .../unicode/japanese-full/elk/sketch.exp.svg | 4 +- .../japanese-mixed/dagre/sketch.exp.svg | 2 +- .../unicode/japanese-mixed/elk/sketch.exp.svg | 2 +- .../unicode/korean/dagre/sketch.exp.svg | 2 +- .../unicode/korean/elk/sketch.exp.svg | 2 +- .../mixed-language-2/dagre/sketch.exp.svg | 2 +- .../mixed-language-2/elk/sketch.exp.svg | 2 +- .../mixed-language/dagre/sketch.exp.svg | 4 +- .../unicode/mixed-language/elk/sketch.exp.svg | 4 +- .../unicode/with-style/dagre/sketch.exp.svg | 2 +- .../unicode/with-style/elk/sketch.exp.svg | 2 +- lib/font/utf8fontfile.go | 1152 +++++++++++++++++ 395 files changed, 2007 insertions(+), 976 deletions(-) create mode 100644 lib/font/utf8fontfile.go diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go index 6e30dfb61..f5cad8aa4 100644 --- a/d2renderers/d2fonts/d2fonts.go +++ b/d2renderers/d2fonts/d2fonts.go @@ -12,8 +12,6 @@ import ( "path/filepath" "strings" - "github.com/jung-kurt/gofpdf" - fontlib "oss.terrastruct.com/d2/lib/font" ) @@ -37,7 +35,7 @@ func (f FontFamily) Font(size int, style FontStyle) Font { func (f Font) GetEncodedSubset(cutset string) string { // gofpdf subset only accepts .ttf fonts fontBuf := FontFaces[f] - fontBuf = gofpdf.UTF8CutFont(fontBuf, cutset) + fontBuf = fontlib.UTF8CutFont(fontBuf, cutset) fontBuf, err := fontlib.Sfnt2Woff(fontBuf) if err != nil { diff --git a/d2renderers/d2fonts/d2fonts_test.go b/d2renderers/d2fonts/d2fonts_test.go index bcc601379..202241b36 100644 --- a/d2renderers/d2fonts/d2fonts_test.go +++ b/d2renderers/d2fonts/d2fonts_test.go @@ -4,7 +4,7 @@ import ( "path/filepath" "testing" - "github.com/jung-kurt/gofpdf" + "oss.terrastruct.com/d2/lib/font" "oss.terrastruct.com/util-go/assert" "oss.terrastruct.com/util-go/diff" ) @@ -15,7 +15,7 @@ func TestCutFont(t *testing.T) { Style: FONT_STYLE_REGULAR, } fontBuf := FontFaces[f] - fontBuf = gofpdf.UTF8CutFont(fontBuf, "a") + fontBuf = font.UTF8CutFont(fontBuf, "a") err := diff.Testdata(filepath.Join("testdata", "d2fonts", "cut"), ".txt", fontBuf) assert.Success(t, err) } diff --git a/d2renderers/d2fonts/testdata/d2fonts/cut.exp.txt b/d2renderers/d2fonts/testdata/d2fonts/cut.exp.txt index b7fd2265b69c7e81eaa33271324a08e7aa8f6562..0b0cd6e6272b4b8860cabe720cc5fdd339ac9989 100644 GIT binary patch delta 214 zcmZosU!gWZv7Vb@8Uq6(4+8^(L3&PQT5!@QMDWdH@( zj2SwB{5L?pN=9x;1yck=AOi!F0Fcj;lb@Ujq=9;wL_qx9#EJq2QzoDolLU~jke8U7 zdS@=PJdkg}z#wq0AiubTjnwTQF@|+a|0}}_3Zclass with rows-numint-timeoutintclass without rows - + .d2-2369923795 .fill-N1{fill:#0A0F25;} + .d2-2369923795 .fill-N2{fill:#676C7E;} + .d2-2369923795 .fill-N3{fill:#9499AB;} + .d2-2369923795 .fill-N4{fill:#CFD2DD;} + .d2-2369923795 .fill-N5{fill:#DEE1EB;} + .d2-2369923795 .fill-N6{fill:#EEF1F8;} + .d2-2369923795 .fill-N7{fill:#FFFFFF;} + .d2-2369923795 .fill-B1{fill:#0D32B2;} + .d2-2369923795 .fill-B2{fill:#0D32B2;} + .d2-2369923795 .fill-B3{fill:#E3E9FD;} + .d2-2369923795 .fill-B4{fill:#E3E9FD;} + .d2-2369923795 .fill-B5{fill:#EDF0FD;} + .d2-2369923795 .fill-B6{fill:#F7F8FE;} + .d2-2369923795 .fill-AA2{fill:#4A6FF3;} + .d2-2369923795 .fill-AA4{fill:#EDF0FD;} + .d2-2369923795 .fill-AA5{fill:#F7F8FE;} + .d2-2369923795 .fill-AB4{fill:#EDF0FD;} + .d2-2369923795 .fill-AB5{fill:#F7F8FE;} + .d2-2369923795 .stroke-N1{stroke:#0A0F25;} + .d2-2369923795 .stroke-N2{stroke:#676C7E;} + .d2-2369923795 .stroke-N3{stroke:#9499AB;} + .d2-2369923795 .stroke-N4{stroke:#CFD2DD;} + .d2-2369923795 .stroke-N5{stroke:#DEE1EB;} + .d2-2369923795 .stroke-N6{stroke:#EEF1F8;} + .d2-2369923795 .stroke-N7{stroke:#FFFFFF;} + .d2-2369923795 .stroke-B1{stroke:#0D32B2;} + .d2-2369923795 .stroke-B2{stroke:#0D32B2;} + .d2-2369923795 .stroke-B3{stroke:#E3E9FD;} + .d2-2369923795 .stroke-B4{stroke:#E3E9FD;} + .d2-2369923795 .stroke-B5{stroke:#EDF0FD;} + .d2-2369923795 .stroke-B6{stroke:#F7F8FE;} + .d2-2369923795 .stroke-AA2{stroke:#4A6FF3;} + .d2-2369923795 .stroke-AA4{stroke:#EDF0FD;} + .d2-2369923795 .stroke-AA5{stroke:#F7F8FE;} + .d2-2369923795 .stroke-AB4{stroke:#EDF0FD;} + .d2-2369923795 .stroke-AB5{stroke:#F7F8FE;} + .d2-2369923795 .background-color-N1{background-color:#0A0F25;} + .d2-2369923795 .background-color-N2{background-color:#676C7E;} + .d2-2369923795 .background-color-N3{background-color:#9499AB;} + .d2-2369923795 .background-color-N4{background-color:#CFD2DD;} + .d2-2369923795 .background-color-N5{background-color:#DEE1EB;} + .d2-2369923795 .background-color-N6{background-color:#EEF1F8;} + .d2-2369923795 .background-color-N7{background-color:#FFFFFF;} + .d2-2369923795 .background-color-B1{background-color:#0D32B2;} + .d2-2369923795 .background-color-B2{background-color:#0D32B2;} + .d2-2369923795 .background-color-B3{background-color:#E3E9FD;} + .d2-2369923795 .background-color-B4{background-color:#E3E9FD;} + .d2-2369923795 .background-color-B5{background-color:#EDF0FD;} + .d2-2369923795 .background-color-B6{background-color:#F7F8FE;} + .d2-2369923795 .background-color-AA2{background-color:#4A6FF3;} + .d2-2369923795 .background-color-AA4{background-color:#EDF0FD;} + .d2-2369923795 .background-color-AA5{background-color:#F7F8FE;} + .d2-2369923795 .background-color-AB4{background-color:#EDF0FD;} + .d2-2369923795 .background-color-AB5{background-color:#F7F8FE;} + .d2-2369923795 .color-N1{color:#0A0F25;} + .d2-2369923795 .color-N2{color:#676C7E;} + .d2-2369923795 .color-N3{color:#9499AB;} + .d2-2369923795 .color-N4{color:#CFD2DD;} + .d2-2369923795 .color-N5{color:#DEE1EB;} + .d2-2369923795 .color-N6{color:#EEF1F8;} + .d2-2369923795 .color-N7{color:#FFFFFF;} + .d2-2369923795 .color-B1{color:#0D32B2;} + .d2-2369923795 .color-B2{color:#0D32B2;} + .d2-2369923795 .color-B3{color:#E3E9FD;} + .d2-2369923795 .color-B4{color:#E3E9FD;} + .d2-2369923795 .color-B5{color:#EDF0FD;} + .d2-2369923795 .color-B6{color:#F7F8FE;} + .d2-2369923795 .color-AA2{color:#4A6FF3;} + .d2-2369923795 .color-AA4{color:#EDF0FD;} + .d2-2369923795 .color-AA5{color:#F7F8FE;} + .d2-2369923795 .color-AB4{color:#EDF0FD;} + .d2-2369923795 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>A + \ No newline at end of file diff --git a/e2etests/testdata/regression/empty_class_height/elk/board.exp.json b/e2etests/testdata/regression/empty_class_height/elk/board.exp.json index 5ada06396..e17604137 100644 --- a/e2etests/testdata/regression/empty_class_height/elk/board.exp.json +++ b/e2etests/testdata/regression/empty_class_height/elk/board.exp.json @@ -4,74 +4,20 @@ "fontFamily": "SourceSansPro", "shapes": [ { - "id": "class1", - "type": "class", + "id": "A", + "type": "rectangle", "pos": { "x": 12, "y": 12 }, - "width": 319, - "height": 184, + "width": 55, + "height": 66, "opacity": 1, "strokeDash": 0, "strokeWidth": 2, "borderRadius": 0, - "fill": "N1", - "stroke": "N7", - "shadow": false, - "3d": false, - "multiple": false, - "double-border": false, - "tooltip": "", - "link": "", - "icon": null, - "iconPosition": "", - "blend": false, - "fields": [ - { - "name": "num", - "type": "int", - "visibility": "private" - }, - { - "name": "timeout", - "type": "int", - "visibility": "private" - } - ], - "methods": null, - "columns": null, - "label": "class with rows", - "fontSize": 20, - "fontFamily": "DEFAULT", - "language": "", - "color": "N1", - "italic": false, - "bold": false, - "underline": false, - "labelWidth": 214, - "labelHeight": 31, - "zIndex": 0, - "level": 1, - "primaryAccentColor": "B2", - "secondaryAccentColor": "AA2", - "neutralAccentColor": "N2" - }, - { - "id": "class2", - "type": "class", - "pos": { - "x": 351, - "y": 58 - }, - "width": 362, - "height": 92, - "opacity": 1, - "strokeDash": 0, - "strokeWidth": 2, - "borderRadius": 0, - "fill": "N1", - "stroke": "N7", + "fill": "B6", + "stroke": "B1", "shadow": false, "3d": false, "multiple": false, @@ -84,21 +30,19 @@ "fields": null, "methods": null, "columns": null, - "label": "class without rows", - "fontSize": 20, - "fontFamily": "DEFAULT", + "label": "A", + "fontSize": 16, + "fontFamily": "mono", "language": "", "color": "N1", "italic": false, - "bold": false, + "bold": true, "underline": false, - "labelWidth": 257, - "labelHeight": 31, + "labelWidth": 10, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", "zIndex": 0, - "level": 1, - "primaryAccentColor": "B2", - "secondaryAccentColor": "AA2", - "neutralAccentColor": "N2" + "level": 1 } ], "connections": [], diff --git a/e2etests/testdata/regression/empty_class_height/elk/sketch.exp.svg b/e2etests/testdata/regression/empty_class_height/elk/sketch.exp.svg index c1a3fcdf7..073554300 100644 --- a/e2etests/testdata/regression/empty_class_height/elk/sketch.exp.svg +++ b/e2etests/testdata/regression/empty_class_height/elk/sketch.exp.svg @@ -1,10 +1,10 @@ -class with rows-numint-timeoutintclass without rows - + .d2-1838478075 .fill-N1{fill:#0A0F25;} + .d2-1838478075 .fill-N2{fill:#676C7E;} + .d2-1838478075 .fill-N3{fill:#9499AB;} + .d2-1838478075 .fill-N4{fill:#CFD2DD;} + .d2-1838478075 .fill-N5{fill:#DEE1EB;} + .d2-1838478075 .fill-N6{fill:#EEF1F8;} + .d2-1838478075 .fill-N7{fill:#FFFFFF;} + .d2-1838478075 .fill-B1{fill:#0D32B2;} + .d2-1838478075 .fill-B2{fill:#0D32B2;} + .d2-1838478075 .fill-B3{fill:#E3E9FD;} + .d2-1838478075 .fill-B4{fill:#E3E9FD;} + .d2-1838478075 .fill-B5{fill:#EDF0FD;} + .d2-1838478075 .fill-B6{fill:#F7F8FE;} + .d2-1838478075 .fill-AA2{fill:#4A6FF3;} + .d2-1838478075 .fill-AA4{fill:#EDF0FD;} + .d2-1838478075 .fill-AA5{fill:#F7F8FE;} + .d2-1838478075 .fill-AB4{fill:#EDF0FD;} + .d2-1838478075 .fill-AB5{fill:#F7F8FE;} + .d2-1838478075 .stroke-N1{stroke:#0A0F25;} + .d2-1838478075 .stroke-N2{stroke:#676C7E;} + .d2-1838478075 .stroke-N3{stroke:#9499AB;} + .d2-1838478075 .stroke-N4{stroke:#CFD2DD;} + .d2-1838478075 .stroke-N5{stroke:#DEE1EB;} + .d2-1838478075 .stroke-N6{stroke:#EEF1F8;} + .d2-1838478075 .stroke-N7{stroke:#FFFFFF;} + .d2-1838478075 .stroke-B1{stroke:#0D32B2;} + .d2-1838478075 .stroke-B2{stroke:#0D32B2;} + .d2-1838478075 .stroke-B3{stroke:#E3E9FD;} + .d2-1838478075 .stroke-B4{stroke:#E3E9FD;} + .d2-1838478075 .stroke-B5{stroke:#EDF0FD;} + .d2-1838478075 .stroke-B6{stroke:#F7F8FE;} + .d2-1838478075 .stroke-AA2{stroke:#4A6FF3;} + .d2-1838478075 .stroke-AA4{stroke:#EDF0FD;} + .d2-1838478075 .stroke-AA5{stroke:#F7F8FE;} + .d2-1838478075 .stroke-AB4{stroke:#EDF0FD;} + .d2-1838478075 .stroke-AB5{stroke:#F7F8FE;} + .d2-1838478075 .background-color-N1{background-color:#0A0F25;} + .d2-1838478075 .background-color-N2{background-color:#676C7E;} + .d2-1838478075 .background-color-N3{background-color:#9499AB;} + .d2-1838478075 .background-color-N4{background-color:#CFD2DD;} + .d2-1838478075 .background-color-N5{background-color:#DEE1EB;} + .d2-1838478075 .background-color-N6{background-color:#EEF1F8;} + .d2-1838478075 .background-color-N7{background-color:#FFFFFF;} + .d2-1838478075 .background-color-B1{background-color:#0D32B2;} + .d2-1838478075 .background-color-B2{background-color:#0D32B2;} + .d2-1838478075 .background-color-B3{background-color:#E3E9FD;} + .d2-1838478075 .background-color-B4{background-color:#E3E9FD;} + .d2-1838478075 .background-color-B5{background-color:#EDF0FD;} + .d2-1838478075 .background-color-B6{background-color:#F7F8FE;} + .d2-1838478075 .background-color-AA2{background-color:#4A6FF3;} + .d2-1838478075 .background-color-AA4{background-color:#EDF0FD;} + .d2-1838478075 .background-color-AA5{background-color:#F7F8FE;} + .d2-1838478075 .background-color-AB4{background-color:#EDF0FD;} + .d2-1838478075 .background-color-AB5{background-color:#F7F8FE;} + .d2-1838478075 .color-N1{color:#0A0F25;} + .d2-1838478075 .color-N2{color:#676C7E;} + .d2-1838478075 .color-N3{color:#9499AB;} + .d2-1838478075 .color-N4{color:#CFD2DD;} + .d2-1838478075 .color-N5{color:#DEE1EB;} + .d2-1838478075 .color-N6{color:#EEF1F8;} + .d2-1838478075 .color-N7{color:#FFFFFF;} + .d2-1838478075 .color-B1{color:#0D32B2;} + .d2-1838478075 .color-B2{color:#0D32B2;} + .d2-1838478075 .color-B3{color:#E3E9FD;} + .d2-1838478075 .color-B4{color:#E3E9FD;} + .d2-1838478075 .color-B5{color:#EDF0FD;} + .d2-1838478075 .color-B6{color:#F7F8FE;} + .d2-1838478075 .color-AA2{color:#4A6FF3;} + .d2-1838478075 .color-AA4{color:#EDF0FD;} + .d2-1838478075 .color-AA5{color:#F7F8FE;} + .d2-1838478075 .color-AB4{color:#EDF0FD;} + .d2-1838478075 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>A + \ No newline at end of file diff --git a/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg b/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg index aa98264b4..3fc1d34af 100644 --- a/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg +++ b/e2etests/testdata/regression/empty_sequence/dagre/sketch.exp.svg @@ -4,7 +4,7 @@ } @font-face { font-family: d2-1198359836-font-bold; - src: url("data:application/font-woff;base64,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"); + src: url("data:application/font-woff;base64,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"); }]]>