metanorma-plugin-lutaml 0.7.7 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d59529d97e0b2a61af4daf695ab6e3490ccdb5e99f5a351e53ab8c822c063a17
4
- data.tar.gz: 2a30e8db498027922dc4f848057880a13d4a240310b2c01122ed2176be4cbf2e
3
+ metadata.gz: 29510e3dd02119b47d1d179c94d0a954b596dc0255410091d8c0db366e6a4dd3
4
+ data.tar.gz: b2502ffd6bea597bc56c8882712c58d13e72799eca5387c76329a9ef813d62eb
5
5
  SHA512:
6
- metadata.gz: e5b8fffe0ec8df9e9ae6bddff29202f9c65a40b43a4790980799763cad78f950cab5c59f0b07ac6c7e774f4199f9aa5cf9c9ec2470d4d67622d3e491416de09e
7
- data.tar.gz: c530eea53a62605af3df803eeddffdb5feee15e91856dff2541fe2b5831cd5e27ad5052fab01d101763eb9a890b0154aad28a934a40caf980111d2647eda5448
6
+ metadata.gz: b06a2f0d8be8e9073c3f631b260d8e88525353afb8e4e6cdf11bd6db9d78994543eb6a9acda9a2602212943ff972a700efa7c7d3dc870951cd3f2c6e5a219ff2
7
+ data.tar.gz: c80c2d456bec408dccb3c621397bc9313e2cc6a53cf7c5671d504737087ebb597b446d2fc043e3deaaf809a0941f0f3b732837bf4b5aee404685d70cd6ab0d27
data/Gemfile CHANGED
@@ -11,5 +11,3 @@ begin
11
11
  rescue StandardError
12
12
  nil
13
13
  end
14
-
15
- gem "ogc-gml", github: "lutaml/ogc-gml"
@@ -1,5 +1,4 @@
1
1
  require "coradoc"
2
- require "coradoc/input/html"
3
2
 
4
3
  module Metanorma
5
4
  module Plugin
@@ -7,6 +6,7 @@ module Metanorma
7
6
  module Liquid
8
7
  module CustomFilters
9
8
  def html2adoc(input)
9
+ # Coradoc::ReverseAdoc.convert(input)
10
10
  Coradoc::Input::HTML.convert(input)
11
11
  end
12
12
 
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableAttributeDrop < Liquid::Drop
4
+ LOWER_VALUE_MAPPINGS = {
5
+ "C" => "0",
6
+ "M" => "1",
7
+ }.freeze
8
+
9
+ def initialize(attr) # rubocop:disable Lint/MissingSuper
10
+ @attr = attr
11
+ end
12
+
13
+ def id
14
+ @attr[:id]
15
+ end
16
+
17
+ def name
18
+ @attr[:name]
19
+ end
20
+
21
+ def type
22
+ @attr[:type]
23
+ end
24
+
25
+ def xmi_id
26
+ @attr[:xmi_id]
27
+ end
28
+
29
+ def is_derived
30
+ @attr[:is_derived]
31
+ end
32
+
33
+ def cardinality
34
+ min = @attr[:cardinality]["min"]
35
+ min = min.nil? ? nil : LOWER_VALUE_MAPPINGS[min]
36
+
37
+ "#{min}..#{@attr[:cardinality]['max']}"
38
+ end
39
+
40
+ def definition
41
+ @attr[:definition]
42
+ end
43
+
44
+ def association
45
+ @attr[:association]
46
+ end
47
+
48
+ def has_association?
49
+ !!@attr[:association]
50
+ end
51
+
52
+ def upper_klass
53
+ @attr[:upper_klass]
54
+ end
55
+
56
+ def name_ns
57
+ @attr[:name_ns]
58
+ end
59
+
60
+ def type_ns
61
+ @attr[:type_ns]
62
+ end
63
+
64
+ def gen_name
65
+ @attr[:gen_name]
66
+ end
67
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableContentDrop < Liquid::Drop
4
+ def initialize(content) # rubocop:disable Lint/MissingSuper
5
+ @content = content
6
+ end
7
+
8
+ def owned_props
9
+ @content[:owned_props]
10
+ end
11
+
12
+ def assoc_props
13
+ @content[:assoc_props]
14
+ end
15
+
16
+ def inherited_props
17
+ @content[:inherited_props]
18
+ end
19
+
20
+ def inherited_assoc_props
21
+ @content[:inherited_assoc_props]
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableDrop < Liquid::Drop
4
+ def initialize(klass) # rubocop:disable Lint/MissingSuper
5
+ @klass = klass
6
+ end
7
+
8
+ def id
9
+ @klass[:general_id]
10
+ end
11
+
12
+ def name
13
+ @klass[:name]
14
+ end
15
+
16
+ def stereotype
17
+ @klass[:stereotype]
18
+ end
19
+
20
+ def definition
21
+ @klass[:definition]
22
+ end
23
+
24
+ def type
25
+ @klass[:type]
26
+ end
27
+
28
+ def upper_klass
29
+ @klass[:general_upper_klass]
30
+ end
31
+
32
+ def general
33
+ KlassTableGeneralDrop.new(@klass[:general]) if @klass[:general]
34
+ end
35
+
36
+ def has_general?
37
+ !!@klass[:general]
38
+ end
39
+
40
+ def attributes
41
+ @klass[:general_attributes].map do |attr|
42
+ KlassTableAttributeDrop.new(attr)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableGeneralDrop < Liquid::Drop
4
+ def initialize(gen) # rubocop:disable Lint/MissingSuper
5
+ @gen = gen
6
+ end
7
+
8
+ def id
9
+ @gen[:general_id]
10
+ end
11
+
12
+ def name
13
+ @gen[:general_name]
14
+ end
15
+
16
+ def upper_klass
17
+ @gen[:general_upper_klass]
18
+ end
19
+
20
+ def general
21
+ KlassTableGeneralDrop.new(@gen[:general]) if @gen[:general]
22
+ end
23
+
24
+ def has_general?
25
+ !!@gen[:general]
26
+ end
27
+
28
+ def attributes
29
+ @gen[:general_attributes].map do |attr|
30
+ KlassTableAttributeDrop.new(attr)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ {%- for attr in attributes -%}
2
+ {%- if attr.has_association? != false -%}
3
+ {%- capture name_col -%}
4
+ {{ attr.name_ns }}:{{ attr.name }}
5
+ ({{ attr.gen_name }})
6
+ {%- endcapture -%}
7
+ | {{ name_col | newline_to_br }}
8
+ | {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality }}]
9
+ | {{ attr.definition }}
10
+ {%- endif -%}
11
+ {%- endfor -%}
@@ -0,0 +1,11 @@
1
+ {%- for attr in attributes -%}
2
+ {%- if attr.has_association? == false -%}
3
+ {%- capture name_col -%}
4
+ {{ attr.name_ns }}:{{ attr.name }}
5
+ ({{ attr.gen_name }})
6
+ {%- endcapture -%}
7
+ | {{ name_col | newline_to_br }}
8
+ | {{ attr.type }} [{{ attr.cardinality }}]
9
+ | {{ attr.definition }}
10
+ {%- endif -%}
11
+ {%- endfor -%}
@@ -0,0 +1,23 @@
1
+ [cols="1a,1a,2a"]
2
+ |===
3
+ | 型の定義
4
+ 2+| {{ root.definition }}
5
+
6
+ h| 上位の型 2+| {{ root.general.upper_klass }}:{{ root.general.name }}
7
+ h| ステレオタイプ 2+| << {{ root.stereotype }} >>
8
+
9
+ 3+h| 継承する属性
10
+ h| 属性名 h| 属性の型及び多重度 h| 定義
11
+ {{ content.inherited_props }}
12
+
13
+ 3+h| 自身に定義された属性
14
+ {{ content.owned_props }}
15
+
16
+ 3+h| 継承する関連役割
17
+ h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
18
+ {{ content.inherited_assoc_props }}
19
+
20
+ 3+h| 自身に定義された関連役割
21
+ h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
22
+ {{ content.assoc_props }}
23
+ |===
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "liquid"
4
+ require "asciidoctor"
5
+ require "asciidoctor/reader"
6
+ require "lutaml"
7
+ # require "lutaml/uml"
8
+ require "xmi"
9
+ require "lutaml/xmi"
10
+ require "metanorma/plugin/lutaml/utils"
11
+ require "metanorma/plugin/lutaml/asciidoctor/preprocessor"
12
+
13
+ module Metanorma
14
+ module Plugin
15
+ module Lutaml
16
+ # Macro for quick rendering of datamodel attributes/values tables
17
+ # from liquid drop object
18
+ class LutamlEaXmiPreprocessor <
19
+ ::Asciidoctor::Extensions::Preprocessor
20
+ MACRO_REGEXP =
21
+ /\[lutaml_ea_xmi,([^,]+),?(.+)?\]/.freeze
22
+ LIQUID_INCLUDE_PATH = File.join(
23
+ Gem.loaded_specs["metanorma-plugin-lutaml"].full_gem_path,
24
+ "lib", "metanorma", "plugin", "lutaml", "liquid_templates"
25
+ )
26
+ DEFAULT_RENDER_INCLUDE = "packages"
27
+ RENDER_STYLES_INCLUDES = {
28
+ "default" => "packages",
29
+ "entity_list" => "packages_entity_list",
30
+ "entity_list_class" => "packages_entity_list_class",
31
+ "data_dictionary" => "packages_data_dictionary",
32
+ }.freeze
33
+ RENDER_STYLE_ATTRIBUTE = "render_style"
34
+ SUPPORTED_NESTED_MACRO = %w[
35
+ before diagram_include_block after include_block package_text
36
+ ].freeze
37
+ # search document for block `lutaml_ea_xmi`
38
+ # read include derectives that goes after that in block and transform
39
+ # into yaml2text blocks
40
+ def process(document, reader)
41
+ r = Asciidoctor::PreprocessorNoIfdefsReader.new document, reader.lines
42
+ input_lines = r.readlines.to_enum
43
+ Asciidoctor::PreprocessorNoIfdefsReader
44
+ .new(document, processed_lines(document, input_lines))
45
+ end
46
+
47
+ private
48
+
49
+ def lutaml_document_from_file_or_cache(document, file_path, yaml_config)
50
+ full_path = Utils.relative_file_path(document, file_path)
51
+ if document.attributes["lutaml_xmi_cache"] &&
52
+ document.attributes["lutaml_xmi_cache"][full_path]
53
+ return document.attributes["lutaml_xmi_cache"][full_path]
54
+ end
55
+
56
+ yaml_config["ea_extension"]&.each do |ea_extension_path|
57
+ ea_extension_full_path = File.expand_path(
58
+ ea_extension_path, File.dirname(file_path)
59
+ )
60
+ Xmi::EaRoot.load_extension(ea_extension_full_path)
61
+ end
62
+
63
+ result_document = ::Lutaml::XMI::Parsers::XML.serialize_xmi_to_liquid(
64
+ File.new(
65
+ full_path, encoding: "UTF-8"
66
+ ),
67
+ )
68
+
69
+ document.attributes["lutaml_xmi_cache"] ||= {}
70
+ document.attributes["lutaml_xmi_cache"][full_path] = result_document
71
+ result_document
72
+ end
73
+
74
+ def parse_yaml_config_file(document, file_path)
75
+ return {} if file_path.nil?
76
+
77
+ relative_file_path = Utils.relative_file_path(document, file_path)
78
+ YAML.safe_load(File.read(relative_file_path, encoding: "UTF-8"))
79
+ end
80
+
81
+ def processed_lines(document, input_lines)
82
+ result = []
83
+ loop do
84
+ result.push(*process_text_blocks(document, input_lines))
85
+ end
86
+ result
87
+ end
88
+
89
+ def process_text_blocks(document, input_lines)
90
+ line = input_lines.next
91
+ block_match = line.match(MACRO_REGEXP)
92
+
93
+ return [line] if block_match.nil?
94
+
95
+ yaml_config = parse_yaml_config_file(document, block_match[2])
96
+ lutaml_document = lutaml_document_from_file_or_cache(document,
97
+ block_match[1],
98
+ yaml_config)
99
+ fill_in_diagrams_attributes(document, lutaml_document)
100
+ model_representation(
101
+ lutaml_document, document,
102
+ collect_additional_context(document, input_lines, input_lines.next),
103
+ yaml_config
104
+ )
105
+ end
106
+
107
+ def fill_in_entities_refs_attributes(document,
108
+ lutaml_document, options)
109
+ # render_style = options.fetch(RENDER_STYLE_ATTRIBUTE, "default")
110
+ all_children_packages = lutaml_document.packages
111
+ .map(&:children_packages).flatten
112
+ package_flat_packages = lambda do |pks|
113
+ pks.each_with_object({}) do |package, res|
114
+ res[package.name] = package.xmi_id
115
+ end
116
+ end
117
+ children_pks = package_flat_packages.call(all_children_packages)
118
+ ref_dictionary = package_flat_packages.call(lutaml_document.packages)
119
+ .merge(children_pks)
120
+ %w[class enum data_type].each do |type|
121
+ package_flat = lambda do |pks|
122
+ pks.each_with_object({}) do |package, res|
123
+ plural = type == "class" ? "classes" : "#{type}s"
124
+ package.send(plural).map do |entity|
125
+ res["#{type}:#{package.name}:#{entity.name}"] = entity.xmi_id
126
+ end
127
+ end
128
+ end
129
+ children_pks_diags = package_flat.call(all_children_packages)
130
+ ref_dictionary = ref_dictionary
131
+ .merge(package_flat.call(lutaml_document.packages)
132
+ .merge(children_pks_diags))
133
+ end
134
+ document.attributes["lutaml_entity_id"] = ref_dictionary
135
+ end
136
+
137
+ def fill_in_diagrams_attributes(document, lutaml_document)
138
+ package_flat_diagrams = lambda do |pks|
139
+ pks.each_with_object({}) do |package, res|
140
+ package.diagrams.map do |diag|
141
+ res["#{package.name}:#{diag.name}"] = diag.xmi_id
142
+ end
143
+ end
144
+ end
145
+ children_pks_diags = package_flat_diagrams.call(
146
+ lutaml_document.packages.map(&:children_packages).flatten,
147
+ )
148
+
149
+ document.attributes["lutaml_figure_id"] = package_flat_diagrams
150
+ .call(lutaml_document.packages)
151
+ .merge(children_pks_diags)
152
+ end
153
+
154
+ def collect_additional_context(document, input_lines, end_mark)
155
+ additional_context = Hash.new { |hash, key| hash[key] = [] }
156
+ additional_context["all_macros"] = []
157
+ block_lines = []
158
+ while (block_line = input_lines.next) != end_mark
159
+ block_lines.push(block_line)
160
+ end
161
+ processed_lines =
162
+ process(document, ::Asciidoctor::PreprocessorReader.new(
163
+ document, block_lines
164
+ ))
165
+ .read_lines
166
+ block_document = ::Asciidoctor::Document
167
+ .new(processed_lines, {}).parse
168
+ block_document.blocks.each do |block|
169
+ next unless SUPPORTED_NESTED_MACRO.include?(block.attributes["role"])
170
+
171
+ attrs = block.attributes
172
+ name = attrs.delete("role")
173
+ package = attrs.delete("package")
174
+ macro_keyword = [name, package].compact.join(";")
175
+ block_text = block.lines.length.positive? ? block.lines.join("\n") : ""
176
+ additional_context[macro_keyword]
177
+ .push({ "text" => block_text }.merge(attrs))
178
+ additional_context["all_macros"]
179
+ .push({ "text" => block_text,
180
+ "type" => name, "package" => package }.merge(attrs))
181
+ end
182
+ additional_context
183
+ end
184
+
185
+ def package_level(lutaml_document, level)
186
+ return lutaml_document if level <= 0
187
+
188
+ package_level(lutaml_document["packages"].first, level - 1)
189
+ end
190
+
191
+ def create_context_object(lutaml_document, additional_context, options)
192
+ root_package = package_level(lutaml_document.to_liquid,
193
+ options["package_root_level"] || 1)
194
+ if options.empty? || options["packages"].nil?
195
+ return {
196
+ "render_nested_packages" => true,
197
+ "packages" => root_package["packages"],
198
+ "root_packages" => [root_package],
199
+ "additional_context" => additional_context
200
+ .merge("external_classes" => options["external_classes"]),
201
+ "name" => root_package["name"],
202
+ }
203
+ end
204
+
205
+ all_packages = [root_package, *root_package["children_packages"]]
206
+ {
207
+ "packages" => sort_and_filter_out_packages(all_packages, options),
208
+ "package_entities" => package_entities(options),
209
+ "package_skip_sections" => package_skip_sections(options),
210
+ "additional_context" => additional_context
211
+ .merge("external_classes" => options["external_classes"]),
212
+ "root_packages" => [root_package],
213
+ "render_nested_packages" => options["render_nested_packages"] ||
214
+ false,
215
+ "name" => root_package["name"],
216
+ }
217
+ end
218
+
219
+ def package_entities(options)
220
+ return {} unless options["packages"]
221
+
222
+ options["packages"]
223
+ .find_all { |entity| entity.is_a?(Hash) && entity.values.first["render_entities"] }
224
+ .map do |entity|
225
+ [entity.keys.first,
226
+ entity.values.first["render_entities"].map { |n| [n, true] }.to_h]
227
+ end.to_h
228
+ end
229
+
230
+ def package_skip_sections(options)
231
+ return {} unless options["packages"]
232
+
233
+ options["packages"]
234
+ .find_all { |entity| entity.is_a?(Hash) && entity.values.first["skip_tables"] }
235
+ .map do |entity|
236
+ [entity.keys.first, entity.values.first["skip_tables"].map do |n|
237
+ [n, true]
238
+ end.to_h]
239
+ end.to_h
240
+ end
241
+
242
+ def sort_and_filter_out_packages(all_packages, options)
243
+ return all_packages if options["packages"].nil?
244
+
245
+ result = []
246
+ # Step one - filter out all skipped packages
247
+ options["packages"]
248
+ .find_all { |entity| entity.is_a?(Hash) && entity["skip"] }
249
+ .each do |entity|
250
+ entity_regexp = config_entity_regexp(entity["skip"])
251
+ all_packages
252
+ .delete_if { |package| package["name"] =~ entity_regexp }
253
+ end
254
+ # Step two - select supplied packages by pattern
255
+ options["packages"]
256
+ .find_all { |entity| entity.is_a?(String) || (entity.is_a?(Hash) && !entity["skip"]) }
257
+ .each do |entity_obj|
258
+ entity = entity_obj.is_a?(String) ? entity_obj : entity_obj.keys.first
259
+ entity_regexp = config_entity_regexp(entity)
260
+ all_packages.each do |package|
261
+ if package["name"]&.match?(entity_regexp)
262
+ result.push(package)
263
+ all_packages
264
+ .delete_if { |nest_package| nest_package["name"] == package["name"] }
265
+ end
266
+ end
267
+ end
268
+ result
269
+ end
270
+
271
+ def config_entity_regexp(entity)
272
+ additional_sym = ".*" if /\*$/.match?(entity)
273
+ %r{^#{Regexp.escape(entity.delete('*'))}#{additional_sym}$}
274
+ end
275
+
276
+ def model_representation(lutaml_document, document, additional_context,
277
+ options)
278
+ fill_in_entities_refs_attributes(document, lutaml_document, options)
279
+ render_result, errors = Utils.render_liquid_string(
280
+ template_string: template(options["section_depth"] || 2,
281
+ options["render_style"],
282
+ options["include_root"]),
283
+ context_items: create_context_object(lutaml_document,
284
+ additional_context,
285
+ options),
286
+ context_name: "context",
287
+ document: document,
288
+ include_path: LIQUID_INCLUDE_PATH,
289
+ )
290
+ Utils.notify_render_errors(document, errors)
291
+ render_result.split("\n")
292
+ end
293
+
294
+ def template(section_depth, render_style, include_root)
295
+ include_name = RENDER_STYLES_INCLUDES.fetch(render_style,
296
+ DEFAULT_RENDER_INCLUDE)
297
+ result = ""
298
+ if include_root
299
+ result += <<~LIQUID
300
+ {% include "#{include_name}", package_skip_sections: context.package_skip_sections, package_entities: context.package_entities, context: context.root_packages, additional_context: context.additional_context, render_nested_packages: false %}
301
+ LIQUID
302
+ end
303
+ result + <<~LIQUID
304
+ {% include "#{include_name}", depth: #{section_depth}, package_skip_sections: context.package_skip_sections, package_entities: context.package_entities, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
305
+ LIQUID
306
+ end
307
+ end
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "liquid_drops/klass_table_drop"
4
+ require_relative "liquid_drops/klass_table_attribute_drop"
5
+ require_relative "liquid_drops/klass_table_general_drop"
6
+ require_relative "liquid_drops/klass_table_content_drop"
7
+
8
+ module Metanorma
9
+ module Plugin
10
+ module Lutaml
11
+ class LutamlKlassTableBlockMacro < ::Asciidoctor::Extensions::BlockMacroProcessor
12
+ DEFAULT_TEMPLATE_PATH = File.join(
13
+ Gem::Specification.find_by_name("metanorma-plugin-lutaml").gem_dir,
14
+ "lib/metanorma/plugin/lutaml/liquid_templates/<NAME>.liquid",
15
+ )
16
+ DEFAULT_TABLE_TEMPLATE = DEFAULT_TEMPLATE_PATH
17
+ .gsub("<NAME>", "_klass_table")
18
+ DEFAULT_ROW_TEMPLATE = DEFAULT_TEMPLATE_PATH
19
+ .gsub("<NAME>", "_klass_row")
20
+ DEFAULT_ASSOC_ROW_TEMPLATE = DEFAULT_TEMPLATE_PATH
21
+ .gsub("<NAME>", "_klass_assoc_row")
22
+
23
+ use_dsl
24
+ named :lutaml_klass_table
25
+
26
+ def process(parent, target, attrs)
27
+ result_path = Utils.relative_file_path(parent.document, target)
28
+
29
+ gen = ::Lutaml::XMI::Parsers::XML.serialize_generalization_by_name(
30
+ result_path, attrs["name"]
31
+ )
32
+
33
+ render(gen, parent, attrs)
34
+ end
35
+
36
+ private
37
+
38
+ def render(gen, parent, attrs) # rubocop:disable Metrics/MethodLength
39
+ content = {}
40
+
41
+ content[:owned_props] = render_owned_props(
42
+ gen, parent, attrs
43
+ )
44
+ content[:assoc_props] = render_assoc_props(
45
+ gen, parent, attrs
46
+ )
47
+ content[:inherited_props] = render_inherited_props(
48
+ gen, parent, attrs
49
+ )
50
+ content[:inherited_assoc_props] = render_inherited_assoc_props(
51
+ gen, parent, attrs
52
+ )
53
+
54
+ # content[:inherited_props] += render_named_inherited_props(
55
+ # gen, parent, attrs, "gml"
56
+ # )
57
+ # content[:inherited_props] += render_named_inherited_props(
58
+ # gen, parent, attrs, "core"
59
+ # )
60
+ # content[:inherited_assoc_props] += render_named_inherited_props(
61
+ # gen, parent, attrs, "gen"
62
+ # )
63
+
64
+ rendered_table = render_table(gen, parent, attrs, content)
65
+
66
+ block = create_open_block(parent, "", attrs)
67
+ parse_content(block, rendered_table, attrs)
68
+ end
69
+
70
+ def render_table(gen, parent, attrs, content)
71
+ table_tmpl = get_template(
72
+ parent.document, attrs["table_template"], :table
73
+ )
74
+
75
+ table_tmpl.assigns["root"] = KlassTableDrop.new(gen)
76
+ table_tmpl.assigns["content"] =
77
+ KlassTableContentDrop.new(content)
78
+
79
+ table_tmpl.render
80
+ end
81
+
82
+ def render_general_rows(general_item, parent, attrs)
83
+ row_tmpl = get_template(
84
+ parent.document, attrs["row_template"], :row
85
+ )
86
+ render_rows(general_item, row_tmpl)
87
+ end
88
+
89
+ def render_assoc_rows(general_item, parent, attrs)
90
+ row_tmpl = get_template(
91
+ parent.document, attrs["assoc_template"], :assoc_row
92
+ )
93
+ render_rows(general_item, row_tmpl)
94
+ end
95
+
96
+ def render_rows(general_item, row_tmpl)
97
+ gen_attrs = general_item[:general_attributes]
98
+ upper_klass = general_item[:general_upper_klass]
99
+ gen_name = general_item[:general_name]
100
+ attributes = prepare_row_drops(gen_attrs, upper_klass, gen_name)
101
+ row_tmpl.assigns["attributes"] = attributes
102
+ row_tmpl.render
103
+ end
104
+
105
+ def prepare_row_drops(gen_attrs, upper_klass, gen_name) # rubocop:disable Metrics/MethodLength
106
+ gen_attrs.map do |attr|
107
+ attr[:gen_name] = gen_name
108
+ attr[:upper_klass] = upper_klass
109
+ attr[:name_ns] = case attr[:type_ns]
110
+ when "core", "gml"
111
+ upper_klass
112
+ else
113
+ attr[:type_ns]
114
+ end
115
+
116
+ attr[:name_ns] = upper_klass if attr[:name_ns].nil?
117
+
118
+ KlassTableAttributeDrop.new(attr)
119
+ end
120
+ end
121
+
122
+ def render_owned_props(gen, parent, attrs)
123
+ render_general_rows(gen, parent, attrs)
124
+ end
125
+
126
+ def render_assoc_props(gen, parent, attrs)
127
+ render_assoc_rows(gen, parent, attrs)
128
+ end
129
+
130
+ def render_gml_inherited_props(gen, parent, attrs)
131
+ render_named_inherited_props(gen, parent, attrs, "gml")
132
+ end
133
+
134
+ def render_core_inherited_props(gen, parent, attrs)
135
+ render_named_inherited_props(gen, parent, attrs, "core")
136
+ end
137
+
138
+ def render_gen_inherited_props(gen, parent, attrs)
139
+ render_named_inherited_props(gen, parent, attrs, "gen")
140
+ end
141
+
142
+ def render_named_inherited_props(gen, parent, attrs, name)
143
+ attr_key = "#{name}_attributes".to_sym
144
+ general_item = {}
145
+ general_item[:general_attributes] = gen[attr_key]
146
+ general_item[:general_upper_klass] = gen[attr_key].first[:upper_klass]
147
+ general_item[:general_name] = name
148
+
149
+ render_general_rows(general_item, parent, attrs)
150
+ end
151
+
152
+ def render_inherited_props(gen, parent, attrs)
153
+ render_inherited_rows(gen, parent, attrs, assoc: false)
154
+ end
155
+
156
+ def render_inherited_assoc_props(gen, parent, attrs)
157
+ render_inherited_rows(gen, parent, attrs, assoc: true)
158
+ end
159
+
160
+ def render_inherited_rows(gen, parent, attrs, assoc: false) # rubocop:disable Metrics/MethodLength
161
+ rendered_rows = ""
162
+ general_item = gen[:general]
163
+
164
+ while general_item && !general_item.empty?
165
+ rendered_rows += if assoc
166
+ render_assoc_rows(general_item, parent, attrs)
167
+ else
168
+ render_general_rows(general_item, parent, attrs)
169
+ end
170
+ general_item = general_item[:general]
171
+ end
172
+
173
+ rendered_rows
174
+ end
175
+
176
+ def get_template(document, template_path, tmpl_type)
177
+ if template_path.nil?
178
+ template_path = get_default_template_path(tmpl_type)
179
+ end
180
+
181
+ rel_tmpl_path = Utils.relative_file_path(
182
+ document, template_path
183
+ )
184
+
185
+ ::Liquid::Template.parse(File.read(rel_tmpl_path))
186
+ end
187
+
188
+ def get_default_template_path(tmpl_type)
189
+ case tmpl_type
190
+ when :row
191
+ DEFAULT_ROW_TEMPLATE
192
+ when :assoc_row
193
+ DEFAULT_ASSOC_ROW_TEMPLATE
194
+ else
195
+ DEFAULT_TABLE_TEMPLATE
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -121,10 +121,10 @@ options)
121
121
  end
122
122
  end
123
123
  end
124
- children_pks_daigs = package_flat.call(all_children_packages)
124
+ children_pks_diags = package_flat.call(all_children_packages)
125
125
  ref_dictionary = ref_dictionary
126
126
  .merge(package_flat.call(lutaml_document.packages)
127
- .merge(children_pks_daigs))
127
+ .merge(children_pks_diags))
128
128
  end
129
129
  document.attributes["lutaml_entity_id"] = ref_dictionary
130
130
  end
@@ -138,12 +138,12 @@ options)
138
138
  end
139
139
  end
140
140
  end
141
- children_pks_daigs = package_flat_diagrams.call(
141
+ children_pks_diags = package_flat_diagrams.call(
142
142
  lutaml_document.packages.map(&:children_packages).flatten,
143
143
  )
144
144
  document.attributes["lutaml_figure_id"] = package_flat_diagrams
145
145
  .call(lutaml_document.packages)
146
- .merge(children_pks_daigs)
146
+ .merge(children_pks_diags)
147
147
  end
148
148
 
149
149
  def collect_additional_context(document, input_lines, end_mark)
@@ -265,7 +265,7 @@ options)
265
265
 
266
266
  def config_entity_regexp(entity)
267
267
  additional_sym = ".*" if /\*$/.match?(entity)
268
- %r{^#{Regexp.escape(entity.gsub('*', ''))}#{additional_sym}$}
268
+ %r{^#{Regexp.escape(entity.delete('*'))}#{additional_sym}$}
269
269
  end
270
270
 
271
271
  def model_representation(lutaml_document, document, additional_context,
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Lutaml
4
- VERSION = "0.7.7".freeze
4
+ VERSION = "0.7.9".freeze
5
5
  end
6
6
  end
7
7
  end
@@ -3,6 +3,7 @@ require "metanorma/plugin/lutaml/lutaml_preprocessor"
3
3
  require "metanorma/plugin/lutaml/lutaml_uml_class_preprocessor"
4
4
  require "metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor"
5
5
  require "metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor"
6
+ require "metanorma/plugin/lutaml/lutaml_ea_xmi_preprocessor"
6
7
  require "metanorma/plugin/lutaml/lutaml_diagram_block"
7
8
  require "metanorma/plugin/lutaml/lutaml_diagram_block_macro"
8
9
  require "metanorma/plugin/lutaml/lutaml_figure_inline_macro"
@@ -11,6 +12,7 @@ require "metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro"
11
12
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_base"
12
13
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_block_macro"
13
14
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_block"
15
+ require "metanorma/plugin/lutaml/lutaml_klass_table_block_macro"
14
16
 
15
17
  module Metanorma
16
18
  module Plugin
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-plugin-lutaml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-18 00:00:00.000000000 Z
11
+ date: 2024-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -332,7 +332,14 @@ files:
332
332
  - lib/metanorma/plugin/lutaml/liquid/multiply_local_file_system.rb
333
333
  - lib/metanorma/plugin/lutaml/liquid_drops/gml_dictionary_drop.rb
334
334
  - lib/metanorma/plugin/lutaml/liquid_drops/gml_dictionary_entry_drop.rb
335
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_attribute_drop.rb
336
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_content_drop.rb
337
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_drop.rb
338
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_general_drop.rb
335
339
  - lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid
340
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_assoc_row.liquid
341
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_row.liquid
342
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_table.liquid
336
343
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid
337
344
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_class.liquid
338
345
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary.liquid
@@ -348,10 +355,12 @@ files:
348
355
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
349
356
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
350
357
  - lib/metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro.rb
358
+ - lib/metanorma/plugin/lutaml/lutaml_ea_xmi_preprocessor.rb
351
359
  - lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
352
360
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_base.rb
353
361
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_block.rb
354
362
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_block_macro.rb
363
+ - lib/metanorma/plugin/lutaml/lutaml_klass_table_block_macro.rb
355
364
  - lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb
356
365
  - lib/metanorma/plugin/lutaml/lutaml_table_inline_macro.rb
357
366
  - lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb