drawio_dsl 0.5.6 → 0.7.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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.data/shapes.json +44 -26
  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/.templates/basic/schema_require.rb +3 -1
  7. data/.builders/blueprint/shapes.rb +9 -5
  8. data/.builders/generators/10-transform-drawio-js.rb +195 -0
  9. data/.builders/generators/20-drawio-extensions.rb +41 -0
  10. data/.builders/generators/project_plans/drawio_dsl.rb +11 -5
  11. data/.builders/generators/project_plans/k_doc.rb +39 -0
  12. data/.builders/generators/sample_diagrams/15-grid-direction.rb +0 -8
  13. data/.builders/generators/sample_diagrams/20-styles.rb +1 -2
  14. data/.builders/generators/sample_diagrams/30-html-shapes.rb +68 -0
  15. data/.rubocop.yml +4 -1
  16. data/CHANGELOG.md +27 -0
  17. data/docs/extensions/analyti_cs.svg +3 -0
  18. data/docs/extensions/android_inputs.svg +3 -0
  19. data/docs/extensions/app_services.svg +3 -0
  20. data/docs/extensions/appliances.svg +3 -0
  21. data/docs/extensions/arrows.svg +3 -0
  22. data/docs/extensions/aws_17___analyti_cs.svg +3 -0
  23. data/docs/extensions/aws_17___application_services.svg +3 -0
  24. data/docs/extensions/aws_17___artificial_intelligence.svg +3 -0
  25. data/docs/extensions/aws_17___business_productivity.svg +3 -0
  26. data/docs/extensions/aws_17___compute.svg +3 -0
  27. data/docs/extensions/aws_17___contact_center.svg +3 -0
  28. data/docs/extensions/aws_17___containers.svg +3 -0
  29. data/docs/extensions/aws_17___database.svg +3 -0
  30. data/docs/extensions/aws_17___desktop_app_straning.svg +3 -0
  31. data/docs/extensions/aws_17___developer_tools.svg +3 -0
  32. data/docs/extensions/aws_17___game_development.svg +3 -0
  33. data/docs/extensions/aws_17___general.svg +3 -0
  34. data/docs/extensions/aws_17___io_t.svg +3 -0
  35. data/docs/extensions/aws_17___management.svg +3 -0
  36. data/docs/extensions/aws_17___messaging.svg +3 -0
  37. data/docs/extensions/aws_17___migration.svg +3 -0
  38. data/docs/extensions/aws_17___mobile_services.svg +3 -0
  39. data/docs/extensions/aws_17___networking_content_delivery.svg +3 -0
  40. data/docs/extensions/aws_17___on_demand_workforce.svg +3 -0
  41. data/docs/extensions/aws_17___sdks.svg +3 -0
  42. data/docs/extensions/aws_17___serurity_identity_and_compliance.svg +3 -0
  43. data/docs/extensions/aws_17___storage.svg +3 -0
  44. data/docs/extensions/aws_19___application_integration.svg +3 -0
  45. data/docs/extensions/aws_19___ar_vr.svg +3 -0
  46. data/docs/extensions/aws_19___blockchain.svg +3 -0
  47. data/docs/extensions/aws_19___business_applications.svg +3 -0
  48. data/docs/extensions/aws_19___compute.svg +3 -0
  49. data/docs/extensions/aws_19___cost_management.svg +3 -0
  50. data/docs/extensions/aws_19___customer_engagement.svg +3 -0
  51. data/docs/extensions/aws_19___database.svg +3 -0
  52. data/docs/extensions/aws_19___desktop_app_streaming.svg +3 -0
  53. data/docs/extensions/aws_19___developer_tools.svg +3 -0
  54. data/docs/extensions/aws_19___ec2_instance_types.svg +3 -0
  55. data/docs/extensions/aws_19___game_tech.svg +3 -0
  56. data/docs/extensions/aws_19___general.svg +3 -0
  57. data/docs/extensions/aws_19___groups_note_repeated_below_without_v2.svg +3 -0
  58. data/docs/extensions/aws_19___internet_of_things.svg +3 -0
  59. data/docs/extensions/aws_19___machine_learning.svg +3 -0
  60. data/docs/extensions/aws_19___management_governance.svg +3 -0
  61. data/docs/extensions/aws_19___media_services.svg +3 -0
  62. data/docs/extensions/aws_19___migration_transfer.svg +3 -0
  63. data/docs/extensions/aws_19___mobile.svg +3 -0
  64. data/docs/extensions/aws_19___networking_content_delivery.svg +3 -0
  65. data/docs/extensions/aws_19___roboti_cs.svg +3 -0
  66. data/docs/extensions/aws_19___satellite.svg +3 -0
  67. data/docs/extensions/aws_19___security_identity_compliance.svg +3 -0
  68. data/docs/extensions/aws_19___storage.svg +3 -0
  69. data/docs/extensions/aws_19_analyti_cs.svg +3 -0
  70. data/docs/extensions/aws_general.svg +3 -0
  71. data/docs/extensions/azure2019.svg +3 -0
  72. data/docs/extensions/azure_cloud.svg +3 -0
  73. data/docs/extensions/azure_enterprise.svg +3 -0
  74. data/docs/extensions/azure_vms.svg +3 -0
  75. data/docs/extensions/basic_network_shapes.svg +3 -0
  76. data/docs/extensions/beds.svg +3 -0
  77. data/docs/extensions/bpmn_2_0.svg +3 -0
  78. data/docs/extensions/cisco_basic.svg +3 -0
  79. data/docs/extensions/cisco_extended.svg +3 -0
  80. data/docs/extensions/common_elements.svg +3 -0
  81. data/docs/extensions/computers_and_monitors.svg +3 -0
  82. data/docs/extensions/containers.svg +3 -0
  83. data/docs/extensions/content_delivery.svg +3 -0
  84. data/docs/extensions/couches.svg +3 -0
  85. data/docs/extensions/cubicle_walls.svg +3 -0
  86. data/docs/extensions/data_flow.svg +3 -0
  87. data/docs/extensions/database.svg +3 -0
  88. data/docs/extensions/deployment.svg +3 -0
  89. data/docs/extensions/desks.svg +3 -0
  90. data/docs/extensions/detailed_network_diagrams.svg +3 -0
  91. data/docs/extensions/developer_tools.svg +3 -0
  92. data/docs/extensions/doors_windows.svg +3 -0
  93. data/docs/extensions/ec2.svg +3 -0
  94. data/docs/extensions/electrical.svg +3 -0
  95. data/docs/extensions/electroni_cs.svg +3 -0
  96. data/docs/extensions/enterprise_application.svg +3 -0
  97. data/docs/extensions/equipment.svg +3 -0
  98. data/docs/extensions/ext_shapes.svg +3 -0
  99. data/docs/extensions/flowchart.svg +3 -0
  100. data/docs/extensions/geometric_shapes.svg +3 -0
  101. data/docs/extensions/google_cloud_platform.svg +3 -0
  102. data/docs/extensions/heat_exchangers.svg +3 -0
  103. data/docs/extensions/i_os_6_i_pad_controls.svg +3 -0
  104. data/docs/extensions/i_os_6_i_pad_elements.svg +3 -0
  105. data/docs/extensions/i_os_6_i_pad_icons.svg +3 -0
  106. data/docs/extensions/i_os_6_i_phone_controls.svg +3 -0
  107. data/docs/extensions/i_os_6_i_phone_elements.svg +3 -0
  108. data/docs/extensions/i_os_6_i_phone_icons.svg +3 -0
  109. data/docs/extensions/i_os_devices.svg +3 -0
  110. data/docs/extensions/i_os_icons.svg +3 -0
  111. data/docs/extensions/i_os_mockups.svg +3 -0
  112. data/docs/extensions/i_os_ui_components.svg +3 -0
  113. data/docs/extensions/i_pad_elements.svg +3 -0
  114. data/docs/extensions/i_phone_elements.svg +3 -0
  115. data/docs/extensions/information.svg +3 -0
  116. data/docs/extensions/instruments.svg +3 -0
  117. data/docs/extensions/internet_of_things.svg +3 -0
  118. data/docs/extensions/kanban.svg +3 -0
  119. data/docs/extensions/kitchen.svg +3 -0
  120. data/docs/extensions/kubernetes_icons.svg +3 -0
  121. data/docs/extensions/logic_gates.svg +3 -0
  122. data/docs/extensions/materials.svg +3 -0
  123. data/docs/extensions/message_routing.svg +3 -0
  124. data/docs/extensions/message_transformation.svg +3 -0
  125. data/docs/extensions/messaging_channels.svg +3 -0
  126. data/docs/extensions/messaging_endpoints.svg +3 -0
  127. data/docs/extensions/messaging_systems.svg +3 -0
  128. data/docs/extensions/mind_map.svg +3 -0
  129. data/docs/extensions/misc.svg +3 -0
  130. data/docs/extensions/misc_floorplan.svg +3 -0
  131. data/docs/extensions/miscellaneous.svg +3 -0
  132. data/docs/extensions/mobile_services.svg +3 -0
  133. data/docs/extensions/network.svg +3 -0
  134. data/docs/extensions/networking.svg +3 -0
  135. data/docs/extensions/on_demand.svg +3 -0
  136. data/docs/extensions/piping.svg +3 -0
  137. data/docs/extensions/power_sources.svg +3 -0
  138. data/docs/extensions/processes.svg +3 -0
  139. data/docs/extensions/pumps.svg +3 -0
  140. data/docs/extensions/repeated_from_the_above.svg +3 -0
  141. data/docs/extensions/restroom.svg +3 -0
  142. data/docs/extensions/s3.svg +3 -0
  143. data/docs/extensions/sdks.svg +3 -0
  144. data/docs/extensions/security_identity.svg +3 -0
  145. data/docs/extensions/server_racks.svg +3 -0
  146. data/docs/extensions/shipments.svg +3 -0
  147. data/docs/extensions/site_map.svg +3 -0
  148. data/docs/extensions/stairs.svg +3 -0
  149. data/docs/extensions/standard.svg +3 -0
  150. data/docs/extensions/system_management.svg +3 -0
  151. data/docs/extensions/tables_chairs.svg +3 -0
  152. data/docs/extensions/technology.svg +3 -0
  153. data/docs/extensions/transistors.svg +3 -0
  154. data/docs/extensions/ui_containers.svg +3 -0
  155. data/docs/extensions/ui_input.svg +3 -0
  156. data/docs/extensions/ui_menus.svg +3 -0
  157. data/docs/extensions/ui_misc.svg +3 -0
  158. data/docs/extensions/ui_widgets.svg +3 -0
  159. data/docs/extensions/uml_class_diagram.svg +3 -0
  160. data/docs/extensions/uml_component.svg +3 -0
  161. data/docs/extensions/uml_entity_relationship.svg +3 -0
  162. data/docs/extensions/uml_sequence.svg +3 -0
  163. data/docs/extensions/uml_state_activity.svg +3 -0
  164. data/docs/extensions/uml_use_case.svg +3 -0
  165. data/docs/extensions/value_stream_mapping.svg +3 -0
  166. data/docs/extensions/valves.svg +3 -0
  167. data/docs/extensions/venn_gradient.svg +3 -0
  168. data/docs/extensions/venn_plain.svg +3 -0
  169. data/docs/extensions/vessels.svg +3 -0
  170. data/docs/extensions.md +614 -0
  171. data/docs/project_done.svg +1 -1
  172. data/docs/project_in_progress.svg +1 -1
  173. data/docs/project_todo.svg +1 -1
  174. data/docs/samples/grid-direction-horizontal.svg +1 -1
  175. data/docs/samples/grid-direction-vertical.svg +1 -1
  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 +12 -8
  184. data/lib/drawio_dsl/dom_builder.rb +23 -8
  185. data/lib/drawio_dsl/dom_builder_shapes.rb +92 -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 +108 -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 +32 -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 +8 -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 +21 -2
  204. data/lib/drawio_dsl/schema/node_list.rb +20 -1
  205. data/lib/drawio_dsl/schema/page.rb +14 -3
  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 +14 -5
  209. data/lib/drawio_dsl/schema/virtual/anchor.rb +26 -0
  210. data/lib/drawio_dsl/version.rb +1 -1
  211. data/lib/drawio_dsl/xml_builder.rb +4 -8
  212. data/lib/drawio_dsl.rb +3 -0
  213. data/package-lock.json +2 -2
  214. data/package.json +1 -1
  215. 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(39)
9
9
  when 0
10
10
  h1(**opts)
11
11
  when 1
@@ -37,198 +37,210 @@ 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
+ face(**opts)
79
79
  when 35
80
- embed_col50(**opts)
80
+ triangle(**opts)
81
81
  when 36
82
+ embed_row(**opts)
83
+ when 37
84
+ embed_col50(**opts)
85
+ when 38
82
86
  embed_col200(**opts)
83
87
  end
84
88
  end
85
89
 
86
- def h1(**opts)
87
- builder.add_h1(**opts)
90
+ def h1(**opts, &block)
91
+ builder.add_h1(**opts, &block)
92
+ end
93
+
94
+ def h2(**opts, &block)
95
+ builder.add_h2(**opts, &block)
96
+ end
97
+
98
+ def h3(**opts, &block)
99
+ builder.add_h3(**opts, &block)
88
100
  end
89
101
 
90
- def h2(**opts)
91
- builder.add_h2(**opts)
102
+ def h4(**opts, &block)
103
+ builder.add_h4(**opts, &block)
92
104
  end
93
105
 
94
- def h3(**opts)
95
- builder.add_h3(**opts)
106
+ def h5(**opts, &block)
107
+ builder.add_h5(**opts, &block)
96
108
  end
97
109
 
98
- def h4(**opts)
99
- builder.add_h4(**opts)
110
+ def h6(**opts, &block)
111
+ builder.add_h6(**opts, &block)
100
112
  end
101
113
 
102
- def h5(**opts)
103
- builder.add_h5(**opts)
114
+ def p(**opts, &block)
115
+ builder.add_p(**opts, &block)
104
116
  end
105
117
 
106
- def h6(**opts)
107
- builder.add_h6(**opts)
118
+ def actor(**opts, &block)
119
+ builder.add_actor(**opts, &block)
108
120
  end
109
121
 
110
- def p(**opts)
111
- builder.add_p(**opts)
122
+ def actor2(**opts, &block)
123
+ builder.add_actor2(**opts, &block)
112
124
  end
113
125
 
114
- def actor(**opts)
115
- builder.add_actor(**opts)
126
+ def callout(**opts, &block)
127
+ builder.add_callout(**opts, &block)
116
128
  end
117
129
 
118
- def actor2(**opts)
119
- builder.add_actor2(**opts)
130
+ def callout2(**opts, &block)
131
+ builder.add_callout2(**opts, &block)
120
132
  end
121
133
 
122
- def callout(**opts)
123
- builder.add_callout(**opts)
134
+ def callout3(**opts, &block)
135
+ builder.add_callout3(**opts, &block)
124
136
  end
125
137
 
126
- def callout2(**opts)
127
- builder.add_callout2(**opts)
138
+ def callout4(**opts, &block)
139
+ builder.add_callout4(**opts, &block)
128
140
  end
129
141
 
130
- def callout3(**opts)
131
- builder.add_callout3(**opts)
142
+ def circle(**opts, &block)
143
+ builder.add_circle(**opts, &block)
132
144
  end
133
145
 
134
- def callout4(**opts)
135
- builder.add_callout4(**opts)
146
+ def cloud(**opts, &block)
147
+ builder.add_cloud(**opts, &block)
136
148
  end
137
149
 
138
- def circle(**opts)
139
- builder.add_circle(**opts)
150
+ def container(**opts, &block)
151
+ builder.add_container(**opts, &block)
140
152
  end
141
153
 
142
- def cloud(**opts)
143
- builder.add_cloud(**opts)
154
+ def container2(**opts, &block)
155
+ builder.add_container2(**opts, &block)
144
156
  end
145
157
 
146
- def cross(**opts)
147
- builder.add_cross(**opts)
158
+ def container3(**opts, &block)
159
+ builder.add_container3(**opts, &block)
148
160
  end
149
161
 
150
- def envelop(**opts)
151
- builder.add_envelop(**opts)
162
+ def container4(**opts, &block)
163
+ builder.add_container4(**opts, &block)
152
164
  end
153
165
 
154
- def diamond(**opts)
155
- builder.add_diamond(**opts)
166
+ def cross(**opts, &block)
167
+ builder.add_cross(**opts, &block)
156
168
  end
157
169
 
158
- def document(**opts)
159
- builder.add_document(**opts)
170
+ def envelop(**opts, &block)
171
+ builder.add_envelop(**opts, &block)
160
172
  end
161
173
 
162
- def ellipse(**opts)
163
- builder.add_ellipse(**opts)
174
+ def diamond(**opts, &block)
175
+ builder.add_diamond(**opts, &block)
164
176
  end
165
177
 
166
- def hexagon(**opts)
167
- builder.add_hexagon(**opts)
178
+ def document(**opts, &block)
179
+ builder.add_document(**opts, &block)
168
180
  end
169
181
 
170
- def container(**opts)
171
- builder.add_container(**opts)
182
+ def ellipse(**opts, &block)
183
+ builder.add_ellipse(**opts, &block)
172
184
  end
173
185
 
174
- def container2(**opts)
175
- builder.add_container2(**opts)
186
+ def hexagon(**opts, &block)
187
+ builder.add_hexagon(**opts, &block)
176
188
  end
177
189
 
178
- def container3(**opts)
179
- builder.add_container3(**opts)
190
+ def interface(**opts, &block)
191
+ builder.add_interface(**opts, &block)
180
192
  end
181
193
 
182
- def container4(**opts)
183
- builder.add_container4(**opts)
194
+ def klass(**opts, &block)
195
+ builder.add_klass(**opts, &block)
184
196
  end
185
197
 
186
- def note(**opts)
187
- builder.add_note(**opts)
198
+ def note(**opts, &block)
199
+ builder.add_note(**opts, &block)
188
200
  end
189
201
 
190
- def process(**opts)
191
- builder.add_process(**opts)
202
+ def process(**opts, &block)
203
+ builder.add_process(**opts, &block)
192
204
  end
193
205
 
194
- def rectangle(**opts)
195
- builder.add_rectangle(**opts)
206
+ def rectangle(**opts, &block)
207
+ builder.add_rectangle(**opts, &block)
196
208
  end
197
209
 
198
- def rectangle2(**opts)
199
- builder.add_rectangle2(**opts)
210
+ def rectangle2(**opts, &block)
211
+ builder.add_rectangle2(**opts, &block)
200
212
  end
201
213
 
202
- def square(**opts)
203
- builder.add_square(**opts)
214
+ def square(**opts, &block)
215
+ builder.add_square(**opts, &block)
204
216
  end
205
217
 
206
- def step(**opts)
207
- builder.add_step(**opts)
218
+ def step(**opts, &block)
219
+ builder.add_step(**opts, &block)
208
220
  end
209
221
 
210
- def tick(**opts)
211
- builder.add_tick(**opts)
222
+ def tick(**opts, &block)
223
+ builder.add_tick(**opts, &block)
212
224
  end
213
225
 
214
- def face(**opts)
215
- builder.add_face(**opts)
226
+ def face(**opts, &block)
227
+ builder.add_face(**opts, &block)
216
228
  end
217
229
 
218
- def triangle(**opts)
219
- builder.add_triangle(**opts)
230
+ def triangle(**opts, &block)
231
+ builder.add_triangle(**opts, &block)
220
232
  end
221
233
 
222
- def embed_row(**opts)
223
- builder.add_embed_row(**opts)
234
+ def embed_row(**opts, &block)
235
+ builder.add_embed_row(**opts, &block)
224
236
  end
225
237
 
226
- def embed_col50(**opts)
227
- builder.add_embed_col50(**opts)
238
+ def embed_col50(**opts, &block)
239
+ builder.add_embed_col50(**opts, &block)
228
240
  end
229
241
 
230
- def embed_col200(**opts)
231
- builder.add_embed_col200(**opts)
242
+ def embed_col200(**opts, &block)
243
+ builder.add_embed_col200(**opts, &block)
232
244
  end
233
245
  end
234
246
  # :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,32 @@
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
+ class: DrawioDsl::Formatters::KlassFormatter,
13
+ interface: DrawioDsl::Formatters::InterfaceFormatter
14
+ }.freeze
15
+
16
+ def format(type)
17
+ unless FORMATTERS.key?(type)
18
+ log.error "Unknown formatter type: #{type}"
19
+ @formatter = nil
20
+ return formatter
21
+ end
22
+
23
+ @formatter = FORMATTERS[type].new
24
+ formatter
25
+ end
26
+
27
+ def formatter
28
+ @formatter ||= DrawioDsl::Formatters::BaseFormatter.new
29
+ end
30
+ end
31
+ end
32
+ 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