abstract-image 3.1.3 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/CHANGELOG.md +27 -21
  2. package/LICENSE +21 -21
  3. package/README.md +71 -71
  4. package/lib/__stories__/react-svg-export/example-1.stories.d.ts.map +1 -1
  5. package/lib/__stories__/react-svg-export/example-1.stories.js +1 -1
  6. package/lib/__stories__/react-svg-export/example-1.stories.js.map +1 -1
  7. package/lib/_tests_/exporters/svg-export-image.test.d.ts +2 -0
  8. package/lib/_tests_/exporters/svg-export-image.test.d.ts.map +1 -0
  9. package/lib/_tests_/exporters/svg-export-image.test.js +35 -0
  10. package/lib/_tests_/exporters/svg-export-image.test.js.map +1 -0
  11. package/lib/exporters/__tests__/dxf/export-test-def.d.ts +11 -0
  12. package/lib/exporters/__tests__/dxf/export-test-def.d.ts.map +1 -0
  13. package/lib/exporters/__tests__/dxf/export-test-def.js +6 -0
  14. package/lib/exporters/__tests__/dxf/export-test-def.js.map +1 -0
  15. package/lib/exporters/__tests__/dxf/export.test.d.ts +3 -0
  16. package/lib/exporters/__tests__/dxf/export.test.d.ts.map +1 -0
  17. package/lib/exporters/__tests__/dxf/export.test.js +17 -0
  18. package/lib/exporters/__tests__/dxf/export.test.js.map +1 -0
  19. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-ellipse.d.ts +3 -0
  20. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-ellipse.d.ts.map +1 -0
  21. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-ellipse.js +413 -0
  22. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-ellipse.js.map +1 -0
  23. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-group.d.ts +3 -0
  24. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-group.d.ts.map +1 -0
  25. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-group.js +160 -0
  26. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-group.js.map +1 -0
  27. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-line.d.ts +3 -0
  28. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-line.d.ts.map +1 -0
  29. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-line.js +89 -0
  30. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-line.js.map +1 -0
  31. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polygon.d.ts +3 -0
  32. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polygon.d.ts.map +1 -0
  33. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polygon.js +123 -0
  34. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polygon.js.map +1 -0
  35. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polyline.d.ts +3 -0
  36. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polyline.d.ts.map +1 -0
  37. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polyline.js +113 -0
  38. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-polyline.js.map +1 -0
  39. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-rectangle.d.ts +3 -0
  40. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-rectangle.d.ts.map +1 -0
  41. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-rectangle.js +133 -0
  42. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-rectangle.js.map +1 -0
  43. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text-growth-directions.d.ts +3 -0
  44. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text-growth-directions.d.ts.map +1 -0
  45. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text-growth-directions.js +172 -0
  46. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text-growth-directions.js.map +1 -0
  47. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text.d.ts +3 -0
  48. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text.d.ts.map +1 -0
  49. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text.js +97 -0
  50. package/lib/exporters/__tests__/dxf/test-defs/dxf2d-text.js.map +1 -0
  51. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-ellipse.js +379 -379
  52. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.d.ts.map +1 -1
  53. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.js +124 -124
  54. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.js.map +1 -1
  55. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-line.js +55 -55
  56. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polygon.js +89 -89
  57. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polyline.js +79 -79
  58. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-rectangle.js +99 -99
  59. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.d.ts.map +1 -1
  60. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.js +139 -139
  61. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.js.map +1 -1
  62. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.d.ts.map +1 -1
  63. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.js +64 -64
  64. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.js.map +1 -1
  65. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-ellipse.js +24 -24
  66. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.d.ts.map +1 -1
  67. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.js +27 -27
  68. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.js.map +1 -1
  69. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.d.ts.map +1 -1
  70. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.js +32 -32
  71. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.js.map +1 -1
  72. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-line.js +20 -20
  73. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-polygon.js +34 -34
  74. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-polyline.js +26 -26
  75. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-rectangle.js +20 -20
  76. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.d.ts.map +1 -1
  77. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.js +63 -63
  78. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.js.map +1 -1
  79. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.d.ts.map +1 -1
  80. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.js +27 -27
  81. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.js.map +1 -1
  82. package/lib/exporters/__tests__/exception/react-svg-direction-exception.test.js +2 -2
  83. package/lib/exporters/__tests__/exception/react-svg-direction-exception.test.js.map +1 -1
  84. package/lib/exporters/__tests__/exception/svg-direction-exception.test.js +2 -2
  85. package/lib/exporters/__tests__/exception/svg-direction-exception.test.js.map +1 -1
  86. package/lib/exporters/__tests__/export-test-def.d.ts +8 -0
  87. package/lib/exporters/__tests__/export-test-def.d.ts.map +1 -0
  88. package/lib/exporters/__tests__/export-test-def.js +3 -0
  89. package/lib/exporters/__tests__/export-test-def.js.map +1 -0
  90. package/lib/exporters/__tests__/export.test.d.ts +3 -0
  91. package/lib/exporters/__tests__/export.test.d.ts.map +1 -0
  92. package/lib/exporters/__tests__/export.test.js +18 -0
  93. package/lib/exporters/__tests__/export.test.js.map +1 -0
  94. package/lib/exporters/__tests__/react-svg/export-test-def.d.ts +12 -0
  95. package/lib/exporters/__tests__/react-svg/export-test-def.d.ts.map +1 -0
  96. package/lib/exporters/__tests__/react-svg/export-test-def.js +6 -0
  97. package/lib/exporters/__tests__/react-svg/export-test-def.js.map +1 -0
  98. package/lib/exporters/__tests__/react-svg/export.test.d.ts +3 -0
  99. package/lib/exporters/__tests__/react-svg/export.test.d.ts.map +1 -0
  100. package/lib/exporters/__tests__/react-svg/export.test.js +17 -0
  101. package/lib/exporters/__tests__/react-svg/export.test.js.map +1 -0
  102. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary-png.d.ts +3 -0
  103. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary-png.d.ts.map +1 -0
  104. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary-png.js +33 -0
  105. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary-png.js.map +1 -0
  106. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary.d.ts +3 -0
  107. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary.d.ts.map +1 -0
  108. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary.js +33 -0
  109. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-binary.js.map +1 -0
  110. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-callback.d.ts +3 -0
  111. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-callback.d.ts.map +1 -0
  112. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-callback.js +38 -0
  113. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-callback.js.map +1 -0
  114. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-ellipse.d.ts +3 -0
  115. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-ellipse.d.ts.map +1 -0
  116. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-ellipse.js +34 -0
  117. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-ellipse.js.map +1 -0
  118. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-empty-text.d.ts +3 -0
  119. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-empty-text.d.ts.map +1 -0
  120. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-empty-text.js +34 -0
  121. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-empty-text.js.map +1 -0
  122. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-group.d.ts +3 -0
  123. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-group.d.ts.map +1 -0
  124. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-group.js +37 -0
  125. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-group.js.map +1 -0
  126. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-line.d.ts +3 -0
  127. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-line.d.ts.map +1 -0
  128. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-line.js +34 -0
  129. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-line.js.map +1 -0
  130. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polygon.d.ts +3 -0
  131. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polygon.d.ts.map +1 -0
  132. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polygon.js +40 -0
  133. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polygon.js.map +1 -0
  134. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polyline.d.ts +3 -0
  135. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polyline.d.ts.map +1 -0
  136. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polyline.js +42 -0
  137. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-polyline.js.map +1 -0
  138. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-rectangle.d.ts +3 -0
  139. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-rectangle.d.ts.map +1 -0
  140. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-rectangle.js +34 -0
  141. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-rectangle.js.map +1 -0
  142. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-subimage.d.ts +3 -0
  143. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-subimage.d.ts.map +1 -0
  144. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-subimage.js +33 -0
  145. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-subimage.js.map +1 -0
  146. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-growth-directions.d.ts +3 -0
  147. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-growth-directions.d.ts.map +1 -0
  148. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-growth-directions.js +37 -0
  149. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-growth-directions.js.map +1 -0
  150. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-sub.d.ts +3 -0
  151. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-sub.d.ts.map +1 -0
  152. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-sub.js +34 -0
  153. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text-sub.js.map +1 -0
  154. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text.d.ts +3 -0
  155. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text.d.ts.map +1 -0
  156. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text.js +34 -0
  157. package/lib/exporters/__tests__/react-svg/test-defs/react-svg-text.js.map +1 -0
  158. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.d.ts.map +1 -1
  159. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.js +1 -1
  160. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.js.map +1 -1
  161. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.d.ts.map +1 -1
  162. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.js +1 -1
  163. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.js.map +1 -1
  164. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.d.ts.map +1 -1
  165. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.js +1 -1
  166. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.js.map +1 -1
  167. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.d.ts.map +1 -1
  168. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.js +1 -1
  169. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.js.map +1 -1
  170. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.d.ts.map +1 -1
  171. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.js +4 -4
  172. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.js.map +1 -1
  173. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.d.ts.map +1 -1
  174. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.js +1 -1
  175. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.js.map +1 -1
  176. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.d.ts.map +1 -1
  177. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.js +1 -1
  178. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.js.map +1 -1
  179. package/lib/exporters/__tests__/svg/export-test-def.d.ts +11 -0
  180. package/lib/exporters/__tests__/svg/export-test-def.d.ts.map +1 -0
  181. package/lib/exporters/__tests__/svg/export-test-def.js +6 -0
  182. package/lib/exporters/__tests__/svg/export-test-def.js.map +1 -0
  183. package/lib/exporters/__tests__/svg/export.test.d.ts +3 -0
  184. package/lib/exporters/__tests__/svg/export.test.d.ts.map +1 -0
  185. package/lib/exporters/__tests__/svg/export.test.js +17 -0
  186. package/lib/exporters/__tests__/svg/export.test.js.map +1 -0
  187. package/lib/exporters/__tests__/svg/test-defs/svg-ellipse.d.ts +3 -0
  188. package/lib/exporters/__tests__/svg/test-defs/svg-ellipse.d.ts.map +1 -0
  189. package/lib/exporters/__tests__/svg/test-defs/svg-ellipse.js +34 -0
  190. package/lib/exporters/__tests__/svg/test-defs/svg-ellipse.js.map +1 -0
  191. package/lib/exporters/__tests__/svg/test-defs/svg-empty-text.d.ts +3 -0
  192. package/lib/exporters/__tests__/svg/test-defs/svg-empty-text.d.ts.map +1 -0
  193. package/lib/exporters/__tests__/svg/test-defs/svg-empty-text.js +34 -0
  194. package/lib/exporters/__tests__/svg/test-defs/svg-empty-text.js.map +1 -0
  195. package/lib/exporters/__tests__/svg/test-defs/svg-group.d.ts +3 -0
  196. package/lib/exporters/__tests__/svg/test-defs/svg-group.d.ts.map +1 -0
  197. package/lib/exporters/__tests__/svg/test-defs/svg-group.js +37 -0
  198. package/lib/exporters/__tests__/svg/test-defs/svg-group.js.map +1 -0
  199. package/lib/exporters/__tests__/svg/test-defs/svg-line.d.ts +3 -0
  200. package/lib/exporters/__tests__/svg/test-defs/svg-line.d.ts.map +1 -0
  201. package/lib/exporters/__tests__/svg/test-defs/svg-line.js +34 -0
  202. package/lib/exporters/__tests__/svg/test-defs/svg-line.js.map +1 -0
  203. package/lib/exporters/__tests__/svg/test-defs/svg-polygon.d.ts +3 -0
  204. package/lib/exporters/__tests__/svg/test-defs/svg-polygon.d.ts.map +1 -0
  205. package/lib/exporters/__tests__/svg/test-defs/svg-polygon.js +40 -0
  206. package/lib/exporters/__tests__/svg/test-defs/svg-polygon.js.map +1 -0
  207. package/lib/exporters/__tests__/svg/test-defs/svg-polyline.d.ts +3 -0
  208. package/lib/exporters/__tests__/svg/test-defs/svg-polyline.d.ts.map +1 -0
  209. package/lib/exporters/__tests__/svg/test-defs/svg-polyline.js +42 -0
  210. package/lib/exporters/__tests__/svg/test-defs/svg-polyline.js.map +1 -0
  211. package/lib/exporters/__tests__/svg/test-defs/svg-rectangle.d.ts +3 -0
  212. package/lib/exporters/__tests__/svg/test-defs/svg-rectangle.d.ts.map +1 -0
  213. package/lib/exporters/__tests__/svg/test-defs/svg-rectangle.js +34 -0
  214. package/lib/exporters/__tests__/svg/test-defs/svg-rectangle.js.map +1 -0
  215. package/lib/exporters/__tests__/svg/test-defs/svg-text-growth-directions.d.ts +3 -0
  216. package/lib/exporters/__tests__/svg/test-defs/svg-text-growth-directions.d.ts.map +1 -0
  217. package/lib/exporters/__tests__/svg/test-defs/svg-text-growth-directions.js +37 -0
  218. package/lib/exporters/__tests__/svg/test-defs/svg-text-growth-directions.js.map +1 -0
  219. package/lib/exporters/__tests__/svg/test-defs/svg-text-unknown-direction.d.ts +3 -0
  220. package/lib/exporters/__tests__/svg/test-defs/svg-text-unknown-direction.d.ts.map +1 -0
  221. package/lib/exporters/__tests__/svg/test-defs/svg-text-unknown-direction.js +34 -0
  222. package/lib/exporters/__tests__/svg/test-defs/svg-text-unknown-direction.js.map +1 -0
  223. package/lib/exporters/__tests__/svg/test-defs/svg-text.d.ts +3 -0
  224. package/lib/exporters/__tests__/svg/test-defs/svg-text.d.ts.map +1 -0
  225. package/lib/exporters/__tests__/svg/test-defs/svg-text.js +34 -0
  226. package/lib/exporters/__tests__/svg/test-defs/svg-text.js.map +1 -0
  227. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.d.ts.map +1 -1
  228. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.js +1 -1
  229. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.js.map +1 -1
  230. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.d.ts.map +1 -1
  231. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.js +1 -1
  232. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.js.map +1 -1
  233. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.d.ts.map +1 -1
  234. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.js +4 -4
  235. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.js.map +1 -1
  236. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.d.ts.map +1 -1
  237. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.js +1 -1
  238. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.js.map +1 -1
  239. package/lib/exporters/__tests__/test-defs/png-export-image.d.ts +3 -0
  240. package/lib/exporters/__tests__/test-defs/png-export-image.d.ts.map +1 -0
  241. package/lib/exporters/__tests__/test-defs/png-export-image.js +9 -0
  242. package/lib/exporters/__tests__/test-defs/png-export-image.js.map +1 -0
  243. package/lib/exporters/__tests__/test-defs/svg-export-image.d.ts +3 -0
  244. package/lib/exporters/__tests__/test-defs/svg-export-image.d.ts.map +1 -0
  245. package/lib/exporters/__tests__/test-defs/svg-export-image.js +54 -0
  246. package/lib/exporters/__tests__/test-defs/svg-export-image.js.map +1 -0
  247. package/lib/exporters/react-svg-export-image.js +2 -2
  248. package/lib/exporters/react-svg-export-image.js.map +1 -1
  249. package/lib/model/__tests__/color/test-defs/color-from-string-6-digits.d.ts +3 -0
  250. package/lib/model/__tests__/color/test-defs/color-from-string-6-digits.d.ts.map +1 -0
  251. package/lib/model/__tests__/color/test-defs/color-from-string-6-digits.js +66 -0
  252. package/lib/model/__tests__/color/test-defs/color-from-string-6-digits.js.map +1 -0
  253. package/lib/model/component.d.ts +3 -2
  254. package/lib/model/component.d.ts.map +1 -1
  255. package/lib/model/component.js +12 -11
  256. package/lib/model/component.js.map +1 -1
  257. package/package.json +2 -2
  258. package/src/__stories__/react-svg-export/example-1.stories.tsx +54 -53
  259. package/src/__stories__/svg-export/example-1.stories.tsx +42 -42
  260. package/src/exporters/__tests__/dxf2d-export-image/export-test-def.ts +11 -11
  261. package/src/exporters/__tests__/dxf2d-export-image/export.test.tsx +13 -13
  262. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-ellipse.ts +405 -405
  263. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.ts +166 -165
  264. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-line.ts +80 -80
  265. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polygon.ts +114 -114
  266. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polyline.ts +103 -103
  267. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-rectangle.ts +125 -125
  268. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.ts +214 -210
  269. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.ts +97 -96
  270. package/src/exporters/__tests__/eps-export-image/export-test-def.ts +11 -11
  271. package/src/exporters/__tests__/eps-export-image/export.test.tsx +13 -13
  272. package/src/exporters/__tests__/eps-export-image/test-defs/eps-ellipse.ts +50 -50
  273. package/src/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.ts +60 -59
  274. package/src/exporters/__tests__/eps-export-image/test-defs/eps-group.ts +74 -73
  275. package/src/exporters/__tests__/eps-export-image/test-defs/eps-line.ts +45 -45
  276. package/src/exporters/__tests__/eps-export-image/test-defs/eps-polygon.ts +65 -65
  277. package/src/exporters/__tests__/eps-export-image/test-defs/eps-polyline.ts +58 -58
  278. package/src/exporters/__tests__/eps-export-image/test-defs/eps-rectangle.ts +46 -46
  279. package/src/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.ts +138 -134
  280. package/src/exporters/__tests__/eps-export-image/test-defs/eps-text.ts +60 -59
  281. package/src/exporters/__tests__/exception/png-unsupported.test.tsx +25 -25
  282. package/src/exporters/__tests__/exception/react-svg-direction-exception.test.tsx +65 -63
  283. package/src/exporters/__tests__/exception/svg-direction-exception.test.tsx +65 -63
  284. package/src/exporters/__tests__/png-export-image/export-test-def.ts +11 -11
  285. package/src/exporters/__tests__/png-export-image/export.test.tsx +13 -13
  286. package/src/exporters/__tests__/png-export-image/test-defs/png-createPNG.tsx +26 -26
  287. package/src/exporters/__tests__/react-svg-export-image/export-test-def.tsx +13 -13
  288. package/src/exporters/__tests__/react-svg-export-image/export.test.tsx +13 -13
  289. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary-png.tsx +27 -27
  290. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary.tsx +26 -26
  291. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.tsx +60 -59
  292. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-ellipse.tsx +28 -28
  293. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.tsx +35 -34
  294. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.tsx +44 -43
  295. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-line.tsx +26 -26
  296. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-polygon.tsx +32 -32
  297. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-polyline.tsx +33 -33
  298. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-rectangle.tsx +27 -27
  299. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.tsx +36 -35
  300. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.tsx +80 -76
  301. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.tsx +35 -34
  302. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.tsx +35 -34
  303. package/src/exporters/__tests__/svg-export-image/export-test-def.ts +11 -11
  304. package/src/exporters/__tests__/svg-export-image/export.test.tsx +13 -13
  305. package/src/exporters/__tests__/svg-export-image/test-defs/svg-binary.tsx +26 -26
  306. package/src/exporters/__tests__/svg-export-image/test-defs/svg-ellipse.ts +27 -27
  307. package/src/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.ts +34 -33
  308. package/src/exporters/__tests__/svg-export-image/test-defs/svg-group.ts +44 -43
  309. package/src/exporters/__tests__/svg-export-image/test-defs/svg-line.ts +26 -26
  310. package/src/exporters/__tests__/svg-export-image/test-defs/svg-polygon.ts +32 -32
  311. package/src/exporters/__tests__/svg-export-image/test-defs/svg-polyline.ts +33 -33
  312. package/src/exporters/__tests__/svg-export-image/test-defs/svg-rectangle.ts +27 -27
  313. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.ts +80 -76
  314. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text.ts +35 -34
  315. package/src/exporters/dxf2d-export-image.ts +218 -218
  316. package/src/exporters/eps-export-image.ts +154 -154
  317. package/src/exporters/index.ts +3 -3
  318. package/src/exporters/png-export-image.ts +12 -12
  319. package/src/exporters/react-svg-export-image.tsx +298 -298
  320. package/src/exporters/svg-export-image.ts +334 -334
  321. package/src/index.ts +11 -11
  322. package/src/model/__tests__/color/export-test-def.ts +13 -13
  323. package/src/model/__tests__/color/export.test.tsx +14 -14
  324. package/src/model/__tests__/color/test-defs/color-from-string.ts +46 -46
  325. package/src/model/__tests__/color/test-defs/color-to-string.ts +35 -35
  326. package/src/model/__tests__/color/test-defs/color-undefined-2.ts +8 -8
  327. package/src/model/__tests__/color/test-defs/color-undefined.ts +8 -8
  328. package/src/model/abstract-image.ts +25 -25
  329. package/src/model/color.ts +52 -52
  330. package/src/model/component.ts +266 -279
  331. package/src/model/index.ts +5 -5
  332. package/src/model/point.ts +11 -11
  333. package/src/model/size.ts +11 -11
@@ -1,298 +1,298 @@
1
- import * as R from "ramda";
2
- import * as React from "react";
3
- import * as AbstractImage from "../model/index";
4
-
5
- export interface ReactSvgCallbacks {
6
- readonly onClick?: MouseCallback;
7
- readonly onDoubleClick?: MouseCallback;
8
- readonly onMouseMove?: MouseCallback;
9
- readonly onContextMenu?: MouseCallback;
10
- }
11
-
12
- export type MouseCallback = (id: string | undefined, point: AbstractImage.Point) => void;
13
-
14
- export function createReactSvg(
15
- image: AbstractImage.AbstractImage,
16
- callbacks?: ReactSvgCallbacks
17
- ): React.ReactElement<{}> {
18
- const cb = callbacks || {};
19
- const id = "ai_root";
20
- return (
21
- <svg
22
- id={id}
23
- width={`${image.size.width}px`}
24
- height={`${image.size.height}px`}
25
- viewBox={[0, 0, image.size.width, image.size.height].join(" ")}
26
- onClick={_callback(cb.onClick, id)}
27
- onDoubleClick={_callback(cb.onDoubleClick, id)}
28
- onMouseMove={_callback(cb.onMouseMove, id)}
29
- onContextMenu={_callback(cb.onContextMenu, id)}
30
- >
31
- {R.unnest(
32
- R.addIndex(R.map)(
33
- // tslint:disable-next-line:no-any
34
- (c, i) => _visit(i.toString(), c as any),
35
- image.components
36
- )
37
- )}
38
- </svg>
39
- );
40
- }
41
-
42
- function _callback(callback: MouseCallback | undefined, rootId: string): React.MouseEventHandler<Element> | undefined {
43
- if (!callback) {
44
- return undefined;
45
- }
46
- return (e: React.MouseEvent<Element>) => {
47
- const rect = e.currentTarget.getBoundingClientRect();
48
- const offsetX = e.clientX - rect.left;
49
- const offsetY = e.clientY - rect.top;
50
- const mousePoint = AbstractImage.createPoint(offsetX, offsetY);
51
- const id = getIdAttr(e.target as Element, rootId);
52
- callback(id && id !== "" ? id : undefined, mousePoint);
53
- };
54
- }
55
-
56
- function makeIdAttr(id: string | undefined): string | undefined {
57
- if (!id) {
58
- return undefined;
59
- }
60
- return `ai%${id}`;
61
- }
62
-
63
- function getIdAttr(target: Element | undefined, rootId: string): string | undefined {
64
- if (!target || target.id === rootId) {
65
- return undefined;
66
- }
67
- const id = target.id;
68
- const parts = id.split("%");
69
- if (parts.length !== 2 || parts[0] !== "ai") {
70
- return getIdAttr((target.parentNode as Element) || undefined, rootId);
71
- }
72
- return parts[1];
73
- }
74
-
75
- function _visit(key: string, component: AbstractImage.Component): Array<React.ReactElement<{}>> {
76
- switch (component.type) {
77
- case "group":
78
- return [
79
- <g key={key} name={component.name}>
80
- {R.unnest(
81
- R.addIndex(R.map)(
82
- // tslint:disable-next-line:no-any
83
- (c, i) => _visit(i.toString(), c as any),
84
- component.children
85
- )
86
- )}
87
- </g>,
88
- ];
89
- case "binaryimage":
90
- switch (component.format) {
91
- case "svg":
92
- return [
93
- <g
94
- key={key}
95
- id={makeIdAttr(component.id)}
96
- dangerouslySetInnerHTML={{
97
- __html: component.data.reduce((a, b) => a + String.fromCharCode(b), ""),
98
- }}
99
- />,
100
- ];
101
- default:
102
- return [];
103
- }
104
- case "line":
105
- return [
106
- <line
107
- id={makeIdAttr(component.id)}
108
- key={key}
109
- x1={component.start.x}
110
- y1={component.start.y}
111
- x2={component.end.x}
112
- y2={component.end.y}
113
- stroke={colorToRgb(component.strokeColor)}
114
- strokeWidth={component.strokeThickness}
115
- strokeOpacity={colorToOpacity(component.strokeColor)}
116
- />,
117
- ];
118
- case "text":
119
- if (!component.text) {
120
- return [];
121
- }
122
- const lineHeight = component.fontSize;
123
-
124
- const shadowStyle = {
125
- textAnchor: getTextAnchor(component.horizontalGrowthDirection),
126
- fontSize: component.fontSize.toString() + "px",
127
- fontWeight: component.fontWeight,
128
- fontFamily: component.fontFamily,
129
- stroke: colorToRgb(component.strokeColor),
130
- strokeWidth: component.strokeThickness,
131
- };
132
- const style = {
133
- textAnchor: getTextAnchor(component.horizontalGrowthDirection),
134
- fontSize: component.fontSize.toString() + "px",
135
- fontWeight: component.fontWeight,
136
- fontFamily: component.fontFamily,
137
- fill: colorToRgb(component.textColor),
138
- };
139
- const dy = getBaselineAdjustment(component.verticalGrowthDirection);
140
-
141
- const transform =
142
- "rotate(" +
143
- component.clockwiseRotationDegrees.toString() +
144
- " " +
145
- component.position.x.toString() +
146
- " " +
147
- component.position.y.toString() +
148
- ")";
149
-
150
- const lines: Array<string> = component.text !== null ? component.text.split("\n") : [];
151
- const tSpans = lines.map((t) =>
152
- renderLine(
153
- t,
154
- component.position.x,
155
- component.position.y + (lines.indexOf(t) + dy) * lineHeight,
156
- component.fontSize,
157
- lineHeight
158
- )
159
- );
160
- let cs: Array<React.ReactElement<{}>> = [];
161
- if (component.strokeThickness > 0 && component.strokeColor) {
162
- cs.push(
163
- <text key={key + "shadow"} style={shadowStyle} transform={transform}>
164
- {tSpans}
165
- </text>
166
- );
167
- }
168
- cs.push(
169
- <text key={key} style={style} transform={transform}>
170
- {tSpans}
171
- </text>
172
- );
173
- return cs;
174
- case "ellipse":
175
- const rx = Math.abs(component.bottomRight.x - component.topLeft.x) * 0.5;
176
- const ry = Math.abs(component.bottomRight.y - component.topLeft.y) * 0.5;
177
- const cx = (component.bottomRight.x + component.topLeft.x) * 0.5;
178
- const cy = (component.bottomRight.y + component.topLeft.y) * 0.5;
179
- return [
180
- <ellipse
181
- id={makeIdAttr(component.id)}
182
- key={key}
183
- cx={cx}
184
- cy={cy}
185
- rx={rx}
186
- ry={ry}
187
- stroke={colorToRgb(component.strokeColor)}
188
- strokeWidth={component.strokeThickness}
189
- strokeOpacity={colorToOpacity(component.strokeColor)}
190
- fillOpacity={colorToOpacity(component.fillColor)}
191
- fill={colorToRgb(component.fillColor)}
192
- />,
193
- ];
194
- case "polyline":
195
- let linePoints = component.points.map((p) => p.x.toString() + "," + p.y.toString()).join(" ");
196
- return [
197
- <polyline
198
- id={makeIdAttr(component.id)}
199
- key={key}
200
- points={linePoints}
201
- stroke={colorToRgb(component.strokeColor)}
202
- strokeWidth={component.strokeThickness}
203
- strokeOpacity={colorToOpacity(component.strokeColor)}
204
- fill="none"
205
- />,
206
- ];
207
- case "polygon":
208
- let points = component.points.map((p) => p.x.toString() + "," + p.y.toString()).join(" ");
209
- return [
210
- <polygon
211
- id={makeIdAttr(component.id)}
212
- key={key}
213
- points={points}
214
- stroke={colorToRgb(component.strokeColor)}
215
- strokeWidth={component.strokeThickness}
216
- strokeOpacity={colorToOpacity(component.strokeColor)}
217
- fillOpacity={colorToOpacity(component.fillColor)}
218
- fill={colorToRgb(component.fillColor)}
219
- />,
220
- ];
221
- case "rectangle":
222
- return [
223
- <rect
224
- id={makeIdAttr(component.id)}
225
- key={key}
226
- x={component.topLeft.x}
227
- y={component.topLeft.y}
228
- width={Math.abs(component.bottomRight.x - component.topLeft.x)}
229
- height={Math.abs(component.bottomRight.y - component.topLeft.y)}
230
- stroke={colorToRgb(component.strokeColor)}
231
- strokeWidth={component.strokeThickness}
232
- strokeOpacity={colorToOpacity(component.strokeColor)}
233
- fillOpacity={colorToOpacity(component.fillColor)}
234
- fill={colorToRgb(component.fillColor)}
235
- />,
236
- ];
237
- default:
238
- return [];
239
- }
240
- }
241
-
242
- function renderLine(text: string, x: number, y: number, fontSize: number, lineHeight: number): JSX.Element {
243
- const split = R.unnest<string>(text.split("<sub>").map((t) => t.split("</sub>")));
244
- let inside = false;
245
- const tags: Array<JSX.Element> = [];
246
- for (let i = 0; i < split.length; ++i) {
247
- const splitText = split[i];
248
- if (inside) {
249
- tags.push(
250
- <tspan key={i} baselineShift="sub" style={{ fontSize: (fontSize * 0.8).toString() + "px" }}>
251
- {splitText}
252
- </tspan>
253
- );
254
- } else {
255
- tags.push(<tspan key={i}>{splitText}</tspan>);
256
- }
257
- inside = !inside;
258
- }
259
- return (
260
- <tspan key={text} x={x} y={y} height={lineHeight.toString() + "px"}>
261
- {tags}
262
- </tspan>
263
- );
264
- }
265
-
266
- function getBaselineAdjustment(d: AbstractImage.GrowthDirection): number {
267
- if (d === "up") {
268
- return 0.0;
269
- }
270
- if (d === "uniform") {
271
- return 0.5;
272
- }
273
- if (d === "down") {
274
- return 1.0;
275
- }
276
- throw "Unknown text alignment " + d;
277
- }
278
-
279
- function getTextAnchor(d: AbstractImage.GrowthDirection): "end" | "middle" | "start" {
280
- if (d === "left") {
281
- return "end";
282
- }
283
- if (d === "uniform") {
284
- return "middle";
285
- }
286
- if (d === "right") {
287
- return "start";
288
- }
289
- throw "Unknown text alignment " + d;
290
- }
291
-
292
- function colorToRgb(color: AbstractImage.Color): string {
293
- return "rgb(" + color.r.toString() + "," + color.g.toString() + "," + color.b.toString() + ")";
294
- }
295
-
296
- function colorToOpacity(color: AbstractImage.Color): string {
297
- return (color.a / 255).toString();
298
- }
1
+ import * as R from "ramda";
2
+ import * as React from "react";
3
+ import * as AbstractImage from "../model/index";
4
+
5
+ export interface ReactSvgCallbacks {
6
+ readonly onClick?: MouseCallback;
7
+ readonly onDoubleClick?: MouseCallback;
8
+ readonly onMouseMove?: MouseCallback;
9
+ readonly onContextMenu?: MouseCallback;
10
+ }
11
+
12
+ export type MouseCallback = (id: string | undefined, point: AbstractImage.Point) => void;
13
+
14
+ export function createReactSvg(
15
+ image: AbstractImage.AbstractImage,
16
+ callbacks?: ReactSvgCallbacks
17
+ ): React.ReactElement<{}> {
18
+ const cb = callbacks || {};
19
+ const id = "ai_root";
20
+ return (
21
+ <svg
22
+ id={id}
23
+ width={`${image.size.width}px`}
24
+ height={`${image.size.height}px`}
25
+ viewBox={[0, 0, image.size.width, image.size.height].join(" ")}
26
+ onClick={_callback(cb.onClick, id)}
27
+ onDoubleClick={_callback(cb.onDoubleClick, id)}
28
+ onMouseMove={_callback(cb.onMouseMove, id)}
29
+ onContextMenu={_callback(cb.onContextMenu, id)}
30
+ >
31
+ {R.unnest(
32
+ R.addIndex(R.map)(
33
+ // tslint:disable-next-line:no-any
34
+ (c, i) => _visit(i.toString(), c as any),
35
+ image.components
36
+ )
37
+ )}
38
+ </svg>
39
+ );
40
+ }
41
+
42
+ function _callback(callback: MouseCallback | undefined, rootId: string): React.MouseEventHandler<Element> | undefined {
43
+ if (!callback) {
44
+ return undefined;
45
+ }
46
+ return (e: React.MouseEvent<Element>) => {
47
+ const rect = e.currentTarget.getBoundingClientRect();
48
+ const offsetX = e.clientX - rect.left;
49
+ const offsetY = e.clientY - rect.top;
50
+ const mousePoint = AbstractImage.createPoint(offsetX, offsetY);
51
+ const id = getIdAttr(e.target as Element, rootId);
52
+ callback(id && id !== "" ? id : undefined, mousePoint);
53
+ };
54
+ }
55
+
56
+ function makeIdAttr(id: string | undefined): string | undefined {
57
+ if (!id) {
58
+ return undefined;
59
+ }
60
+ return `ai%${id}`;
61
+ }
62
+
63
+ function getIdAttr(target: Element | undefined, rootId: string): string | undefined {
64
+ if (!target || target.id === rootId) {
65
+ return undefined;
66
+ }
67
+ const id = target.id;
68
+ const parts = id.split("%");
69
+ if (parts.length !== 2 || parts[0] !== "ai") {
70
+ return getIdAttr((target.parentNode as Element) || undefined, rootId);
71
+ }
72
+ return parts[1];
73
+ }
74
+
75
+ function _visit(key: string, component: AbstractImage.Component): Array<React.ReactElement<{}>> {
76
+ switch (component.type) {
77
+ case "group":
78
+ return [
79
+ <g key={key} name={component.name}>
80
+ {R.unnest(
81
+ R.addIndex(R.map)(
82
+ // tslint:disable-next-line:no-any
83
+ (c, i) => _visit(i.toString(), c as any),
84
+ component.children
85
+ )
86
+ )}
87
+ </g>,
88
+ ];
89
+ case "binaryimage":
90
+ switch (component.format) {
91
+ case "svg":
92
+ return [
93
+ <g
94
+ key={key}
95
+ id={makeIdAttr(component.id)}
96
+ dangerouslySetInnerHTML={{
97
+ __html: component.data.reduce((a, b) => a + String.fromCharCode(b), ""),
98
+ }}
99
+ />,
100
+ ];
101
+ default:
102
+ return [];
103
+ }
104
+ case "line":
105
+ return [
106
+ <line
107
+ id={makeIdAttr(component.id)}
108
+ key={key}
109
+ x1={component.start.x}
110
+ y1={component.start.y}
111
+ x2={component.end.x}
112
+ y2={component.end.y}
113
+ stroke={colorToRgb(component.strokeColor)}
114
+ strokeWidth={component.strokeThickness}
115
+ strokeOpacity={colorToOpacity(component.strokeColor)}
116
+ />,
117
+ ];
118
+ case "text":
119
+ if (!component.text) {
120
+ return [];
121
+ }
122
+ const lineHeight = component.fontSize;
123
+
124
+ const shadowStyle = {
125
+ textAnchor: getTextAnchor(component.horizontalGrowthDirection),
126
+ fontSize: component.fontSize.toString() + "px",
127
+ fontWeight: component.fontWeight === "mediumBold" ? "bold" : component.fontWeight,
128
+ fontFamily: component.fontFamily,
129
+ stroke: colorToRgb(component.strokeColor),
130
+ strokeWidth: component.strokeThickness,
131
+ };
132
+ const style = {
133
+ textAnchor: getTextAnchor(component.horizontalGrowthDirection),
134
+ fontSize: component.fontSize.toString() + "px",
135
+ fontWeight: component.fontWeight === "mediumBold" ? "bold" : component.fontWeight,
136
+ fontFamily: component.fontFamily,
137
+ fill: colorToRgb(component.textColor),
138
+ };
139
+ const dy = getBaselineAdjustment(component.verticalGrowthDirection);
140
+
141
+ const transform =
142
+ "rotate(" +
143
+ component.clockwiseRotationDegrees.toString() +
144
+ " " +
145
+ component.position.x.toString() +
146
+ " " +
147
+ component.position.y.toString() +
148
+ ")";
149
+
150
+ const lines: Array<string> = component.text !== null ? component.text.split("\n") : [];
151
+ const tSpans = lines.map((t) =>
152
+ renderLine(
153
+ t,
154
+ component.position.x,
155
+ component.position.y + (lines.indexOf(t) + dy) * lineHeight,
156
+ component.fontSize,
157
+ lineHeight
158
+ )
159
+ );
160
+ let cs: Array<React.ReactElement<{}>> = [];
161
+ if (component.strokeThickness > 0 && component.strokeColor) {
162
+ cs.push(
163
+ <text key={key + "shadow"} style={shadowStyle} transform={transform}>
164
+ {tSpans}
165
+ </text>
166
+ );
167
+ }
168
+ cs.push(
169
+ <text key={key} style={style} transform={transform}>
170
+ {tSpans}
171
+ </text>
172
+ );
173
+ return cs;
174
+ case "ellipse":
175
+ const rx = Math.abs(component.bottomRight.x - component.topLeft.x) * 0.5;
176
+ const ry = Math.abs(component.bottomRight.y - component.topLeft.y) * 0.5;
177
+ const cx = (component.bottomRight.x + component.topLeft.x) * 0.5;
178
+ const cy = (component.bottomRight.y + component.topLeft.y) * 0.5;
179
+ return [
180
+ <ellipse
181
+ id={makeIdAttr(component.id)}
182
+ key={key}
183
+ cx={cx}
184
+ cy={cy}
185
+ rx={rx}
186
+ ry={ry}
187
+ stroke={colorToRgb(component.strokeColor)}
188
+ strokeWidth={component.strokeThickness}
189
+ strokeOpacity={colorToOpacity(component.strokeColor)}
190
+ fillOpacity={colorToOpacity(component.fillColor)}
191
+ fill={colorToRgb(component.fillColor)}
192
+ />,
193
+ ];
194
+ case "polyline":
195
+ let linePoints = component.points.map((p) => p.x.toString() + "," + p.y.toString()).join(" ");
196
+ return [
197
+ <polyline
198
+ id={makeIdAttr(component.id)}
199
+ key={key}
200
+ points={linePoints}
201
+ stroke={colorToRgb(component.strokeColor)}
202
+ strokeWidth={component.strokeThickness}
203
+ strokeOpacity={colorToOpacity(component.strokeColor)}
204
+ fill="none"
205
+ />,
206
+ ];
207
+ case "polygon":
208
+ let points = component.points.map((p) => p.x.toString() + "," + p.y.toString()).join(" ");
209
+ return [
210
+ <polygon
211
+ id={makeIdAttr(component.id)}
212
+ key={key}
213
+ points={points}
214
+ stroke={colorToRgb(component.strokeColor)}
215
+ strokeWidth={component.strokeThickness}
216
+ strokeOpacity={colorToOpacity(component.strokeColor)}
217
+ fillOpacity={colorToOpacity(component.fillColor)}
218
+ fill={colorToRgb(component.fillColor)}
219
+ />,
220
+ ];
221
+ case "rectangle":
222
+ return [
223
+ <rect
224
+ id={makeIdAttr(component.id)}
225
+ key={key}
226
+ x={component.topLeft.x}
227
+ y={component.topLeft.y}
228
+ width={Math.abs(component.bottomRight.x - component.topLeft.x)}
229
+ height={Math.abs(component.bottomRight.y - component.topLeft.y)}
230
+ stroke={colorToRgb(component.strokeColor)}
231
+ strokeWidth={component.strokeThickness}
232
+ strokeOpacity={colorToOpacity(component.strokeColor)}
233
+ fillOpacity={colorToOpacity(component.fillColor)}
234
+ fill={colorToRgb(component.fillColor)}
235
+ />,
236
+ ];
237
+ default:
238
+ return [];
239
+ }
240
+ }
241
+
242
+ function renderLine(text: string, x: number, y: number, fontSize: number, lineHeight: number): JSX.Element {
243
+ const split = R.unnest<string>(text.split("<sub>").map((t) => t.split("</sub>")));
244
+ let inside = false;
245
+ const tags: Array<JSX.Element> = [];
246
+ for (let i = 0; i < split.length; ++i) {
247
+ const splitText = split[i];
248
+ if (inside) {
249
+ tags.push(
250
+ <tspan key={i} baselineShift="sub" style={{ fontSize: (fontSize * 0.8).toString() + "px" }}>
251
+ {splitText}
252
+ </tspan>
253
+ );
254
+ } else {
255
+ tags.push(<tspan key={i}>{splitText}</tspan>);
256
+ }
257
+ inside = !inside;
258
+ }
259
+ return (
260
+ <tspan key={text} x={x} y={y} height={lineHeight.toString() + "px"}>
261
+ {tags}
262
+ </tspan>
263
+ );
264
+ }
265
+
266
+ function getBaselineAdjustment(d: AbstractImage.GrowthDirection): number {
267
+ if (d === "up") {
268
+ return 0.0;
269
+ }
270
+ if (d === "uniform") {
271
+ return 0.5;
272
+ }
273
+ if (d === "down") {
274
+ return 1.0;
275
+ }
276
+ throw "Unknown text alignment " + d;
277
+ }
278
+
279
+ function getTextAnchor(d: AbstractImage.GrowthDirection): "end" | "middle" | "start" {
280
+ if (d === "left") {
281
+ return "end";
282
+ }
283
+ if (d === "uniform") {
284
+ return "middle";
285
+ }
286
+ if (d === "right") {
287
+ return "start";
288
+ }
289
+ throw "Unknown text alignment " + d;
290
+ }
291
+
292
+ function colorToRgb(color: AbstractImage.Color): string {
293
+ return "rgb(" + color.r.toString() + "," + color.g.toString() + "," + color.b.toString() + ")";
294
+ }
295
+
296
+ function colorToOpacity(color: AbstractImage.Color): string {
297
+ return (color.a / 255).toString();
298
+ }