drawio_dsl 0.4.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.builders/.data/shapes.json +168 -8
- data/.builders/.templates/basic/configuration_shapes.rb +27 -0
- data/.builders/.templates/basic/dom_builder_shapes.rb +16 -0
- data/.builders/.templates/basic/drawio_shapes.rb +23 -0
- data/.builders/.templates/basic/schema_shape.rb +9 -0
- data/.builders/.templates/{schema_shape_spec.rb → basic/schema_shape_spec.rb} +2 -2
- data/.builders/blueprint/shapes.rb +37 -12
- data/.builders/boot.rb +1 -0
- data/.builders/generators/02-generate-app.rb +43 -0
- data/.builders/generators/sample_diagrams/25-themes.rb +2 -2
- data/.builders/generators/sample_diagrams/30-shapes.rb +23 -0
- data/.builders/generators/sample_diagrams/50-willoughby-council.rb +38 -0
- data/.rubocop.yml +22 -3
- data/CHANGELOG.md +23 -0
- data/README.md +4 -0
- data/lib/drawio_dsl/configuration.rb +5 -101
- data/lib/drawio_dsl/configuration_extension.rb +13 -0
- data/lib/drawio_dsl/configuration_shapes.rb +83 -0
- data/lib/drawio_dsl/configuration_themes.rb +63 -0
- data/lib/drawio_dsl/dom_builder.rb +9 -55
- data/lib/drawio_dsl/dom_builder_shapes.rb +158 -0
- data/lib/drawio_dsl/drawio.rb +1 -91
- data/lib/drawio_dsl/drawio_shapes.rb +193 -0
- data/lib/drawio_dsl/layout_engine.rb +1 -8
- data/lib/drawio_dsl/schema/_.rb +21 -0
- data/lib/drawio_dsl/schema/layouts/grid_layout.rb +17 -10
- data/lib/drawio_dsl/schema/node_list.rb +37 -0
- data/lib/drawio_dsl/schema/page.rb +5 -5
- data/{.builders/.templates/schema_shape.rb → lib/drawio_dsl/schema/shapes/actor.rb} +2 -2
- data/lib/drawio_dsl/schema/shapes/actor2.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/callout2.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/callout3.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/callout4.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/container.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/container2.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/container3.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/container4.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/cross.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/document.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/embed_col200.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/embed_col50.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/embed_row.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/envelop.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/face.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/rectangle2.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/shape.rb +10 -6
- data/lib/drawio_dsl/schema/shapes/step.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/tick.rb +9 -0
- data/lib/drawio_dsl/schema/shapes/triangle.rb +9 -0
- data/lib/drawio_dsl/version.rb +1 -1
- data/lib/drawio_dsl/xml_builder.rb +2 -12
- data/lib/drawio_dsl.rb +5 -0
- data/package-lock.json +2 -2
- data/package.json +1 -1
- metadata +36 -5
- data/.builders/generators/90-requires.rb +0 -35
@@ -0,0 +1,193 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DrawioDsl
|
4
|
+
# DrawioDsl::Shapes is a list of DSL methods (one per shape)
|
5
|
+
# :nocov:
|
6
|
+
module DrawioShapes
|
7
|
+
def random(**opts)
|
8
|
+
case rand(30)
|
9
|
+
when 0
|
10
|
+
actor(**opts)
|
11
|
+
when 1
|
12
|
+
actor2(**opts)
|
13
|
+
when 2
|
14
|
+
callout(**opts)
|
15
|
+
when 3
|
16
|
+
callout2(**opts)
|
17
|
+
when 4
|
18
|
+
callout3(**opts)
|
19
|
+
when 5
|
20
|
+
callout4(**opts)
|
21
|
+
when 6
|
22
|
+
circle(**opts)
|
23
|
+
when 7
|
24
|
+
cloud(**opts)
|
25
|
+
when 8
|
26
|
+
cross(**opts)
|
27
|
+
when 9
|
28
|
+
envelop(**opts)
|
29
|
+
when 10
|
30
|
+
diamond(**opts)
|
31
|
+
when 11
|
32
|
+
document(**opts)
|
33
|
+
when 12
|
34
|
+
ellipse(**opts)
|
35
|
+
when 13
|
36
|
+
hexagon(**opts)
|
37
|
+
when 14
|
38
|
+
container(**opts)
|
39
|
+
when 15
|
40
|
+
container2(**opts)
|
41
|
+
when 16
|
42
|
+
container3(**opts)
|
43
|
+
when 17
|
44
|
+
container4(**opts)
|
45
|
+
when 18
|
46
|
+
note(**opts)
|
47
|
+
when 19
|
48
|
+
process(**opts)
|
49
|
+
when 20
|
50
|
+
rectangle(**opts)
|
51
|
+
when 21
|
52
|
+
rectangle2(**opts)
|
53
|
+
when 22
|
54
|
+
square(**opts)
|
55
|
+
when 23
|
56
|
+
step(**opts)
|
57
|
+
when 24
|
58
|
+
tick(**opts)
|
59
|
+
when 25
|
60
|
+
face(**opts)
|
61
|
+
when 26
|
62
|
+
triangle(**opts)
|
63
|
+
when 27
|
64
|
+
embed_row(**opts)
|
65
|
+
when 28
|
66
|
+
embed_col50(**opts)
|
67
|
+
when 29
|
68
|
+
embed_col200(**opts)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def actor(**opts)
|
73
|
+
builder.add_actor(**opts)
|
74
|
+
end
|
75
|
+
|
76
|
+
def actor2(**opts)
|
77
|
+
builder.add_actor2(**opts)
|
78
|
+
end
|
79
|
+
|
80
|
+
def callout(**opts)
|
81
|
+
builder.add_callout(**opts)
|
82
|
+
end
|
83
|
+
|
84
|
+
def callout2(**opts)
|
85
|
+
builder.add_callout2(**opts)
|
86
|
+
end
|
87
|
+
|
88
|
+
def callout3(**opts)
|
89
|
+
builder.add_callout3(**opts)
|
90
|
+
end
|
91
|
+
|
92
|
+
def callout4(**opts)
|
93
|
+
builder.add_callout4(**opts)
|
94
|
+
end
|
95
|
+
|
96
|
+
def circle(**opts)
|
97
|
+
builder.add_circle(**opts)
|
98
|
+
end
|
99
|
+
|
100
|
+
def cloud(**opts)
|
101
|
+
builder.add_cloud(**opts)
|
102
|
+
end
|
103
|
+
|
104
|
+
def cross(**opts)
|
105
|
+
builder.add_cross(**opts)
|
106
|
+
end
|
107
|
+
|
108
|
+
def envelop(**opts)
|
109
|
+
builder.add_envelop(**opts)
|
110
|
+
end
|
111
|
+
|
112
|
+
def diamond(**opts)
|
113
|
+
builder.add_diamond(**opts)
|
114
|
+
end
|
115
|
+
|
116
|
+
def document(**opts)
|
117
|
+
builder.add_document(**opts)
|
118
|
+
end
|
119
|
+
|
120
|
+
def ellipse(**opts)
|
121
|
+
builder.add_ellipse(**opts)
|
122
|
+
end
|
123
|
+
|
124
|
+
def hexagon(**opts)
|
125
|
+
builder.add_hexagon(**opts)
|
126
|
+
end
|
127
|
+
|
128
|
+
def container(**opts)
|
129
|
+
builder.add_container(**opts)
|
130
|
+
end
|
131
|
+
|
132
|
+
def container2(**opts)
|
133
|
+
builder.add_container2(**opts)
|
134
|
+
end
|
135
|
+
|
136
|
+
def container3(**opts)
|
137
|
+
builder.add_container3(**opts)
|
138
|
+
end
|
139
|
+
|
140
|
+
def container4(**opts)
|
141
|
+
builder.add_container4(**opts)
|
142
|
+
end
|
143
|
+
|
144
|
+
def note(**opts)
|
145
|
+
builder.add_note(**opts)
|
146
|
+
end
|
147
|
+
|
148
|
+
def process(**opts)
|
149
|
+
builder.add_process(**opts)
|
150
|
+
end
|
151
|
+
|
152
|
+
def rectangle(**opts)
|
153
|
+
builder.add_rectangle(**opts)
|
154
|
+
end
|
155
|
+
|
156
|
+
def rectangle2(**opts)
|
157
|
+
builder.add_rectangle2(**opts)
|
158
|
+
end
|
159
|
+
|
160
|
+
def square(**opts)
|
161
|
+
builder.add_square(**opts)
|
162
|
+
end
|
163
|
+
|
164
|
+
def step(**opts)
|
165
|
+
builder.add_step(**opts)
|
166
|
+
end
|
167
|
+
|
168
|
+
def tick(**opts)
|
169
|
+
builder.add_tick(**opts)
|
170
|
+
end
|
171
|
+
|
172
|
+
def face(**opts)
|
173
|
+
builder.add_face(**opts)
|
174
|
+
end
|
175
|
+
|
176
|
+
def triangle(**opts)
|
177
|
+
builder.add_triangle(**opts)
|
178
|
+
end
|
179
|
+
|
180
|
+
def embed_row(**opts)
|
181
|
+
builder.add_embed_row(**opts)
|
182
|
+
end
|
183
|
+
|
184
|
+
def embed_col50(**opts)
|
185
|
+
builder.add_embed_col50(**opts)
|
186
|
+
end
|
187
|
+
|
188
|
+
def embed_col200(**opts)
|
189
|
+
builder.add_embed_col200(**opts)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
# :nocov:
|
193
|
+
end
|
@@ -14,22 +14,15 @@ module DrawioDsl
|
|
14
14
|
attr_reader :current_page
|
15
15
|
attr_reader :current_layout
|
16
16
|
|
17
|
-
# attr_reader :page_margin_top
|
18
|
-
# attr_reader :page_margin_left
|
19
|
-
# attr_reader :x
|
20
|
-
# attr_reader :y
|
21
|
-
|
22
17
|
def initialize(page)
|
23
18
|
@page = page
|
24
|
-
# @x = 0
|
25
|
-
# @y = 0
|
26
19
|
end
|
27
20
|
|
28
21
|
def call
|
29
22
|
page.position_x = page.margin_left
|
30
23
|
page.position_y = page.margin_top
|
31
24
|
|
32
|
-
page.nodes.each do |node|
|
25
|
+
page.nodes.all.each do |node|
|
33
26
|
case node.classification
|
34
27
|
when :layout_rule
|
35
28
|
@current_layout = node
|
data/lib/drawio_dsl/schema/_.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative 'common_style'
|
|
4
4
|
require_relative 'default_palette'
|
5
5
|
require_relative 'diagram'
|
6
6
|
require_relative 'node'
|
7
|
+
require_relative 'node_list'
|
7
8
|
require_relative 'page'
|
8
9
|
|
9
10
|
require_relative 'layouts/layout'
|
@@ -11,13 +12,33 @@ require_relative 'layouts/flex_layout'
|
|
11
12
|
require_relative 'layouts/grid_layout'
|
12
13
|
|
13
14
|
require_relative 'shapes/shape'
|
15
|
+
require_relative 'shapes/actor'
|
16
|
+
require_relative 'shapes/actor2'
|
14
17
|
require_relative 'shapes/callout'
|
18
|
+
require_relative 'shapes/callout2'
|
19
|
+
require_relative 'shapes/callout3'
|
20
|
+
require_relative 'shapes/callout4'
|
15
21
|
require_relative 'shapes/circle'
|
16
22
|
require_relative 'shapes/cloud'
|
23
|
+
require_relative 'shapes/cross'
|
24
|
+
require_relative 'shapes/envelop'
|
17
25
|
require_relative 'shapes/diamond'
|
26
|
+
require_relative 'shapes/document'
|
18
27
|
require_relative 'shapes/ellipse'
|
19
28
|
require_relative 'shapes/hexagon'
|
29
|
+
require_relative 'shapes/container'
|
30
|
+
require_relative 'shapes/container2'
|
31
|
+
require_relative 'shapes/container3'
|
32
|
+
require_relative 'shapes/container4'
|
20
33
|
require_relative 'shapes/note'
|
21
34
|
require_relative 'shapes/process'
|
22
35
|
require_relative 'shapes/rectangle'
|
36
|
+
require_relative 'shapes/rectangle2'
|
23
37
|
require_relative 'shapes/square'
|
38
|
+
require_relative 'shapes/step'
|
39
|
+
require_relative 'shapes/tick'
|
40
|
+
require_relative 'shapes/face'
|
41
|
+
require_relative 'shapes/triangle'
|
42
|
+
require_relative 'shapes/embed_row'
|
43
|
+
require_relative 'shapes/embed_col50'
|
44
|
+
require_relative 'shapes/embed_col200'
|
@@ -6,22 +6,28 @@ module DrawioDsl
|
|
6
6
|
class GridLayout < Layout
|
7
7
|
attr_accessor :direction
|
8
8
|
attr_accessor :wrap_at
|
9
|
-
attr_accessor :grid_size
|
9
|
+
attr_accessor :grid_size # this is an alternative to grid_w/grid_h
|
10
|
+
attr_accessor :grid_w
|
11
|
+
attr_accessor :grid_h
|
10
12
|
attr_accessor :cell_no
|
11
13
|
attr_accessor :h_align
|
12
14
|
attr_accessor :v_align
|
13
15
|
|
16
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
14
17
|
def initialize(page, **args)
|
15
18
|
@type = :grid_layout
|
16
19
|
@direction = args[:direction] || :horizontal
|
17
20
|
@wrap_at = args[:wrap_at] || 5
|
18
21
|
@grid_size = args[:grid_size] || 220
|
22
|
+
@grid_w = args[:grid_w] || grid_size
|
23
|
+
@grid_h = args[:grid_h] || grid_size
|
19
24
|
@h_align = args[:h_align] || :center
|
20
25
|
@v_align = args[:v_align] || :center
|
21
26
|
@cell_no = 1
|
22
27
|
|
23
28
|
super(page, **args)
|
24
29
|
end
|
30
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
25
31
|
|
26
32
|
def position_shape(shape)
|
27
33
|
fire_after_init
|
@@ -47,7 +53,8 @@ module DrawioDsl
|
|
47
53
|
super.merge(
|
48
54
|
direction: direction,
|
49
55
|
wrap_at: wrap_at,
|
50
|
-
|
56
|
+
grid_w: grid_w,
|
57
|
+
grid_h: grid_h,
|
51
58
|
cell_no: cell_no
|
52
59
|
)
|
53
60
|
end
|
@@ -56,8 +63,8 @@ module DrawioDsl
|
|
56
63
|
|
57
64
|
# rubocop:disable Metrics/AbcSize
|
58
65
|
def horizontal_shape_alignment(shape)
|
59
|
-
return page.position_x + ((
|
60
|
-
return page.position_x + (
|
66
|
+
return page.position_x + ((grid_w - shape.w) / 2) if h_align == :center
|
67
|
+
return page.position_x + (grid_w - shape.w) if h_align == :right
|
61
68
|
|
62
69
|
page.position_x
|
63
70
|
end
|
@@ -65,8 +72,8 @@ module DrawioDsl
|
|
65
72
|
|
66
73
|
# rubocop:disable Metrics/AbcSize
|
67
74
|
def vertical_shape_alignment(shape)
|
68
|
-
return page.position_y + ((
|
69
|
-
return page.position_y + (
|
75
|
+
return page.position_y + ((grid_h - shape.h) / 2) if v_align == :center || v_align == :middle
|
76
|
+
return page.position_y + (grid_h - shape.h) if v_align == :bottom
|
70
77
|
|
71
78
|
page.position_y
|
72
79
|
end
|
@@ -74,27 +81,27 @@ module DrawioDsl
|
|
74
81
|
|
75
82
|
def move_cell_horizontally
|
76
83
|
if cell_no < wrap_at
|
77
|
-
page.position_x +=
|
84
|
+
page.position_x += grid_w
|
78
85
|
@cell_no += 1
|
79
86
|
return
|
80
87
|
end
|
81
88
|
|
82
89
|
# Flow down to the next row
|
83
90
|
page.position_x = anchor_x
|
84
|
-
page.position_y +=
|
91
|
+
page.position_y += grid_w
|
85
92
|
@cell_no = 1
|
86
93
|
end
|
87
94
|
|
88
95
|
def move_cell_vertically
|
89
96
|
if cell_no < wrap_at
|
90
|
-
page.position_y +=
|
97
|
+
page.position_y += grid_h
|
91
98
|
@cell_no += 1
|
92
99
|
return
|
93
100
|
end
|
94
101
|
|
95
102
|
# Flow right to the next column
|
96
103
|
page.position_y = anchor_y
|
97
|
-
page.position_x +=
|
104
|
+
page.position_x += grid_h
|
98
105
|
@cell_no = 1
|
99
106
|
end
|
100
107
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DrawioDsl
|
4
|
+
module Schema
|
5
|
+
class NodeList
|
6
|
+
attr_reader :nodes
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@nodes = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add(node)
|
13
|
+
@nodes << node
|
14
|
+
end
|
15
|
+
|
16
|
+
def all
|
17
|
+
@nodes
|
18
|
+
end
|
19
|
+
|
20
|
+
def shapes
|
21
|
+
@nodes.select { |node| node.is_a?(DrawioDsl::Schema::Shape) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def layouts
|
25
|
+
@nodes.select { |node| node.is_a?(DrawioDsl::Schema::Layout) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def length
|
29
|
+
@nodes.length
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_h
|
33
|
+
@nodes.map(&:to_h)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -86,13 +86,13 @@ module DrawioDsl
|
|
86
86
|
@gradient ||= theme_palette.gradient
|
87
87
|
end
|
88
88
|
|
89
|
-
@nodes =
|
89
|
+
@nodes = NodeList.new # []
|
90
90
|
end
|
91
91
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
92
92
|
|
93
|
-
def shapes
|
94
|
-
|
95
|
-
end
|
93
|
+
# def shapes
|
94
|
+
# nodes.shapes
|
95
|
+
# end
|
96
96
|
|
97
97
|
def to_h
|
98
98
|
{
|
@@ -104,7 +104,7 @@ module DrawioDsl
|
|
104
104
|
palette: palette.to_h,
|
105
105
|
style: style.to_h,
|
106
106
|
settings: settings,
|
107
|
-
nodes: nodes.
|
107
|
+
nodes: nodes.to_h
|
108
108
|
}
|
109
109
|
end
|
110
110
|
|
@@ -5,6 +5,8 @@ module DrawioDsl
|
|
5
5
|
# Shape is a graphical element, it can be a shape, a text, or a group (todo)
|
6
6
|
class Shape < Node
|
7
7
|
class << self
|
8
|
+
attr_reader :shape_defaults
|
9
|
+
|
8
10
|
def configure_shape(name)
|
9
11
|
raise "Shape #{name} not found in configuration" unless KConfig.configuration.drawio.shapes.members.include?(name)
|
10
12
|
|
@@ -12,12 +14,6 @@ module DrawioDsl
|
|
12
14
|
|
13
15
|
@shape_defaults = config.clone
|
14
16
|
end
|
15
|
-
|
16
|
-
def shape_defaults
|
17
|
-
return @shape_defaults if defined? @shape_defaults
|
18
|
-
|
19
|
-
raise 'Shape defaults not configured'
|
20
|
-
end
|
21
17
|
end
|
22
18
|
|
23
19
|
configure_shape(:shape)
|
@@ -100,6 +96,12 @@ module DrawioDsl
|
|
100
96
|
end
|
101
97
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
102
98
|
|
99
|
+
def as_xml(xml)
|
100
|
+
xml.mxCell(id: id, value: title, style: style, vertex: 1, parent: "#{page.id}-B") do
|
101
|
+
xml.mxGeometry(x: x, y: y, width: w, height: h, as: 'geometry')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
103
105
|
def to_h
|
104
106
|
{
|
105
107
|
id: id,
|
@@ -113,6 +115,7 @@ module DrawioDsl
|
|
113
115
|
}
|
114
116
|
end
|
115
117
|
|
118
|
+
# :nocov:
|
116
119
|
def debug(format: :detail)
|
117
120
|
if format == :detail
|
118
121
|
debug_detail({ id: id, classification: classification, type: type })
|
@@ -120,6 +123,7 @@ module DrawioDsl
|
|
120
123
|
debug_row(classification, id, type, x, y, w, h)
|
121
124
|
end
|
122
125
|
end
|
126
|
+
# :nocov:
|
123
127
|
end
|
124
128
|
end
|
125
129
|
end
|
data/lib/drawio_dsl/version.rb
CHANGED