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.
- 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
|