drawio_dsl 0.5.7 → 0.8.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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.data/shapes.json +49 -22
  3. data/.builders/.templates/basic/dom_builder_shapes.rb +2 -2
  4. data/.builders/.templates/basic/drawio_extensions.rb +57 -0
  5. data/.builders/.templates/basic/drawio_shapes.rb +2 -2
  6. data/.builders/blueprint/shapes.rb +10 -5
  7. data/.builders/generators/10-transform-drawio-js.rb +195 -0
  8. data/.builders/generators/20-drawio-extensions.rb +41 -0
  9. data/.builders/generators/project_plans/drawio_dsl.rb +30 -21
  10. data/.builders/generators/sample_diagrams/15-grid-direction.rb +0 -8
  11. data/.builders/generators/sample_diagrams/20-styles.rb +1 -2
  12. data/.builders/generators/sample_diagrams/30-html-shapes.rb +48 -0
  13. data/.rubocop.yml +1 -0
  14. data/CHANGELOG.md +28 -0
  15. data/docs/extensions/analyti_cs.svg +3 -0
  16. data/docs/extensions/android_inputs.svg +3 -0
  17. data/docs/extensions/app_services.svg +3 -0
  18. data/docs/extensions/appliances.svg +3 -0
  19. data/docs/extensions/arrows.svg +3 -0
  20. data/docs/extensions/aws_17___analyti_cs.svg +3 -0
  21. data/docs/extensions/aws_17___application_services.svg +3 -0
  22. data/docs/extensions/aws_17___artificial_intelligence.svg +3 -0
  23. data/docs/extensions/aws_17___business_productivity.svg +3 -0
  24. data/docs/extensions/aws_17___compute.svg +3 -0
  25. data/docs/extensions/aws_17___contact_center.svg +3 -0
  26. data/docs/extensions/aws_17___containers.svg +3 -0
  27. data/docs/extensions/aws_17___database.svg +3 -0
  28. data/docs/extensions/aws_17___desktop_app_straning.svg +3 -0
  29. data/docs/extensions/aws_17___developer_tools.svg +3 -0
  30. data/docs/extensions/aws_17___game_development.svg +3 -0
  31. data/docs/extensions/aws_17___general.svg +3 -0
  32. data/docs/extensions/aws_17___io_t.svg +3 -0
  33. data/docs/extensions/aws_17___management.svg +3 -0
  34. data/docs/extensions/aws_17___messaging.svg +3 -0
  35. data/docs/extensions/aws_17___migration.svg +3 -0
  36. data/docs/extensions/aws_17___mobile_services.svg +3 -0
  37. data/docs/extensions/aws_17___networking_content_delivery.svg +3 -0
  38. data/docs/extensions/aws_17___on_demand_workforce.svg +3 -0
  39. data/docs/extensions/aws_17___sdks.svg +3 -0
  40. data/docs/extensions/aws_17___serurity_identity_and_compliance.svg +3 -0
  41. data/docs/extensions/aws_17___storage.svg +3 -0
  42. data/docs/extensions/aws_19___application_integration.svg +3 -0
  43. data/docs/extensions/aws_19___ar_vr.svg +3 -0
  44. data/docs/extensions/aws_19___blockchain.svg +3 -0
  45. data/docs/extensions/aws_19___business_applications.svg +3 -0
  46. data/docs/extensions/aws_19___compute.svg +3 -0
  47. data/docs/extensions/aws_19___cost_management.svg +3 -0
  48. data/docs/extensions/aws_19___customer_engagement.svg +3 -0
  49. data/docs/extensions/aws_19___database.svg +3 -0
  50. data/docs/extensions/aws_19___desktop_app_streaming.svg +3 -0
  51. data/docs/extensions/aws_19___developer_tools.svg +3 -0
  52. data/docs/extensions/aws_19___ec2_instance_types.svg +3 -0
  53. data/docs/extensions/aws_19___game_tech.svg +3 -0
  54. data/docs/extensions/aws_19___general.svg +3 -0
  55. data/docs/extensions/aws_19___groups_note_repeated_below_without_v2.svg +3 -0
  56. data/docs/extensions/aws_19___internet_of_things.svg +3 -0
  57. data/docs/extensions/aws_19___machine_learning.svg +3 -0
  58. data/docs/extensions/aws_19___management_governance.svg +3 -0
  59. data/docs/extensions/aws_19___media_services.svg +3 -0
  60. data/docs/extensions/aws_19___migration_transfer.svg +3 -0
  61. data/docs/extensions/aws_19___mobile.svg +3 -0
  62. data/docs/extensions/aws_19___networking_content_delivery.svg +3 -0
  63. data/docs/extensions/aws_19___roboti_cs.svg +3 -0
  64. data/docs/extensions/aws_19___satellite.svg +3 -0
  65. data/docs/extensions/aws_19___security_identity_compliance.svg +3 -0
  66. data/docs/extensions/aws_19___storage.svg +3 -0
  67. data/docs/extensions/aws_19_analyti_cs.svg +3 -0
  68. data/docs/extensions/aws_general.svg +3 -0
  69. data/docs/extensions/azure2019.svg +3 -0
  70. data/docs/extensions/azure_cloud.svg +3 -0
  71. data/docs/extensions/azure_enterprise.svg +3 -0
  72. data/docs/extensions/azure_vms.svg +3 -0
  73. data/docs/extensions/basic_network_shapes.svg +3 -0
  74. data/docs/extensions/beds.svg +3 -0
  75. data/docs/extensions/bpmn_2_0.svg +3 -0
  76. data/docs/extensions/cisco_basic.svg +3 -0
  77. data/docs/extensions/cisco_extended.svg +3 -0
  78. data/docs/extensions/common_elements.svg +3 -0
  79. data/docs/extensions/computers_and_monitors.svg +3 -0
  80. data/docs/extensions/containers.svg +3 -0
  81. data/docs/extensions/content_delivery.svg +3 -0
  82. data/docs/extensions/couches.svg +3 -0
  83. data/docs/extensions/cubicle_walls.svg +3 -0
  84. data/docs/extensions/data_flow.svg +3 -0
  85. data/docs/extensions/database.svg +3 -0
  86. data/docs/extensions/deployment.svg +3 -0
  87. data/docs/extensions/desks.svg +3 -0
  88. data/docs/extensions/detailed_network_diagrams.svg +3 -0
  89. data/docs/extensions/developer_tools.svg +3 -0
  90. data/docs/extensions/doors_windows.svg +3 -0
  91. data/docs/extensions/ec2.svg +3 -0
  92. data/docs/extensions/electrical.svg +3 -0
  93. data/docs/extensions/electroni_cs.svg +3 -0
  94. data/docs/extensions/enterprise_application.svg +3 -0
  95. data/docs/extensions/equipment.svg +3 -0
  96. data/docs/extensions/ext_shapes.svg +3 -0
  97. data/docs/extensions/flowchart.svg +3 -0
  98. data/docs/extensions/geometric_shapes.svg +3 -0
  99. data/docs/extensions/google_cloud_platform.svg +3 -0
  100. data/docs/extensions/heat_exchangers.svg +3 -0
  101. data/docs/extensions/i_os_6_i_pad_controls.svg +3 -0
  102. data/docs/extensions/i_os_6_i_pad_elements.svg +3 -0
  103. data/docs/extensions/i_os_6_i_pad_icons.svg +3 -0
  104. data/docs/extensions/i_os_6_i_phone_controls.svg +3 -0
  105. data/docs/extensions/i_os_6_i_phone_elements.svg +3 -0
  106. data/docs/extensions/i_os_6_i_phone_icons.svg +3 -0
  107. data/docs/extensions/i_os_devices.svg +3 -0
  108. data/docs/extensions/i_os_icons.svg +3 -0
  109. data/docs/extensions/i_os_mockups.svg +3 -0
  110. data/docs/extensions/i_os_ui_components.svg +3 -0
  111. data/docs/extensions/i_pad_elements.svg +3 -0
  112. data/docs/extensions/i_phone_elements.svg +3 -0
  113. data/docs/extensions/information.svg +3 -0
  114. data/docs/extensions/instruments.svg +3 -0
  115. data/docs/extensions/internet_of_things.svg +3 -0
  116. data/docs/extensions/kanban.svg +3 -0
  117. data/docs/extensions/kitchen.svg +3 -0
  118. data/docs/extensions/kubernetes_icons.svg +3 -0
  119. data/docs/extensions/logic_gates.svg +3 -0
  120. data/docs/extensions/materials.svg +3 -0
  121. data/docs/extensions/message_routing.svg +3 -0
  122. data/docs/extensions/message_transformation.svg +3 -0
  123. data/docs/extensions/messaging_channels.svg +3 -0
  124. data/docs/extensions/messaging_endpoints.svg +3 -0
  125. data/docs/extensions/messaging_systems.svg +3 -0
  126. data/docs/extensions/mind_map.svg +3 -0
  127. data/docs/extensions/misc.svg +3 -0
  128. data/docs/extensions/misc_floorplan.svg +3 -0
  129. data/docs/extensions/miscellaneous.svg +3 -0
  130. data/docs/extensions/mobile_services.svg +3 -0
  131. data/docs/extensions/network.svg +3 -0
  132. data/docs/extensions/networking.svg +3 -0
  133. data/docs/extensions/on_demand.svg +3 -0
  134. data/docs/extensions/piping.svg +3 -0
  135. data/docs/extensions/power_sources.svg +3 -0
  136. data/docs/extensions/processes.svg +3 -0
  137. data/docs/extensions/pumps.svg +3 -0
  138. data/docs/extensions/repeated_from_the_above.svg +3 -0
  139. data/docs/extensions/restroom.svg +3 -0
  140. data/docs/extensions/s3.svg +3 -0
  141. data/docs/extensions/sdks.svg +3 -0
  142. data/docs/extensions/security_identity.svg +3 -0
  143. data/docs/extensions/server_racks.svg +3 -0
  144. data/docs/extensions/shipments.svg +3 -0
  145. data/docs/extensions/site_map.svg +3 -0
  146. data/docs/extensions/stairs.svg +3 -0
  147. data/docs/extensions/standard.svg +3 -0
  148. data/docs/extensions/system_management.svg +3 -0
  149. data/docs/extensions/tables_chairs.svg +3 -0
  150. data/docs/extensions/technology.svg +3 -0
  151. data/docs/extensions/transistors.svg +3 -0
  152. data/docs/extensions/ui_containers.svg +3 -0
  153. data/docs/extensions/ui_input.svg +3 -0
  154. data/docs/extensions/ui_menus.svg +3 -0
  155. data/docs/extensions/ui_misc.svg +3 -0
  156. data/docs/extensions/ui_widgets.svg +3 -0
  157. data/docs/extensions/uml_class_diagram.svg +3 -0
  158. data/docs/extensions/uml_component.svg +3 -0
  159. data/docs/extensions/uml_entity_relationship.svg +3 -0
  160. data/docs/extensions/uml_sequence.svg +3 -0
  161. data/docs/extensions/uml_state_activity.svg +3 -0
  162. data/docs/extensions/uml_use_case.svg +3 -0
  163. data/docs/extensions/value_stream_mapping.svg +3 -0
  164. data/docs/extensions/valves.svg +3 -0
  165. data/docs/extensions/venn_gradient.svg +3 -0
  166. data/docs/extensions/venn_plain.svg +3 -0
  167. data/docs/extensions/vessels.svg +3 -0
  168. data/docs/extensions.md +614 -0
  169. data/docs/project_done.svg +1 -1
  170. data/docs/project_in_progress.svg +1 -1
  171. data/docs/project_todo.svg +1 -1
  172. data/docs/samples/grid-direction-horizontal.svg +1 -1
  173. data/docs/samples/grid-direction-vertical.svg +1 -1
  174. data/docs/samples/html-shapes.svg +3 -0
  175. data/docs/samples/samples.md +4 -0
  176. data/docs/samples/samples.svg +1 -1
  177. data/docs/samples/styles-glass.svg +1 -1
  178. data/docs/samples/styles-plain.svg +1 -1
  179. data/docs/samples/styles-rounded.svg +1 -1
  180. data/docs/samples/styles-shadow.svg +1 -1
  181. data/docs/samples/styles-sketch.svg +1 -1
  182. data/docs/samples/themes-random.svg +1 -1
  183. data/lib/drawio_dsl/configuration_shapes.rb +14 -8
  184. data/lib/drawio_dsl/dom_builder.rb +23 -8
  185. data/lib/drawio_dsl/dom_builder_shapes.rb +97 -82
  186. data/lib/drawio_dsl/drawio_extensions.json +14024 -0
  187. data/lib/drawio_dsl/drawio_extensions.rb +4599 -0
  188. data/lib/drawio_dsl/drawio_extensions_active.rb +32 -0
  189. data/lib/drawio_dsl/drawio_shapes.rb +114 -96
  190. data/lib/drawio_dsl/formatters/_.rb +8 -0
  191. data/lib/drawio_dsl/formatters/base_formatter.rb +24 -0
  192. data/lib/drawio_dsl/formatters/factory.rb +33 -0
  193. data/lib/drawio_dsl/formatters/html_builder.rb +84 -0
  194. data/lib/drawio_dsl/formatters/interface_formatter.rb +53 -0
  195. data/lib/drawio_dsl/formatters/klass_formatter.rb +52 -0
  196. data/lib/drawio_dsl/formatters/style_builder.rb +63 -0
  197. data/lib/drawio_dsl/layout_engine.rb +17 -7
  198. data/lib/drawio_dsl/schema/_.rb +7 -4
  199. data/lib/drawio_dsl/schema/diagram.rb +1 -1
  200. data/lib/drawio_dsl/schema/layouts/flex_layout.rb +1 -2
  201. data/lib/drawio_dsl/schema/layouts/grid_layout.rb +1 -2
  202. data/lib/drawio_dsl/schema/layouts/layout.rb +0 -3
  203. data/lib/drawio_dsl/schema/node.rb +16 -3
  204. data/lib/drawio_dsl/schema/node_list.rb +20 -1
  205. data/lib/drawio_dsl/schema/page.rb +14 -7
  206. data/lib/drawio_dsl/schema/shapes/interface.rb +9 -0
  207. data/lib/drawio_dsl/schema/shapes/klass.rb +9 -0
  208. data/lib/drawio_dsl/schema/shapes/shape.rb +25 -11
  209. data/lib/drawio_dsl/schema/shapes/todo.rb +9 -0
  210. data/lib/drawio_dsl/schema/virtual/anchor.rb +2 -0
  211. data/lib/drawio_dsl/version.rb +1 -1
  212. data/lib/drawio_dsl/xml_builder.rb +4 -9
  213. data/lib/drawio_dsl.rb +3 -0
  214. data/package-lock.json +2 -2
  215. data/package.json +1 -1
  216. metadata +174 -2
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module DrawIoExtensionsActive
5
+ def apply_active_flags
6
+ sections.each do |section|
7
+ section[:shapes].each do |shape|
8
+ shape[:active] = check_if_active(shape)
9
+ end
10
+ section[:active] = section[:shapes].any? { |s| s[:active] }
11
+ end
12
+ end
13
+
14
+ def check_if_active(shape)
15
+ style = shape[:style]
16
+
17
+ ban = %w[
18
+ mxCompositeShape
19
+ strokeColor=none;fillColor=none
20
+ shape=image
21
+ shadow=1
22
+ shape=partialRectangle;right=0
23
+ shape=partialRectangle;right=0;left=0
24
+ ]
25
+
26
+ return false if style.empty?
27
+ return false if ban.include?(style)
28
+
29
+ true
30
+ end
31
+ end
32
+ end
@@ -5,7 +5,7 @@ module DrawioDsl
5
5
  # :nocov:
6
6
  module DrawioShapes
7
7
  def random(**opts)
8
- case rand(37)
8
+ case rand(40)
9
9
  when 0
10
10
  h1(**opts)
11
11
  when 1
@@ -37,198 +37,216 @@ module DrawioDsl
37
37
  when 14
38
38
  cloud(**opts)
39
39
  when 15
40
- cross(**opts)
40
+ container(**opts)
41
41
  when 16
42
- envelop(**opts)
42
+ container2(**opts)
43
43
  when 17
44
- diamond(**opts)
44
+ container3(**opts)
45
45
  when 18
46
- document(**opts)
46
+ container4(**opts)
47
47
  when 19
48
- ellipse(**opts)
48
+ cross(**opts)
49
49
  when 20
50
- hexagon(**opts)
50
+ envelop(**opts)
51
51
  when 21
52
- container(**opts)
52
+ diamond(**opts)
53
53
  when 22
54
- container2(**opts)
54
+ document(**opts)
55
55
  when 23
56
- container3(**opts)
56
+ ellipse(**opts)
57
57
  when 24
58
- container4(**opts)
58
+ hexagon(**opts)
59
59
  when 25
60
- note(**opts)
60
+ interface(**opts)
61
61
  when 26
62
- process(**opts)
62
+ klass(**opts)
63
63
  when 27
64
- rectangle(**opts)
64
+ note(**opts)
65
65
  when 28
66
- rectangle2(**opts)
66
+ process(**opts)
67
67
  when 29
68
- square(**opts)
68
+ rectangle(**opts)
69
69
  when 30
70
- step(**opts)
70
+ rectangle2(**opts)
71
71
  when 31
72
- tick(**opts)
72
+ square(**opts)
73
73
  when 32
74
- face(**opts)
74
+ step(**opts)
75
75
  when 33
76
- triangle(**opts)
76
+ tick(**opts)
77
77
  when 34
78
- embed_row(**opts)
78
+ todo(**opts)
79
79
  when 35
80
- embed_col50(**opts)
80
+ face(**opts)
81
81
  when 36
82
+ triangle(**opts)
83
+ when 37
84
+ embed_row(**opts)
85
+ when 38
86
+ embed_col50(**opts)
87
+ when 39
82
88
  embed_col200(**opts)
83
89
  end
84
90
  end
85
91
 
86
- def h1(**opts)
87
- builder.add_h1(**opts)
92
+ def h1(**opts, &block)
93
+ builder.add_h1(**opts, &block)
94
+ end
95
+
96
+ def h2(**opts, &block)
97
+ builder.add_h2(**opts, &block)
98
+ end
99
+
100
+ def h3(**opts, &block)
101
+ builder.add_h3(**opts, &block)
102
+ end
103
+
104
+ def h4(**opts, &block)
105
+ builder.add_h4(**opts, &block)
88
106
  end
89
107
 
90
- def h2(**opts)
91
- builder.add_h2(**opts)
108
+ def h5(**opts, &block)
109
+ builder.add_h5(**opts, &block)
92
110
  end
93
111
 
94
- def h3(**opts)
95
- builder.add_h3(**opts)
112
+ def h6(**opts, &block)
113
+ builder.add_h6(**opts, &block)
96
114
  end
97
115
 
98
- def h4(**opts)
99
- builder.add_h4(**opts)
116
+ def p(**opts, &block)
117
+ builder.add_p(**opts, &block)
100
118
  end
101
119
 
102
- def h5(**opts)
103
- builder.add_h5(**opts)
120
+ def actor(**opts, &block)
121
+ builder.add_actor(**opts, &block)
104
122
  end
105
123
 
106
- def h6(**opts)
107
- builder.add_h6(**opts)
124
+ def actor2(**opts, &block)
125
+ builder.add_actor2(**opts, &block)
108
126
  end
109
127
 
110
- def p(**opts)
111
- builder.add_p(**opts)
128
+ def callout(**opts, &block)
129
+ builder.add_callout(**opts, &block)
112
130
  end
113
131
 
114
- def actor(**opts)
115
- builder.add_actor(**opts)
132
+ def callout2(**opts, &block)
133
+ builder.add_callout2(**opts, &block)
116
134
  end
117
135
 
118
- def actor2(**opts)
119
- builder.add_actor2(**opts)
136
+ def callout3(**opts, &block)
137
+ builder.add_callout3(**opts, &block)
120
138
  end
121
139
 
122
- def callout(**opts)
123
- builder.add_callout(**opts)
140
+ def callout4(**opts, &block)
141
+ builder.add_callout4(**opts, &block)
124
142
  end
125
143
 
126
- def callout2(**opts)
127
- builder.add_callout2(**opts)
144
+ def circle(**opts, &block)
145
+ builder.add_circle(**opts, &block)
128
146
  end
129
147
 
130
- def callout3(**opts)
131
- builder.add_callout3(**opts)
148
+ def cloud(**opts, &block)
149
+ builder.add_cloud(**opts, &block)
132
150
  end
133
151
 
134
- def callout4(**opts)
135
- builder.add_callout4(**opts)
152
+ def container(**opts, &block)
153
+ builder.add_container(**opts, &block)
136
154
  end
137
155
 
138
- def circle(**opts)
139
- builder.add_circle(**opts)
156
+ def container2(**opts, &block)
157
+ builder.add_container2(**opts, &block)
140
158
  end
141
159
 
142
- def cloud(**opts)
143
- builder.add_cloud(**opts)
160
+ def container3(**opts, &block)
161
+ builder.add_container3(**opts, &block)
144
162
  end
145
163
 
146
- def cross(**opts)
147
- builder.add_cross(**opts)
164
+ def container4(**opts, &block)
165
+ builder.add_container4(**opts, &block)
148
166
  end
149
167
 
150
- def envelop(**opts)
151
- builder.add_envelop(**opts)
168
+ def cross(**opts, &block)
169
+ builder.add_cross(**opts, &block)
152
170
  end
153
171
 
154
- def diamond(**opts)
155
- builder.add_diamond(**opts)
172
+ def envelop(**opts, &block)
173
+ builder.add_envelop(**opts, &block)
156
174
  end
157
175
 
158
- def document(**opts)
159
- builder.add_document(**opts)
176
+ def diamond(**opts, &block)
177
+ builder.add_diamond(**opts, &block)
160
178
  end
161
179
 
162
- def ellipse(**opts)
163
- builder.add_ellipse(**opts)
180
+ def document(**opts, &block)
181
+ builder.add_document(**opts, &block)
164
182
  end
165
183
 
166
- def hexagon(**opts)
167
- builder.add_hexagon(**opts)
184
+ def ellipse(**opts, &block)
185
+ builder.add_ellipse(**opts, &block)
168
186
  end
169
187
 
170
- def container(**opts)
171
- builder.add_container(**opts)
188
+ def hexagon(**opts, &block)
189
+ builder.add_hexagon(**opts, &block)
172
190
  end
173
191
 
174
- def container2(**opts)
175
- builder.add_container2(**opts)
192
+ def interface(**opts, &block)
193
+ builder.add_interface(**opts, &block)
176
194
  end
177
195
 
178
- def container3(**opts)
179
- builder.add_container3(**opts)
196
+ def klass(**opts, &block)
197
+ builder.add_klass(**opts, &block)
180
198
  end
181
199
 
182
- def container4(**opts)
183
- builder.add_container4(**opts)
200
+ def note(**opts, &block)
201
+ builder.add_note(**opts, &block)
184
202
  end
185
203
 
186
- def note(**opts)
187
- builder.add_note(**opts)
204
+ def process(**opts, &block)
205
+ builder.add_process(**opts, &block)
188
206
  end
189
207
 
190
- def process(**opts)
191
- builder.add_process(**opts)
208
+ def rectangle(**opts, &block)
209
+ builder.add_rectangle(**opts, &block)
192
210
  end
193
211
 
194
- def rectangle(**opts)
195
- builder.add_rectangle(**opts)
212
+ def rectangle2(**opts, &block)
213
+ builder.add_rectangle2(**opts, &block)
196
214
  end
197
215
 
198
- def rectangle2(**opts)
199
- builder.add_rectangle2(**opts)
216
+ def square(**opts, &block)
217
+ builder.add_square(**opts, &block)
200
218
  end
201
219
 
202
- def square(**opts)
203
- builder.add_square(**opts)
220
+ def step(**opts, &block)
221
+ builder.add_step(**opts, &block)
204
222
  end
205
223
 
206
- def step(**opts)
207
- builder.add_step(**opts)
224
+ def tick(**opts, &block)
225
+ builder.add_tick(**opts, &block)
208
226
  end
209
227
 
210
- def tick(**opts)
211
- builder.add_tick(**opts)
228
+ def todo(**opts, &block)
229
+ builder.add_todo(**opts, &block)
212
230
  end
213
231
 
214
- def face(**opts)
215
- builder.add_face(**opts)
232
+ def face(**opts, &block)
233
+ builder.add_face(**opts, &block)
216
234
  end
217
235
 
218
- def triangle(**opts)
219
- builder.add_triangle(**opts)
236
+ def triangle(**opts, &block)
237
+ builder.add_triangle(**opts, &block)
220
238
  end
221
239
 
222
- def embed_row(**opts)
223
- builder.add_embed_row(**opts)
240
+ def embed_row(**opts, &block)
241
+ builder.add_embed_row(**opts, &block)
224
242
  end
225
243
 
226
- def embed_col50(**opts)
227
- builder.add_embed_col50(**opts)
244
+ def embed_col50(**opts, &block)
245
+ builder.add_embed_col50(**opts, &block)
228
246
  end
229
247
 
230
- def embed_col200(**opts)
231
- builder.add_embed_col200(**opts)
248
+ def embed_col200(**opts, &block)
249
+ builder.add_embed_col200(**opts, &block)
232
250
  end
233
251
  end
234
252
  # :nocov:
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'style_builder'
4
+ require_relative 'html_builder'
5
+ require_relative 'base_formatter'
6
+ require_relative 'klass_formatter'
7
+ require_relative 'interface_formatter'
8
+ require_relative 'factory'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ class BaseFormatter
9
+ attr_reader :html
10
+
11
+ def initialize(element_style_defaults = {})
12
+ @html = DrawioDsl::Formatters::HtmlBuilder.new(element_style_defaults)
13
+ end
14
+
15
+ def empty?
16
+ html.empty?
17
+ end
18
+
19
+ def as_html(new_line: false)
20
+ html.as_html(new_line: new_line)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ module Factory
9
+ include KLog::Logging
10
+
11
+ FORMATTERS = {
12
+ klass: DrawioDsl::Formatters::KlassFormatter,
13
+ class: DrawioDsl::Formatters::KlassFormatter, # alias for klass
14
+ interface: DrawioDsl::Formatters::InterfaceFormatter
15
+ }.freeze
16
+
17
+ def format_instance(type)
18
+ unless FORMATTERS.key?(type)
19
+ log.error "Unknown formatter type: #{type}"
20
+ @formatter = nil
21
+ return formatter
22
+ end
23
+
24
+ @formatter = FORMATTERS[type].new
25
+ formatter
26
+ end
27
+
28
+ def formatter
29
+ @formatter ||= DrawioDsl::Formatters::BaseFormatter.new
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ class HtmlBuilder
9
+ attr_reader :element_style_defaults
10
+
11
+ def initialize(element_style_defaults = {})
12
+ @element_style_defaults = element_style_defaults
13
+ end
14
+
15
+ def default_for(tag)
16
+ element_style_defaults[tag] || {}
17
+ end
18
+
19
+ def style_for(tag, **opts)
20
+ defaults = default_for(tag)
21
+ DrawioDsl::Formatters::StyleBuilder.new(**defaults).customize(**opts).style_attribute
22
+ end
23
+
24
+ def empty?
25
+ build_lines.empty?
26
+ end
27
+
28
+ def exist?
29
+ !empty?
30
+ end
31
+
32
+ def as_html(new_line: false)
33
+ new_line ? build_lines.join("\n") : build_lines.join
34
+ end
35
+
36
+ def hr(size: 1)
37
+ add_line("<hr size=\"#{size}\"/>")
38
+ end
39
+
40
+ def b(content, **opts)
41
+ add_line("<b#{style_for(:b, **opts)}>#{content}</b>")
42
+ end
43
+
44
+ def p(content, **opts)
45
+ # style_parts = %w[margin:0px margin-top:4px]
46
+ # style_parts << "text-align:#{opts[:text_align]}" if opts[:text_align]
47
+ # style=\"#{style_parts.join(';')}\"
48
+ add_line("<p#{style_for(:p, **opts)}>#{content}</p>")
49
+ end
50
+
51
+ def add_line(line)
52
+ lines << line
53
+ end
54
+
55
+ def add_placeholder(group_key)
56
+ lines << group_key
57
+ end
58
+
59
+ def group(key)
60
+ groups[key] ||= DrawioDsl::Formatters::HtmlBuilder.new(element_style_defaults)
61
+ end
62
+
63
+ def build_lines
64
+ lines.flat_map do |line|
65
+ if line.is_a?(Symbol)
66
+ group(line).build_lines
67
+ else
68
+ line
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def lines
76
+ @lines ||= []
77
+ end
78
+
79
+ def groups
80
+ @groups ||= {}
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ class InterfaceFormatter < BaseFormatter
9
+ def initialize
10
+ super({ p: { margin: '0px', margin_left: '4px', margin_top: '4px' } })
11
+ end
12
+
13
+ def header(value)
14
+ html.p('<i>Interface</i>', text_align: :center)
15
+ html.p("<b>#{value}</b>", text_align: :center)
16
+ html.hr
17
+
18
+ self
19
+ end
20
+
21
+ def field(name, type: nil)
22
+ value = if type
23
+ "#{name}: #{type}"
24
+ else
25
+ name
26
+ end
27
+ html.group(:fields).p(value)
28
+
29
+ self
30
+ end
31
+
32
+ def method(name, type: nil)
33
+ value = if type
34
+ "#{name}() : #{type}"
35
+ else
36
+ "#{name}()"
37
+ end
38
+ html.group(:methods).p(value)
39
+
40
+ self
41
+ end
42
+
43
+ def as_html(new_line: false)
44
+ html.add_placeholder(:fields)
45
+ html.add_placeholder(:methods)
46
+
47
+ html.group(:fields).hr if html.group(:fields).exist? && html.group(:methods).exist?
48
+
49
+ html.as_html(new_line: new_line)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ class KlassFormatter < BaseFormatter
9
+ def initialize
10
+ super({ p: { margin: '0px', margin_left: '4px', margin_top: '4px' } })
11
+ end
12
+
13
+ def header(value)
14
+ html.p("<b>#{value}</b>", text_align: :center)
15
+ html.hr
16
+
17
+ self
18
+ end
19
+
20
+ def field(name, type: nil)
21
+ value = if type
22
+ "#{name}: #{type}"
23
+ else
24
+ name
25
+ end
26
+ html.group(:fields).p(value)
27
+
28
+ self
29
+ end
30
+
31
+ def method(name, type: nil)
32
+ value = if type
33
+ "#{name}() : #{type}"
34
+ else
35
+ "#{name}()"
36
+ end
37
+ html.group(:methods).p(value)
38
+
39
+ self
40
+ end
41
+
42
+ def as_html(new_line: false)
43
+ html.add_placeholder(:fields)
44
+ html.add_placeholder(:methods)
45
+
46
+ html.group(:fields).hr if html.group(:fields).exist? && html.group(:methods).exist?
47
+
48
+ html.as_html(new_line: new_line)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Work with HTML formatters to DrawIO shapes
4
+ module DrawioDsl
5
+ # HTML formatters can be used on shapes to render HTML using a DSL
6
+ module Formatters
7
+ # Create an instance of a HTML formatter on the shape
8
+ class StyleBuilder
9
+ MAPPINGS = {
10
+ margin: 'margin',
11
+ margin_top: 'margin-top',
12
+ margin_bottom: 'margin-bottom',
13
+ margin_left: 'margin-left',
14
+ margin_right: 'margin-right',
15
+ padding: 'padding',
16
+ padding_top: 'padding-top',
17
+ padding_bottom: 'padding-bottom',
18
+ padding_left: 'padding-left',
19
+ padding_right: 'padding-right',
20
+ text_align: 'text-align',
21
+ font_size: 'font-size',
22
+ font_weight: 'font-weight',
23
+ font_style: 'font-style',
24
+ font_family: 'font-family',
25
+ color: 'color'
26
+ }.freeze
27
+
28
+ attr_reader :defaults
29
+ attr_reader :custom
30
+
31
+ def initialize(**opts)
32
+ @style_parts = []
33
+ @defaults = opts
34
+ @custom = {}
35
+ end
36
+
37
+ def customize(**opts)
38
+ @custom = opts
39
+
40
+ self
41
+ end
42
+
43
+ def style
44
+ build
45
+ @style_parts.join(';')
46
+ end
47
+
48
+ def style_attribute
49
+ style_value = style
50
+ style_value.empty? ? nil : " style=\"#{style_value}\""
51
+ end
52
+
53
+ private
54
+
55
+ def build
56
+ defaults.merge(custom).each do |key, value|
57
+ style_key = MAPPINGS[key]
58
+ @style_parts << "#{style_key}:#{value}" if style_key
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end