metanorma-plugin-lutaml 0.7.8 → 0.7.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '091036d68a92b76cdfb383ae829bd65182a26ddc1146cce1d844a5646c27ca83'
4
- data.tar.gz: 39bfe3ec5d4b57985902f5ab17f6d097db903f3151efee95068cefe4d2861f5e
3
+ metadata.gz: 4a8884a3a005d1987c9403af11f7dddb62657e28178881e7ef848383280edfcb
4
+ data.tar.gz: 210ca361b8facc4702196a1f2f734e79abe0b325e30db269c991884c0cbc2714
5
5
  SHA512:
6
- metadata.gz: 4276c20cae2b83cc37b562217429e00b951a2e0a73bf384f931b47bd94b71774db3b42d62cfc1c380bf3b64bf9b6d5c6b8d98fbe18b5b2d9426558ba8aa40a1e
7
- data.tar.gz: 4323e58139487b3192af2da916a8142f1bd56b7cf8d2df3dae2882172ea7cf22c10e0cfd4d31278cbd3e731f2a689ab871e6a5baa1d89d462a95df90ab389500
6
+ metadata.gz: ab318c1c9a6bf060093600533ff59c6b293c70a90c3096ec5ab88100546e2ae2a18d0e52f8571bdf72d1da14df0fd6fdbfbc7a8cf3c9716ba34a2f154a4e5f64
7
+ data.tar.gz: 0e3acb93421b591442d0293c08c5fb9b2e8e8c1f4925eb5f9f0fbbb77997b5cbc80e8e30cce5dd4accc4b1fe40d91c2ebce09e7f17db901ad8afbb82b8d0cb37
data/Gemfile CHANGED
@@ -11,7 +11,3 @@ begin
11
11
  rescue StandardError
12
12
  nil
13
13
  end
14
-
15
- # gem "lutaml", path: "../../lutaml/lutaml"
16
-
17
- gem "ogc-gml", github: "lutaml/ogc-gml"
data/README.adoc CHANGED
@@ -315,7 +315,7 @@ lutaml_gml_dictionary::/path/to/dictionary.xml[template="/path/to/template.liqui
315
315
 
316
316
  The command accepts the options listed below:
317
317
 
318
- * `"/path/to/dictionary.xml` specifies the path of xml file of the
318
+ * `/path/to/dictionary.xml` specifies the path of xml file of the
319
319
  GML Dictionary.
320
320
 
321
321
  * `template="/path/to/template.liquid"` specifies the liquid template.
@@ -364,6 +364,36 @@ h| Help | Description
364
364
  --
365
365
  -----
366
366
 
367
+ === Rendering a LutaML table of a class: `lutaml_klass_table`
368
+
369
+ This command allows to render a LutaML table of a class by using Liquid Drop.
370
+
371
+ The table will show:
372
+
373
+ * Class Name
374
+ * Class Definition
375
+ * Inherited Properties
376
+ * Self-defined Properties
377
+ * Properties Inherited from Association
378
+ * Properties Defined in Association
379
+
380
+ [source,adoc]
381
+ -----
382
+ lutaml_klass_table::/path/to/example.xmi[name="NameOfClass",tmpl_folder="/path/to/templates"]
383
+ -----
384
+
385
+ The command accepts the options listed below:
386
+
387
+ * `/path/to/example.xmi` specifies the path of xmi file.
388
+
389
+ * `name="NameOfClass"` specifies the name of the Class.
390
+
391
+ * `tmpl_folder="/path/to/templates"` specifies the folder path of the templates.
392
+ (Optional) By default, it will look for the templates `_klass_table.liquid`,
393
+ `_klass_row.liquid` and `_klass_assoc_row.liquid` defined in
394
+ `lib/metanorma/plugin/lutaml/templates`. These templates can be customized by
395
+ defining them in `/path/to/templates` and then set the `tmpl_folder` option.
396
+
367
397
  === Generating UML class and attributes: `lutaml_uml_class`
368
398
 
369
399
  This command allows rendering a definition clause for a UML class.
@@ -796,6 +826,33 @@ and iterate through packages according to the order supplied in the file. All
796
826
  packages that matches `skip` in the YAML config file will be skipped during
797
827
  render.
798
828
 
829
+ === Usage of `lutaml_ea_xmi` macro
830
+
831
+ This command is a replacement for `lutaml_uml_datamodel_description` to perform
832
+ the same functionalities of `lutaml_uml_datamodel_description`, which is to
833
+ render data model packages and its dependent objects for supplied XMI file, by
834
+ using Liquid Drop. The performance of `lutaml_ea_xmi` can be improved by
835
+ 10~20 times. (Tested with a 10.6MB XMI file with 120000+ lines)
836
+
837
+ To use this macro, you only need to replace `lutaml_uml_datamodel_description`
838
+ by `lutaml_ea_xmi`.
839
+
840
+ Replace:
841
+
842
+ [source,adoc]
843
+ -----
844
+ [lutaml_uml_datamodel_description, path/to/example.xmi]
845
+ ...
846
+ -----
847
+
848
+ By:
849
+
850
+ [source,adoc]
851
+ -----
852
+ [lutaml_ea_xmi, path/to/example.xmi]
853
+ ...
854
+ -----
855
+
799
856
  == Documentation
800
857
 
801
858
  Please refer to https://www.metanorma.org.
@@ -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
 
@@ -1,23 +1,24 @@
1
1
  [cols="1a,1a,2a"]
2
2
  |===
3
- | 型の定義
3
+ | Definition of Type
4
4
  2+| {{ root.definition }}
5
5
 
6
- h| 上位の型 2+| {{ root.general.upper_klass }}:{{ root.general.name }}
7
- h| ステレオタイプ 2+| << {{ root.stereotype }} >>
6
+ h| Upper Type 2+| {{ root.general.upper_klass }}:{{ root.general.name }}
7
+ h| Stereotype 2+| << {{ root.stereotype }} >>
8
8
 
9
- 3+h| 継承する属性
10
- h| 属性名 h| 属性の型及び多重度 h| 定義
9
+ 3+h| Inherited Properties
10
+ h| Property Name h| Property Type and Multiplicity h| Definition
11
11
  {{ content.inherited_props }}
12
12
 
13
- 3+h| 自身に定義された属性
13
+ 3+h| Self-defined Properties
14
+ h| Property Name h| Property Type and Multiplicity h| Definition
14
15
  {{ content.owned_props }}
15
16
 
16
- 3+h| 継承する関連役割
17
- h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
17
+ 3+h| Properties Inherited from Association
18
+ h| Property Name h| Property Type and Multiplicity h| Definition
18
19
  {{ content.inherited_assoc_props }}
19
20
 
20
- 3+h| 自身に定義された関連役割
21
- h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
21
+ 3+h| Properties Defined in Association
22
+ h| Property Name h| Property Type and Multiplicity h| Definition
22
23
  {{ content.assoc_props }}
23
24
  |===
@@ -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
@@ -11,23 +11,23 @@ module Metanorma
11
11
  class LutamlKlassTableBlockMacro < ::Asciidoctor::Extensions::BlockMacroProcessor
12
12
  DEFAULT_TEMPLATE_PATH = File.join(
13
13
  Gem::Specification.find_by_name("metanorma-plugin-lutaml").gem_dir,
14
- "lib/metanorma/plugin/lutaml/liquid_templates/<NAME>.liquid",
14
+ "lib", "metanorma", "plugin", "lutaml", "liquid_templates"
15
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
16
 
23
17
  use_dsl
24
18
  named :lutaml_klass_table
25
19
 
26
20
  def process(parent, target, attrs)
27
- result_path = Utils.relative_file_path(parent.document, target)
21
+ xmi_path = Utils.relative_file_path(parent.document, target)
22
+
23
+ if attrs["tmpl_folder"]
24
+ attrs["tmpl_folder"] = Utils.relative_file_path(
25
+ parent.document, attrs["tmpl_folder"]
26
+ )
27
+ end
28
28
 
29
29
  gen = ::Lutaml::XMI::Parsers::XML.serialize_generalization_by_name(
30
- result_path, attrs["name"]
30
+ xmi_path, attrs["name"]
31
31
  )
32
32
 
33
33
  render(gen, parent, attrs)
@@ -51,16 +51,6 @@ module Metanorma
51
51
  gen, parent, attrs
52
52
  )
53
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
54
  rendered_table = render_table(gen, parent, attrs, content)
65
55
 
66
56
  block = create_open_block(parent, "", attrs)
@@ -69,7 +59,7 @@ module Metanorma
69
59
 
70
60
  def render_table(gen, parent, attrs, content)
71
61
  table_tmpl = get_template(
72
- parent.document, attrs["table_template"], :table
62
+ parent.document, attrs, :table
73
63
  )
74
64
 
75
65
  table_tmpl.assigns["root"] = KlassTableDrop.new(gen)
@@ -81,14 +71,14 @@ module Metanorma
81
71
 
82
72
  def render_general_rows(general_item, parent, attrs)
83
73
  row_tmpl = get_template(
84
- parent.document, attrs["row_template"], :row
74
+ parent.document, attrs, :row
85
75
  )
86
76
  render_rows(general_item, row_tmpl)
87
77
  end
88
78
 
89
79
  def render_assoc_rows(general_item, parent, attrs)
90
80
  row_tmpl = get_template(
91
- parent.document, attrs["assoc_template"], :assoc_row
81
+ parent.document, attrs, :assoc_row
92
82
  )
93
83
  render_rows(general_item, row_tmpl)
94
84
  end
@@ -127,28 +117,6 @@ module Metanorma
127
117
  render_assoc_rows(gen, parent, attrs)
128
118
  end
129
119
 
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
120
  def render_inherited_props(gen, parent, attrs)
153
121
  render_inherited_rows(gen, parent, attrs, assoc: false)
154
122
  end
@@ -173,10 +141,13 @@ module Metanorma
173
141
  rendered_rows
174
142
  end
175
143
 
176
- def get_template(document, template_path, tmpl_type)
177
- if template_path.nil?
178
- template_path = get_default_template_path(tmpl_type)
144
+ def get_template(document, attrs, tmpl_type)
145
+ tmpl_folder = DEFAULT_TEMPLATE_PATH
146
+ if attrs["tmpl_folder"]
147
+ tmpl_folder = attrs["tmpl_folder"]
179
148
  end
149
+ template_path = get_default_template_path(tmpl_type, tmpl_folder,
150
+ attrs)
180
151
 
181
152
  rel_tmpl_path = Utils.relative_file_path(
182
153
  document, template_path
@@ -185,15 +156,17 @@ module Metanorma
185
156
  ::Liquid::Template.parse(File.read(rel_tmpl_path))
186
157
  end
187
158
 
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
159
+ def get_default_template_path(tmpl_type, tmpl_folder, attrs)
160
+ liquid_template = case tmpl_type
161
+ when :row
162
+ attrs["row_tmpl_name"] || "_klass_row"
163
+ when :assoc_row
164
+ attrs["assoc_row_tmpl_name"] || "_klass_assoc_row"
165
+ else
166
+ attrs["table_tmpl_name"] || "_klass_table"
167
+ end
168
+
169
+ File.join(tmpl_folder, "#{liquid_template}.liquid")
197
170
  end
198
171
  end
199
172
  end
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Lutaml
4
- VERSION = "0.7.8".freeze
4
+ VERSION = "0.7.10".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"
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.8
4
+ version: 0.7.10
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-19 00:00:00.000000000 Z
11
+ date: 2024-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -355,6 +355,7 @@ files:
355
355
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
356
356
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
357
357
  - lib/metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro.rb
358
+ - lib/metanorma/plugin/lutaml/lutaml_ea_xmi_preprocessor.rb
358
359
  - lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
359
360
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_base.rb
360
361
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_block.rb