archimate 1.2.1 → 2.0.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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -0
  3. data/TODOs.org +219 -0
  4. data/archimate.gemspec +2 -1
  5. data/exe/archidiff +7 -0
  6. data/exe/archidiff-summary +7 -0
  7. data/exe/archimerge +7 -0
  8. data/exe/fmtxml +7 -0
  9. data/lib/archimate.rb +10 -21
  10. data/lib/archimate/cli/archi.rb +2 -1
  11. data/lib/archimate/cli/cleanup.rb +8 -9
  12. data/lib/archimate/cli/convert.rb +3 -1
  13. data/lib/archimate/cli/mapper.rb +1 -1
  14. data/lib/archimate/cli/stats.rb +1 -1
  15. data/lib/archimate/config.rb +4 -1
  16. data/lib/archimate/data_model.rb +11 -24
  17. data/lib/archimate/data_model/any_attribute.rb +18 -5
  18. data/lib/archimate/data_model/any_element.rb +30 -7
  19. data/lib/archimate/data_model/bounds.rb +34 -7
  20. data/lib/archimate/data_model/color.rb +32 -7
  21. data/lib/archimate/data_model/comparison.rb +87 -0
  22. data/lib/archimate/data_model/concern.rb +20 -7
  23. data/lib/archimate/data_model/connection.rb +71 -51
  24. data/lib/archimate/data_model/connector_type.rb +23 -0
  25. data/lib/archimate/data_model/diagram.rb +72 -10
  26. data/lib/archimate/data_model/diagram_type.rb +17 -0
  27. data/lib/archimate/data_model/differentiable.rb +142 -0
  28. data/lib/archimate/data_model/element.rb +39 -45
  29. data/lib/archimate/data_model/element_type.rb +89 -0
  30. data/lib/archimate/data_model/font.rb +30 -12
  31. data/lib/archimate/data_model/lang_string.rb +89 -16
  32. data/lib/archimate/data_model/layer.rb +55 -0
  33. data/lib/archimate/data_model/layers.rb +62 -0
  34. data/lib/archimate/data_model/location.rb +27 -11
  35. data/lib/archimate/data_model/metadata.rb +10 -3
  36. data/lib/archimate/data_model/model.rb +188 -121
  37. data/lib/archimate/data_model/modeling_note.rb +14 -3
  38. data/lib/archimate/data_model/organization.rb +44 -13
  39. data/lib/archimate/data_model/{documentation.rb → preserved_lang_string.rb} +1 -5
  40. data/lib/archimate/data_model/property.rb +17 -11
  41. data/lib/archimate/data_model/property_definition.rb +34 -4
  42. data/lib/archimate/data_model/referenceable.rb +0 -9
  43. data/lib/archimate/data_model/referenceable_collection.rb +201 -0
  44. data/lib/archimate/data_model/relationship.rb +52 -33
  45. data/lib/archimate/data_model/relationship_type.rb +43 -0
  46. data/lib/archimate/data_model/schema_info.rb +17 -6
  47. data/lib/archimate/data_model/style.rb +41 -11
  48. data/lib/archimate/data_model/view_node.rb +153 -59
  49. data/lib/archimate/data_model/viewpoint.rb +56 -80
  50. data/lib/archimate/data_model/viewpoint_type.rb +429 -0
  51. data/lib/archimate/export/csv_export.rb +2 -2
  52. data/lib/archimate/export/cypher.rb +2 -2
  53. data/lib/archimate/export/graph_ml.rb +7 -5
  54. data/lib/archimate/export/jsonl.rb +166 -0
  55. data/lib/archimate/export/n_quads.rb +8 -5
  56. data/lib/archimate/file_format.rb +4 -5
  57. data/lib/archimate/file_formats/archi_file_reader.rb +7 -240
  58. data/lib/archimate/file_formats/archi_file_writer.rb +16 -188
  59. data/lib/archimate/file_formats/model_exchange_file_reader.rb +7 -225
  60. data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +22 -114
  61. data/lib/archimate/file_formats/model_exchange_file_writer_30.rb +22 -122
  62. data/lib/archimate/file_formats/sax.rb +55 -0
  63. data/lib/archimate/file_formats/sax/any_element.rb +64 -0
  64. data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +48 -0
  65. data/lib/archimate/file_formats/sax/archi/bounds.rb +25 -0
  66. data/lib/archimate/file_formats/sax/archi/connection.rb +47 -0
  67. data/lib/archimate/file_formats/sax/archi/content.rb +28 -0
  68. data/lib/archimate/file_formats/sax/archi/diagram.rb +66 -0
  69. data/lib/archimate/file_formats/sax/archi/element.rb +36 -0
  70. data/lib/archimate/file_formats/sax/archi/location.rb +25 -0
  71. data/lib/archimate/file_formats/sax/archi/model.rb +109 -0
  72. data/lib/archimate/file_formats/sax/archi/organization.rb +60 -0
  73. data/lib/archimate/file_formats/sax/archi/property.rb +54 -0
  74. data/lib/archimate/file_formats/sax/archi/relationship.rb +50 -0
  75. data/lib/archimate/file_formats/sax/archi/style.rb +35 -0
  76. data/lib/archimate/file_formats/sax/archi/view_node.rb +76 -0
  77. data/lib/archimate/file_formats/sax/capture_content.rb +20 -0
  78. data/lib/archimate/file_formats/sax/capture_documentation.rb +19 -0
  79. data/lib/archimate/file_formats/sax/capture_properties.rb +20 -0
  80. data/lib/archimate/file_formats/sax/content_element.rb +19 -0
  81. data/lib/archimate/file_formats/sax/document.rb +80 -0
  82. data/lib/archimate/file_formats/sax/handler.rb +54 -0
  83. data/lib/archimate/file_formats/sax/lang_string.rb +28 -0
  84. data/lib/archimate/file_formats/sax/model_exchange_file/color.rb +36 -0
  85. data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +67 -0
  86. data/lib/archimate/file_formats/sax/model_exchange_file/diagram.rb +60 -0
  87. data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +43 -0
  88. data/lib/archimate/file_formats/sax/model_exchange_file/font.rb +44 -0
  89. data/lib/archimate/file_formats/sax/model_exchange_file/item.rb +64 -0
  90. data/lib/archimate/file_formats/sax/model_exchange_file/location.rb +23 -0
  91. data/lib/archimate/file_formats/sax/model_exchange_file/metadata.rb +66 -0
  92. data/lib/archimate/file_formats/sax/model_exchange_file/model.rb +124 -0
  93. data/lib/archimate/file_formats/sax/model_exchange_file/model_exchange_handler_factory.rb +53 -0
  94. data/lib/archimate/file_formats/sax/model_exchange_file/property.rb +32 -0
  95. data/lib/archimate/file_formats/sax/model_exchange_file/property_definition.rb +36 -0
  96. data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +49 -0
  97. data/lib/archimate/file_formats/sax/model_exchange_file/schema_info.rb +47 -0
  98. data/lib/archimate/file_formats/sax/model_exchange_file/style.rb +66 -0
  99. data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +86 -0
  100. data/lib/archimate/file_formats/sax/no_op.rb +17 -0
  101. data/lib/archimate/file_formats/sax/preserved_lang_string.rb +28 -0
  102. data/lib/archimate/file_formats/serializer.rb +57 -0
  103. data/lib/archimate/file_formats/serializer/archi/bounds.rb +23 -0
  104. data/lib/archimate/file_formats/serializer/archi/connection.rb +33 -0
  105. data/lib/archimate/file_formats/serializer/archi/diagram.rb +28 -0
  106. data/lib/archimate/file_formats/serializer/archi/documentation.rb +16 -0
  107. data/lib/archimate/file_formats/serializer/archi/element.rb +24 -0
  108. data/lib/archimate/file_formats/serializer/archi/location.rb +26 -0
  109. data/lib/archimate/file_formats/serializer/archi/model.rb +25 -0
  110. data/lib/archimate/file_formats/serializer/archi/organization.rb +21 -0
  111. data/lib/archimate/file_formats/serializer/archi/property.rb +15 -0
  112. data/lib/archimate/file_formats/serializer/archi/relationship.rb +36 -0
  113. data/lib/archimate/file_formats/serializer/archi/view_node.rb +52 -0
  114. data/lib/archimate/file_formats/serializer/archi/viewpoint_type.rb +45 -0
  115. data/lib/archimate/file_formats/serializer/model_exchange_file/element.rb +25 -0
  116. data/lib/archimate/file_formats/serializer/model_exchange_file/location.rb +15 -0
  117. data/lib/archimate/file_formats/serializer/model_exchange_file/model_exchange_file_writer.rb +32 -0
  118. data/lib/archimate/file_formats/serializer/model_exchange_file/organization.rb +23 -0
  119. data/lib/archimate/file_formats/serializer/model_exchange_file/properties.rb +15 -0
  120. data/lib/archimate/file_formats/serializer/model_exchange_file/relationship.rb +19 -0
  121. data/lib/archimate/file_formats/serializer/model_exchange_file/style.rb +48 -0
  122. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/connection.rb +25 -0
  123. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/diagram.rb +27 -0
  124. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/item.rb +17 -0
  125. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/label.rb +17 -0
  126. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/model.rb +36 -0
  127. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/organization_body.rb +25 -0
  128. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/property.rb +19 -0
  129. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/view_node.rb +44 -0
  130. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/connection.rb +26 -0
  131. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/diagram.rb +27 -0
  132. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/item.rb +17 -0
  133. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/label.rb +17 -0
  134. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/model.rb +41 -0
  135. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/organization_body.rb +25 -0
  136. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property.rb +19 -0
  137. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property_definitions.rb +34 -0
  138. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/view_node.rb +45 -0
  139. data/lib/archimate/file_formats/serializer/named_collection.rb +21 -0
  140. data/lib/archimate/file_formats/serializer/writer.rb +56 -0
  141. data/lib/archimate/file_formats/serializer/xml_lang_string.rb +30 -0
  142. data/lib/archimate/file_formats/serializer/xml_metadata.rb +64 -0
  143. data/lib/archimate/file_formats/{model_exchange_file → serializer}/xml_property_defs.rb +2 -2
  144. data/lib/archimate/lint/duplicate_entities.rb +3 -3
  145. data/lib/archimate/lint/linter.rb +24 -29
  146. data/lib/archimate/svg/connection.rb +13 -103
  147. data/lib/archimate/svg/diagram.rb +1 -1
  148. data/lib/archimate/svg/entity/base_entity.rb +12 -8
  149. data/lib/archimate/svg/entity/data_entity.rb +2 -2
  150. data/lib/archimate/svg/entity/diagram_model_reference.rb +1 -1
  151. data/lib/archimate/svg/entity/event_entity.rb +2 -2
  152. data/lib/archimate/svg/entity/gap.rb +1 -1
  153. data/lib/archimate/svg/entity/group.rb +1 -1
  154. data/lib/archimate/svg/entity/motivation_entity.rb +1 -1
  155. data/lib/archimate/svg/entity/node.rb +1 -1
  156. data/lib/archimate/svg/entity/rect_entity.rb +1 -1
  157. data/lib/archimate/svg/entity/rounded_rect_entity.rb +1 -1
  158. data/lib/archimate/svg/entity/service_entity.rb +2 -2
  159. data/lib/archimate/svg/entity/value.rb +2 -2
  160. data/lib/archimate/svg/path.rb +153 -0
  161. data/lib/archimate/svg/point.rb +8 -1
  162. data/lib/archimate/version.rb +1 -1
  163. metadata +118 -36
  164. data/lib/archimate/data_model/archimate_node.rb +0 -181
  165. data/lib/archimate/data_model/concept.rb +0 -14
  166. data/lib/archimate/data_model/constants.rb +0 -82
  167. data/lib/archimate/data_model/container.rb +0 -17
  168. data/lib/archimate/data_model/diffable_array.rb +0 -213
  169. data/lib/archimate/data_model/diffable_primitive.rb +0 -83
  170. data/lib/archimate/data_model/label.rb +0 -19
  171. data/lib/archimate/data_model/named_referenceable.rb +0 -14
  172. data/lib/archimate/data_model/view.rb +0 -12
  173. data/lib/archimate/data_model/view_concept.rb +0 -18
  174. data/lib/archimate/file_formats/archi_file_format.rb +0 -151
  175. data/lib/archimate/file_formats/archimate_v2.rb +0 -461
  176. data/lib/archimate/file_formats/model_exchange_file/xml_lang_string.rb +0 -35
  177. data/lib/archimate/file_formats/model_exchange_file/xml_metadata.rb +0 -115
  178. data/lib/archimate/file_formats/model_exchange_file/xml_property_definitions.rb +0 -28
  179. data/lib/archimate/file_formats/model_exchange_file_reader_21.rb +0 -73
  180. data/lib/archimate/file_formats/model_exchange_file_reader_30.rb +0 -134
  181. data/lib/archimate/file_formats/model_exchange_file_writer.rb +0 -157
  182. data/lib/archimate/file_formats/writer.rb +0 -56
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Relationship < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+
11
+ def initialize(name, attrs, parent_handler)
12
+ super
13
+ @relationship = nil
14
+ end
15
+
16
+ def complete
17
+ [
18
+ event(:on_relationship, relationship),
19
+ event(:on_referenceable, relationship),
20
+ event(:on_future, Sax::FutureReference.new(relationship, :source, @attrs["source"])),
21
+ event(:on_future, Sax::FutureReference.new(relationship, :target, @attrs["target"]))
22
+ ]
23
+ end
24
+
25
+ private
26
+
27
+ def relationship
28
+ @relationship ||= DataModel::Relationship.new(
29
+ id: @attrs["id"],
30
+ type: element_type,
31
+ source: nil,
32
+ target: nil,
33
+ name: DataModel::LangString.string(process_text(@attrs["name"])),
34
+ access_type: parse_access_type(@attrs["accessType"]),
35
+ documentation: documentation,
36
+ properties: properties
37
+ )
38
+ end
39
+
40
+ def parse_access_type(val)
41
+ return nil unless val && !val.empty?
42
+ i = val.to_i
43
+ return nil unless (0..DataModel::ACCESS_TYPE.size - 1).cover?(i)
44
+ DataModel::ACCESS_TYPE[i]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ module Style
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @style_hash = nil
11
+ end
12
+
13
+ def style
14
+ return nil if style_hash.empty?
15
+ DataModel::Style.new(style_hash)
16
+ end
17
+
18
+ private
19
+
20
+ def style_hash
21
+ @style_hash ||= {
22
+ text_alignment: attrs["textAlignment"],
23
+ fill_color: DataModel::Color.rgba(attrs["fillColor"]),
24
+ line_color: DataModel::Color.rgba(attrs["lineColor"]),
25
+ font_color: DataModel::Color.rgba(attrs["fontColor"]),
26
+ font: DataModel::Font.archi_font_string(attrs["font"]),
27
+ line_width: attrs["lineWidth"],
28
+ text_position: attrs["textPosition"]
29
+ }.delete_if { |_k, v| v.nil? }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class ViewNode < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+ include Style
11
+
12
+ def initialize(name, attrs, parent_handler)
13
+ super
14
+ @view_nodes = []
15
+ @connections = []
16
+ @bounds = nil
17
+ @content = nil
18
+ @view_node = nil
19
+ end
20
+
21
+ def complete
22
+ [
23
+ event(:on_future, Sax::FutureReference.new(view_node, :view_refs, attrs["model"])),
24
+ event(:on_future, Sax::FutureReference.new(view_node, :element, attrs["archimateElement"])),
25
+ event(:on_referenceable, view_node),
26
+ event(:on_view_node, view_node)
27
+ ]
28
+ end
29
+
30
+ def on_view_node(view_node, source)
31
+ @view_nodes << view_node if source.parent_handler == self
32
+ view_node
33
+ end
34
+
35
+ def on_connection(connection, source)
36
+ @connections << connection if source.parent_handler == self
37
+ connection
38
+ end
39
+
40
+ def on_content(string, _source)
41
+ @content = string
42
+ false
43
+ end
44
+
45
+ def on_bounds(bounds, _source)
46
+ @bounds = bounds
47
+ false
48
+ end
49
+
50
+ private
51
+
52
+ def view_node
53
+ @view_node ||= DataModel::ViewNode.new(
54
+ id: attrs["id"],
55
+ type: attrs["xsi:type"],
56
+ view_refs: nil,
57
+ name: DataModel::LangString.string(process_text(attrs["name"])),
58
+ element: nil,
59
+ bounds: @bounds,
60
+ nodes: @view_nodes,
61
+ connections: @connections,
62
+ documentation: documentation,
63
+ properties: properties,
64
+ style: style,
65
+ content: @content,
66
+ child_type: attrs["type"],
67
+ diagram: diagram
68
+ )
69
+ @view_nodes.each { |node| node.parent = @view_node }
70
+ @view_node
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module CaptureContent
7
+ def characters(string)
8
+ @content ||= []
9
+ @content << string
10
+ false
11
+ end
12
+
13
+ def content
14
+ return nil unless defined?(@content)
15
+ @content.join("")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module CaptureDocumentation
7
+ def on_preserved_lang_string(documentation, _source)
8
+ @documentation = documentation
9
+ false
10
+ end
11
+
12
+ def documentation
13
+ return nil unless defined?(@documentation)
14
+ @documentation
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module CaptureProperties
7
+ def on_property(property, _source)
8
+ @properties ||= []
9
+ @properties << property
10
+ false
11
+ end
12
+
13
+ def properties
14
+ return [] unless defined?(@properties)
15
+ @properties || []
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ class ContentElement < Handler
7
+ include Sax::CaptureContent
8
+
9
+ def initialize(name, attrs, parent_handler)
10
+ super
11
+ end
12
+
13
+ def complete
14
+ [event("on_#{@name}".to_sym, content)]
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ module Archimate
6
+ module FileFormats
7
+ module Sax
8
+ # SaxStack implements a stack like processor to maintain context
9
+ # during SAX processing of XML documents. It provides the means
10
+ # for a handler for a SAX event to raise events to handlers
11
+ # further up the stack and to query ancestor handlers.
12
+ class Document < Nokogiri::XML::SAX::Document
13
+ attr_reader :model
14
+ attr_reader :handler_factory
15
+
16
+ def initialize(handler_factory)
17
+ super()
18
+ @handler_factory = handler_factory
19
+ @stack = []
20
+ @model = nil
21
+ end
22
+
23
+ # Document is done.
24
+ # def end_document
25
+ # @model = @sax_stack.model
26
+ # end
27
+
28
+ # Push a handler onto the stack.
29
+ #
30
+ # create an instance of the correct builder for this element
31
+ # push it onto the @stack
32
+ #
33
+ # Note: {#unshift} is used here rather than {#push} in the
34
+ # underlying implementation because I want events to flow from
35
+ # last-in to first-in when they are fired and this lets be use
36
+ # {#take_while} without reversing the stack array.
37
+ #
38
+ # @param obj [SaxHandler] Handler to push on the stack
39
+ def start_element(name, attrs = [])
40
+ cls = handler_factory.handler_for(name, attrs)
41
+ @stack.unshift(
42
+ cls.new(name, attrs, @stack.first)
43
+ )
44
+ end
45
+
46
+ # Handler is completed. Fires any of the handlers events
47
+ # and pops the handler off of the stack.
48
+ #
49
+ # See {#push} regarding why {#shift} is used instead of {#pop}
50
+ def end_element(_name)
51
+ fire(@stack.shift.complete)
52
+ end
53
+
54
+ def current_handler
55
+ @stack.first
56
+ end
57
+
58
+ def characters(string)
59
+ current_handler.characters(string)
60
+ end
61
+
62
+ # Fire an event up the stack. Events are received at each handler
63
+ # until a handler returns nil or false.
64
+ #
65
+ # @param events [Array<SaxEvent>] zero or more Events to bubble up the stack
66
+ def fire(events)
67
+ Array(events).each do |event|
68
+ if event.sym == :on_model
69
+ @model = event.args
70
+ else
71
+ @stack.take_while do |target|
72
+ target.send(event.sym, event.args, event.source)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ class Handler
7
+ attr_reader :name
8
+ attr_reader :attrs
9
+ attr_reader :parent_handler
10
+ attr_reader :element_type
11
+
12
+ def initialize(name, attrs, parent_handler)
13
+ @name = name
14
+ @attrs = Hash[attrs]
15
+ @parent_handler = parent_handler
16
+ @element_type = @attrs["xsi:type"]&.sub(/archimate:/, '')
17
+ end
18
+
19
+ def characters(string); end
20
+
21
+ # @return [Array<Event>] array of events to fire for this handler
22
+ def complete
23
+ []
24
+ end
25
+
26
+ def diagram
27
+ parent_handler&.diagram
28
+ end
29
+
30
+ def event(sym, args)
31
+ SaxEvent.new(sym, args, self)
32
+ end
33
+
34
+ def method_missing(sym, *args)
35
+ return args.first if sym.to_s.start_with?("on_")
36
+ super
37
+ end
38
+
39
+ def respond_to_missing?(symbol, _include_all)
40
+ symbol.to_s.start_with?("on_")
41
+ end
42
+
43
+ # Returns the property definitions hash for this SaxDocument
44
+ def property_definitions
45
+ parent_handler&.property_definitions || []
46
+ end
47
+
48
+ def process_text(str)
49
+ str&.gsub("&#38;", "&")
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ class LangString < FileFormats::Sax::Handler
7
+ include Sax::CaptureContent
8
+
9
+ def initialize(name, attrs, parent_handler)
10
+ super
11
+ end
12
+
13
+ def complete
14
+ doc = DataModel::LangString.string(
15
+ process_text(content),
16
+ @attrs["lang"] || @attrs["xml:lang"]
17
+ )
18
+ [
19
+ event(
20
+ :on_lang_string,
21
+ doc
22
+ )
23
+ ]
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Color < Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ end
11
+
12
+ def complete
13
+ [
14
+ event(
15
+ event_name,
16
+ DataModel::Color.new(
17
+ %w[r g b a].each_with_object({}) { |attr, hash| hash[attr.to_sym] = attrs[attr]&.to_i }
18
+ )
19
+ )
20
+ ]
21
+ end
22
+
23
+ private
24
+
25
+ def event_name
26
+ "on_#{snake_case(@name)}".to_sym
27
+ end
28
+
29
+ def snake_case(str)
30
+ str.gsub(/([A-Z])/, '_\1').downcase
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end