drawio_dsl 0.5.7 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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