drawio_dsl 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.templates/command.rb +8 -0
  3. data/.builders/.templates/schema_shape.rb +9 -0
  4. data/.builders/blueprint/shapes.rb +19 -0
  5. data/.builders/boot.rb +1 -0
  6. data/.builders/generators/25-themes.rb +3 -0
  7. data/CHANGELOG.md +7 -0
  8. data/lib/drawio_dsl/configuration.rb +36 -27
  9. data/lib/drawio_dsl/dom_builder.rb +15 -0
  10. data/lib/drawio_dsl/drawio.rb +19 -1
  11. data/lib/drawio_dsl/layout_engine.rb +1 -1
  12. data/lib/drawio_dsl/schema/_.rb +23 -0
  13. data/lib/drawio_dsl/schema/common_style.rb +42 -0
  14. data/lib/drawio_dsl/schema/default_palette.rb +31 -0
  15. data/lib/drawio_dsl/schema/diagram.rb +57 -0
  16. data/lib/drawio_dsl/schema/layouts/flex_layout.rb +87 -0
  17. data/lib/drawio_dsl/schema/layouts/grid_layout.rb +102 -0
  18. data/lib/drawio_dsl/schema/layouts/layout.rb +41 -0
  19. data/lib/drawio_dsl/schema/node.rb +53 -0
  20. data/lib/drawio_dsl/schema/page.rb +135 -0
  21. data/lib/drawio_dsl/schema/shapes/callout.rb +9 -0
  22. data/lib/drawio_dsl/schema/shapes/circle.rb +9 -0
  23. data/lib/drawio_dsl/schema/shapes/cloud.rb +9 -0
  24. data/lib/drawio_dsl/schema/shapes/diamond.rb +9 -0
  25. data/lib/drawio_dsl/schema/shapes/ellipse.rb +9 -0
  26. data/lib/drawio_dsl/schema/shapes/hexagon.rb +9 -0
  27. data/lib/drawio_dsl/schema/shapes/note.rb +9 -0
  28. data/lib/drawio_dsl/schema/shapes/process.rb +9 -0
  29. data/lib/drawio_dsl/schema/shapes/rectangle.rb +9 -0
  30. data/lib/drawio_dsl/schema/shapes/shape.rb +125 -0
  31. data/lib/drawio_dsl/schema/shapes/square.rb +9 -0
  32. data/lib/drawio_dsl/version.rb +1 -1
  33. data/lib/drawio_dsl.rb +1 -1
  34. data/package-lock.json +2 -2
  35. data/package.json +1 -1
  36. metadata +25 -3
  37. data/lib/drawio_dsl/schema.rb +0 -617
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Node is a base class for shapes, connections, positioners and layout rules
6
+ #
7
+ class Node
8
+ attr_accessor :id
9
+ attr_accessor :page
10
+ attr_accessor :classification
11
+
12
+ def initialize(page, **args)
13
+ @page = page
14
+ @id = args[:id]
15
+ @classification = args[:classification] || :unknown
16
+ end
17
+
18
+ def to_h
19
+ {
20
+ id: id,
21
+ classification: classification
22
+ }
23
+ end
24
+
25
+ # def debug(format: :detail)
26
+ # if format == :detail
27
+ # debug_detail(to_h)
28
+ # else
29
+ # debug_row(classification, id)
30
+ # end
31
+ # end
32
+
33
+ # def debug_detail(**key_values)
34
+ # key_values.each do |key, value|
35
+ # puts "#{key.to_s.ljust(15)}: #{value}"
36
+ # end
37
+ # end
38
+
39
+ #
40
+ # def debug_row(classification, id, type = nil, x = nil, y = nil, width = nil, height = nil)
41
+ # row = []
42
+ # row << classification.to_s.ljust(11)
43
+ # row << id.to_s.ljust(6)
44
+ # row << (type.nil? ? '' : type).to_s.ljust(15)
45
+ # row << (x.nil? ? '' : x).to_s.rjust(5)
46
+ # row << (y.nil? ? '' : y).to_s.rjust(5)
47
+ # row << (width.nil? ? '' : width).to_s.rjust(5)
48
+ # row << (height.nil? ? '' : height).to_s.rjust(5)
49
+ # puts row.join(' | ')
50
+ # end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Page is a container for nodes
6
+ class Page
7
+ attr_accessor :diagram
8
+
9
+ # These transient attributes hold the current x, y location for the last element added to the page
10
+ attr_accessor :position_x
11
+ attr_accessor :position_y
12
+
13
+ attr_accessor :id
14
+ attr_reader :name
15
+ attr_reader :theme
16
+ attr_reader :style
17
+ attr_reader :palette
18
+ attr_reader :margin_left
19
+ attr_reader :margin_top
20
+ attr_reader :nodes
21
+
22
+ attr_reader :grid # grid = "0"
23
+ attr_reader :grid_size # gridSize = "10"
24
+ attr_reader :guides # guides = "1"
25
+ attr_reader :tooltips # tooltips = "1"
26
+ attr_reader :connect # connect = "1"
27
+ attr_reader :arrows # arrows = "1"
28
+ attr_reader :fold # fold = "1"
29
+ attr_reader :page_no # page = "1"
30
+ attr_reader :page_scale # pageScale = "1"
31
+ attr_reader :page_width # pageWidth = "583"
32
+ attr_reader :page_height # pageHeight = "827"
33
+ attr_reader :background # background = "#FFFACD"
34
+ attr_reader :page_shadow # shadow = "0"
35
+ attr_reader :math # math = "0"
36
+
37
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
38
+ def initialize(diagram, **args)
39
+ @diagram = diagram
40
+
41
+ @id = args[:id]
42
+ @name = args[:name]
43
+ @theme = args[:theme] || diagram.theme
44
+
45
+ # cursor positioning is used by the layout engine
46
+ @position_x = 0
47
+ @position_y = 0
48
+
49
+ # settings to support the layout engine
50
+ @margin_left = args[:margin_left] || 50
51
+ @margin_top = args[:margin_top] || 50
52
+
53
+ # settings that live on the drawio page object
54
+ @grid = args[:grid] || 0
55
+ @grid_size = args[:grid_size] || 10
56
+ @guides = args[:guides] || 1
57
+ @tooltips = args[:tooltips] || 1
58
+ @connect = args[:connect] || 1
59
+ @arrows = args[:arrows] || 1
60
+ @fold = args[:fold] || 1
61
+ @page_no = args[:page_no] || 1
62
+ @page_scale = args[:page_scale] || 1
63
+ @page_width = args[:page_width] || 1169 # A4
64
+ @page_height = args[:page_height] || 827 # A4
65
+ @background = args[:background] || '#FFFACD'
66
+ @page_shadow = args[:page_shadow] || 0
67
+ @math = args[:math] || 0
68
+
69
+ @style = DrawioDsl::Schema::CommonStyle.new(**args) do
70
+ # Inherit from the diagram style when specific style not specified.
71
+ @white_space ||= diagram.style.white_space
72
+ @html ||= diagram.style.html
73
+ @rounded ||= diagram.style.rounded
74
+ @shadow ||= diagram.style.shadow
75
+ @sketch ||= diagram.style.sketch
76
+ @glass ||= diagram.style.glass
77
+ end
78
+
79
+ @palette = DrawioDsl::Schema::DefaultPalette.new(self, **args) do |page|
80
+ theme_palette = KConfig.configuration.drawio.palette(page.theme)
81
+
82
+ # Inherit from theme when specific palette options are not specified.
83
+ @fill_color ||= theme_palette.fill_color
84
+ @stroke_color ||= theme_palette.stroke_color
85
+ @font_color ||= theme_palette.font_color
86
+ @gradient ||= theme_palette.gradient
87
+ end
88
+
89
+ @nodes = args[:nodes] || []
90
+ end
91
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
92
+
93
+ def shapes
94
+ @nodes.select { |node| node.is_a?(DrawioDsl::Schema::Shape) }
95
+ end
96
+
97
+ def to_h
98
+ {
99
+ id: id,
100
+ name: name,
101
+ position_x: position_x,
102
+ position_y: position_y,
103
+ theme: theme,
104
+ palette: palette.to_h,
105
+ style: style.to_h,
106
+ settings: settings,
107
+ nodes: nodes.map(&:to_h)
108
+ }
109
+ end
110
+
111
+ private
112
+
113
+ def settings
114
+ {
115
+ margin_left: margin_left,
116
+ margin_top: margin_top,
117
+ grid: grid,
118
+ grid_size: grid_size,
119
+ guides: guides,
120
+ tooltips: tooltips,
121
+ connect: connect,
122
+ arrows: arrows,
123
+ fold: fold,
124
+ page_no: page_no,
125
+ page_scale: page_scale,
126
+ page_width: page_width,
127
+ page_height: page_height,
128
+ background: background,
129
+ page_shadow: page_shadow,
130
+ math: math
131
+ }
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Callout < Shape
6
+ configure_shape(:callout)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Circle < Shape
6
+ configure_shape(:circle)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Cloud < Shape
6
+ configure_shape(:cloud)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Diamond < Shape
6
+ configure_shape(:diamond)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Ellipse < Shape
6
+ configure_shape(:ellipse)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Hexagon < Shape
6
+ configure_shape(:hexagon)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Note < Shape
6
+ configure_shape(:note)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Process < Shape
6
+ configure_shape(:process)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Rectangle < Shape
6
+ configure_shape(:rectangle)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Shape is a graphical element, it can be a shape, a text, or a group (todo)
6
+ class Shape < Node
7
+ class << self
8
+ def configure_shape(name)
9
+ raise "Shape #{name} not found in configuration" unless KConfig.configuration.drawio.shapes.members.include?(name)
10
+
11
+ config = KConfig.configuration.drawio.shapes[name]
12
+
13
+ @shape_defaults = config.clone
14
+ end
15
+
16
+ def shape_defaults
17
+ return @shape_defaults if defined? @shape_defaults
18
+
19
+ raise 'Shape defaults not configured'
20
+ end
21
+ end
22
+
23
+ configure_shape(:shape)
24
+
25
+ attr_accessor :theme
26
+ attr_accessor :title
27
+
28
+ # The style of the element, these will derive from the page style if not provided
29
+ attr_accessor :white_space
30
+ attr_accessor :html
31
+ attr_accessor :rounded
32
+ attr_accessor :shadow
33
+ attr_accessor :glass
34
+ attr_accessor :sketch
35
+
36
+ attr_accessor :fill_color
37
+ attr_accessor :stroke_color
38
+ attr_accessor :font_color
39
+ attr_accessor :gradient
40
+
41
+ attr_accessor :type
42
+ attr_accessor :x
43
+ attr_accessor :y
44
+ attr_accessor :w
45
+ attr_accessor :h
46
+ attr_accessor :style_modifiers
47
+
48
+ def initialize(page, **args)
49
+ args[:classification] = :shape
50
+ super(page, **args)
51
+
52
+ apply_defaults(args)
53
+ end
54
+
55
+ def shape_defaults
56
+ @shape_defaults ||= self.class.shape_defaults.clone
57
+ end
58
+
59
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
60
+ def apply_defaults(args)
61
+ @theme = args[:theme] || page.theme # KConfig.configuration.drawio.themes.sample
62
+ theme_palette = KConfig.configuration.drawio.palette(theme)
63
+ @title = args[:title] || ''
64
+
65
+ @white_space = args[:white_space] || page.style.white_space # wrap or nil
66
+ @html = args[:html] || page.style.html
67
+ @rounded = args[:rounded] || page.style.rounded
68
+ @shadow = args[:shadow] || page.style.shadow
69
+ @sketch = args[:sketch] || page.style.sketch
70
+ @glass = args[:glass] || page.style.glass
71
+
72
+ @type = args[:type] || shape_defaults.type
73
+ @x = args[:x] || shape_defaults.x
74
+ @y = args[:y] || shape_defaults.y
75
+ @w = args[:w] || shape_defaults.w
76
+ @h = args[:h] || shape_defaults.h
77
+ @style_modifiers = args[:style_modifiers] || shape_defaults.style_modifiers
78
+
79
+ @fill_color = args[:fill_color] || theme_palette.fill_color
80
+ @stroke_color = args[:stroke_color] || theme_palette.stroke_color
81
+ @font_color = args[:font_color] || theme_palette.font_color
82
+ @gradient = args[:gradient] || theme_palette.gradient
83
+ end
84
+
85
+ def style
86
+ key_values = []
87
+ key_values << style_modifiers unless style_modifiers.empty?
88
+ key_values << "whiteSpace=#{white_space}" if white_space
89
+ key_values << "html=#{html}" if html
90
+ key_values << "rounded=#{rounded}" if rounded
91
+ key_values << "shadow=#{shadow}" if shadow
92
+ key_values << "sketch=#{sketch}" if sketch
93
+ key_values << "glass=#{glass}" if glass
94
+ key_values << "fillColor=#{fill_color}" if fill_color
95
+ key_values << "strokeColor=#{stroke_color}" if stroke_color
96
+ key_values << "fontColor=#{font_color}" if font_color
97
+ key_values << "gradient=#{gradient}" if gradient
98
+
99
+ key_values.join(';')
100
+ end
101
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
102
+
103
+ def to_h
104
+ {
105
+ id: id,
106
+ classification: classification,
107
+ type: type,
108
+ x: x,
109
+ y: y,
110
+ w: w,
111
+ h: h,
112
+ style: style
113
+ }
114
+ end
115
+
116
+ def debug(format: :detail)
117
+ if format == :detail
118
+ debug_detail({ id: id, classification: classification, type: type })
119
+ else
120
+ debug_row(classification, id, type, x, y, w, h)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class Square < Shape
6
+ configure_shape(:square)
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DrawioDsl
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/drawio_dsl.rb CHANGED
@@ -9,7 +9,7 @@ require 'k_director'
9
9
 
10
10
  require_relative 'drawio_dsl/configuration'
11
11
  require_relative 'drawio_dsl/version'
12
- require_relative 'drawio_dsl/schema'
12
+ require_relative 'drawio_dsl/schema/_'
13
13
  require_relative 'drawio_dsl/dom_builder'
14
14
  require_relative 'drawio_dsl/xml_builder'
15
15
  require_relative 'drawio_dsl/layout_engine'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "drawio_dsl",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "drawio_dsl",
9
- "version": "0.3.0",
9
+ "version": "0.4.0",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.1",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drawio_dsl",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "DrawIO DSL can build DrawIO diagrams using a Domain Specific Language",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drawio_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-04 00:00:00.000000000 Z
11
+ date: 2022-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: k_config
@@ -73,7 +73,10 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
+ - ".builders/.templates/command.rb"
77
+ - ".builders/.templates/schema_shape.rb"
76
78
  - ".builders/_.rb"
79
+ - ".builders/blueprint/shapes.rb"
77
80
  - ".builders/boot.rb"
78
81
  - ".builders/generators/01-bootstrap.rb"
79
82
  - ".builders/generators/10-page-margin.rb"
@@ -99,7 +102,26 @@ files:
99
102
  - lib/drawio_dsl/dom_builder.rb
100
103
  - lib/drawio_dsl/drawio.rb
101
104
  - lib/drawio_dsl/layout_engine.rb
102
- - lib/drawio_dsl/schema.rb
105
+ - lib/drawio_dsl/schema/_.rb
106
+ - lib/drawio_dsl/schema/common_style.rb
107
+ - lib/drawio_dsl/schema/default_palette.rb
108
+ - lib/drawio_dsl/schema/diagram.rb
109
+ - lib/drawio_dsl/schema/layouts/flex_layout.rb
110
+ - lib/drawio_dsl/schema/layouts/grid_layout.rb
111
+ - lib/drawio_dsl/schema/layouts/layout.rb
112
+ - lib/drawio_dsl/schema/node.rb
113
+ - lib/drawio_dsl/schema/page.rb
114
+ - lib/drawio_dsl/schema/shapes/callout.rb
115
+ - lib/drawio_dsl/schema/shapes/circle.rb
116
+ - lib/drawio_dsl/schema/shapes/cloud.rb
117
+ - lib/drawio_dsl/schema/shapes/diamond.rb
118
+ - lib/drawio_dsl/schema/shapes/ellipse.rb
119
+ - lib/drawio_dsl/schema/shapes/hexagon.rb
120
+ - lib/drawio_dsl/schema/shapes/note.rb
121
+ - lib/drawio_dsl/schema/shapes/process.rb
122
+ - lib/drawio_dsl/schema/shapes/rectangle.rb
123
+ - lib/drawio_dsl/schema/shapes/shape.rb
124
+ - lib/drawio_dsl/schema/shapes/square.rb
103
125
  - lib/drawio_dsl/version.rb
104
126
  - lib/drawio_dsl/xml_builder.rb
105
127
  - package-lock.json