archimate 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +47 -0
- data/TODOs.org +219 -0
- data/archimate.gemspec +2 -1
- data/exe/archidiff +7 -0
- data/exe/archidiff-summary +7 -0
- data/exe/archimerge +7 -0
- data/exe/fmtxml +7 -0
- data/lib/archimate.rb +10 -21
- data/lib/archimate/cli/archi.rb +2 -1
- data/lib/archimate/cli/cleanup.rb +8 -9
- data/lib/archimate/cli/convert.rb +3 -1
- data/lib/archimate/cli/mapper.rb +1 -1
- data/lib/archimate/cli/stats.rb +1 -1
- data/lib/archimate/config.rb +4 -1
- data/lib/archimate/data_model.rb +11 -24
- data/lib/archimate/data_model/any_attribute.rb +18 -5
- data/lib/archimate/data_model/any_element.rb +30 -7
- data/lib/archimate/data_model/bounds.rb +34 -7
- data/lib/archimate/data_model/color.rb +32 -7
- data/lib/archimate/data_model/comparison.rb +87 -0
- data/lib/archimate/data_model/concern.rb +20 -7
- data/lib/archimate/data_model/connection.rb +71 -51
- data/lib/archimate/data_model/connector_type.rb +23 -0
- data/lib/archimate/data_model/diagram.rb +72 -10
- data/lib/archimate/data_model/diagram_type.rb +17 -0
- data/lib/archimate/data_model/differentiable.rb +142 -0
- data/lib/archimate/data_model/element.rb +39 -45
- data/lib/archimate/data_model/element_type.rb +89 -0
- data/lib/archimate/data_model/font.rb +30 -12
- data/lib/archimate/data_model/lang_string.rb +89 -16
- data/lib/archimate/data_model/layer.rb +55 -0
- data/lib/archimate/data_model/layers.rb +62 -0
- data/lib/archimate/data_model/location.rb +27 -11
- data/lib/archimate/data_model/metadata.rb +10 -3
- data/lib/archimate/data_model/model.rb +188 -121
- data/lib/archimate/data_model/modeling_note.rb +14 -3
- data/lib/archimate/data_model/organization.rb +44 -13
- data/lib/archimate/data_model/{documentation.rb → preserved_lang_string.rb} +1 -5
- data/lib/archimate/data_model/property.rb +17 -11
- data/lib/archimate/data_model/property_definition.rb +34 -4
- data/lib/archimate/data_model/referenceable.rb +0 -9
- data/lib/archimate/data_model/referenceable_collection.rb +201 -0
- data/lib/archimate/data_model/relationship.rb +52 -33
- data/lib/archimate/data_model/relationship_type.rb +43 -0
- data/lib/archimate/data_model/schema_info.rb +17 -6
- data/lib/archimate/data_model/style.rb +41 -11
- data/lib/archimate/data_model/view_node.rb +153 -59
- data/lib/archimate/data_model/viewpoint.rb +56 -80
- data/lib/archimate/data_model/viewpoint_type.rb +429 -0
- data/lib/archimate/export/csv_export.rb +2 -2
- data/lib/archimate/export/cypher.rb +2 -2
- data/lib/archimate/export/graph_ml.rb +7 -5
- data/lib/archimate/export/jsonl.rb +166 -0
- data/lib/archimate/export/n_quads.rb +8 -5
- data/lib/archimate/file_format.rb +4 -5
- data/lib/archimate/file_formats/archi_file_reader.rb +7 -240
- data/lib/archimate/file_formats/archi_file_writer.rb +16 -188
- data/lib/archimate/file_formats/model_exchange_file_reader.rb +7 -225
- data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +22 -114
- data/lib/archimate/file_formats/model_exchange_file_writer_30.rb +22 -122
- data/lib/archimate/file_formats/sax.rb +55 -0
- data/lib/archimate/file_formats/sax/any_element.rb +64 -0
- data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +48 -0
- data/lib/archimate/file_formats/sax/archi/bounds.rb +25 -0
- data/lib/archimate/file_formats/sax/archi/connection.rb +47 -0
- data/lib/archimate/file_formats/sax/archi/content.rb +28 -0
- data/lib/archimate/file_formats/sax/archi/diagram.rb +66 -0
- data/lib/archimate/file_formats/sax/archi/element.rb +36 -0
- data/lib/archimate/file_formats/sax/archi/location.rb +25 -0
- data/lib/archimate/file_formats/sax/archi/model.rb +109 -0
- data/lib/archimate/file_formats/sax/archi/organization.rb +60 -0
- data/lib/archimate/file_formats/sax/archi/property.rb +54 -0
- data/lib/archimate/file_formats/sax/archi/relationship.rb +50 -0
- data/lib/archimate/file_formats/sax/archi/style.rb +35 -0
- data/lib/archimate/file_formats/sax/archi/view_node.rb +76 -0
- data/lib/archimate/file_formats/sax/capture_content.rb +20 -0
- data/lib/archimate/file_formats/sax/capture_documentation.rb +19 -0
- data/lib/archimate/file_formats/sax/capture_properties.rb +20 -0
- data/lib/archimate/file_formats/sax/content_element.rb +19 -0
- data/lib/archimate/file_formats/sax/document.rb +80 -0
- data/lib/archimate/file_formats/sax/handler.rb +54 -0
- data/lib/archimate/file_formats/sax/lang_string.rb +28 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/color.rb +36 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +67 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/diagram.rb +60 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +43 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/font.rb +44 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/item.rb +64 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/location.rb +23 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/metadata.rb +66 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/model.rb +124 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/model_exchange_handler_factory.rb +53 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/property.rb +32 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/property_definition.rb +36 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +49 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/schema_info.rb +47 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/style.rb +66 -0
- data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +86 -0
- data/lib/archimate/file_formats/sax/no_op.rb +17 -0
- data/lib/archimate/file_formats/sax/preserved_lang_string.rb +28 -0
- data/lib/archimate/file_formats/serializer.rb +57 -0
- data/lib/archimate/file_formats/serializer/archi/bounds.rb +23 -0
- data/lib/archimate/file_formats/serializer/archi/connection.rb +33 -0
- data/lib/archimate/file_formats/serializer/archi/diagram.rb +28 -0
- data/lib/archimate/file_formats/serializer/archi/documentation.rb +16 -0
- data/lib/archimate/file_formats/serializer/archi/element.rb +24 -0
- data/lib/archimate/file_formats/serializer/archi/location.rb +26 -0
- data/lib/archimate/file_formats/serializer/archi/model.rb +25 -0
- data/lib/archimate/file_formats/serializer/archi/organization.rb +21 -0
- data/lib/archimate/file_formats/serializer/archi/property.rb +15 -0
- data/lib/archimate/file_formats/serializer/archi/relationship.rb +36 -0
- data/lib/archimate/file_formats/serializer/archi/view_node.rb +52 -0
- data/lib/archimate/file_formats/serializer/archi/viewpoint_type.rb +45 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/element.rb +25 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/location.rb +15 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/model_exchange_file_writer.rb +32 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/organization.rb +23 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/properties.rb +15 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/relationship.rb +19 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/style.rb +48 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/connection.rb +25 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/diagram.rb +27 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/item.rb +17 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/label.rb +17 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/model.rb +36 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/organization_body.rb +25 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/property.rb +19 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v21/view_node.rb +44 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/connection.rb +26 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/diagram.rb +27 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/item.rb +17 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/label.rb +17 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/model.rb +41 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/organization_body.rb +25 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property.rb +19 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property_definitions.rb +34 -0
- data/lib/archimate/file_formats/serializer/model_exchange_file/v30/view_node.rb +45 -0
- data/lib/archimate/file_formats/serializer/named_collection.rb +21 -0
- data/lib/archimate/file_formats/serializer/writer.rb +56 -0
- data/lib/archimate/file_formats/serializer/xml_lang_string.rb +30 -0
- data/lib/archimate/file_formats/serializer/xml_metadata.rb +64 -0
- data/lib/archimate/file_formats/{model_exchange_file → serializer}/xml_property_defs.rb +2 -2
- data/lib/archimate/lint/duplicate_entities.rb +3 -3
- data/lib/archimate/lint/linter.rb +24 -29
- data/lib/archimate/svg/connection.rb +13 -103
- data/lib/archimate/svg/diagram.rb +1 -1
- data/lib/archimate/svg/entity/base_entity.rb +12 -8
- data/lib/archimate/svg/entity/data_entity.rb +2 -2
- data/lib/archimate/svg/entity/diagram_model_reference.rb +1 -1
- data/lib/archimate/svg/entity/event_entity.rb +2 -2
- data/lib/archimate/svg/entity/gap.rb +1 -1
- data/lib/archimate/svg/entity/group.rb +1 -1
- data/lib/archimate/svg/entity/motivation_entity.rb +1 -1
- data/lib/archimate/svg/entity/node.rb +1 -1
- data/lib/archimate/svg/entity/rect_entity.rb +1 -1
- data/lib/archimate/svg/entity/rounded_rect_entity.rb +1 -1
- data/lib/archimate/svg/entity/service_entity.rb +2 -2
- data/lib/archimate/svg/entity/value.rb +2 -2
- data/lib/archimate/svg/path.rb +153 -0
- data/lib/archimate/svg/point.rb +8 -1
- data/lib/archimate/version.rb +1 -1
- metadata +118 -36
- data/lib/archimate/data_model/archimate_node.rb +0 -181
- data/lib/archimate/data_model/concept.rb +0 -14
- data/lib/archimate/data_model/constants.rb +0 -82
- data/lib/archimate/data_model/container.rb +0 -17
- data/lib/archimate/data_model/diffable_array.rb +0 -213
- data/lib/archimate/data_model/diffable_primitive.rb +0 -83
- data/lib/archimate/data_model/label.rb +0 -19
- data/lib/archimate/data_model/named_referenceable.rb +0 -14
- data/lib/archimate/data_model/view.rb +0 -12
- data/lib/archimate/data_model/view_concept.rb +0 -18
- data/lib/archimate/file_formats/archi_file_format.rb +0 -151
- data/lib/archimate/file_formats/archimate_v2.rb +0 -461
- data/lib/archimate/file_formats/model_exchange_file/xml_lang_string.rb +0 -35
- data/lib/archimate/file_formats/model_exchange_file/xml_metadata.rb +0 -115
- data/lib/archimate/file_formats/model_exchange_file/xml_property_definitions.rb +0 -28
- data/lib/archimate/file_formats/model_exchange_file_reader_21.rb +0 -73
- data/lib/archimate/file_formats/model_exchange_file_reader_30.rb +0 -134
- data/lib/archimate/file_formats/model_exchange_file_writer.rb +0 -157
- 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("&", "&")
|
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
|