metanorma-plugin-lutaml 0.4.3 → 0.4.7

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: a594ac058de2a8fc661fa9354e32c3e53cbba9ba831eb2241866c3fe50fef39e
4
- data.tar.gz: c9ccd2ad0f3d8bcb39da897b733f0c84a8aebf2b434f0c05e4229700e96b1042
3
+ metadata.gz: 6975d55ed93f086ff54367a880fe6cd997da1040dd5266d3c5c2f5c984370801
4
+ data.tar.gz: fa336cbe86550862521a4fe051a69dfdd8e809cc3ba652c07482ab6f9d5bb7ac
5
5
  SHA512:
6
- metadata.gz: 2761bf514acf0b0861a18c7d9182834868d3061e8720373e2e57bf5f31216e7a5c66e08fee6069f93c59074c352b8f4fb6f416cbd5a1644df0d55dc6db59860e
7
- data.tar.gz: 86489b0e1915b61997af3f55388ea4b788fe505188caca2efd40589b67c1ba4e9a0acba591d111c0af7c4943dbad1a3bd69dc0c0dd737663e93b1ada5436d046
6
+ metadata.gz: bf4817cf9ec3c41195ae30425bf4462f58dffce5773f4f07e146915a13fc7c1f9e46be8285c5f4814a673a7558aacb937b7e0dfb3939c644ad9b8cb438c1a580
7
+ data.tar.gz: e987082dd620fcf4b455204e86607df45632c5ce9bdca7dfd30815c1c720a6facab339a436d90cc8b78809c608c2271a8f7cb3e32dbad66205a25e3f11c525a7
data/README.adoc CHANGED
@@ -285,31 +285,45 @@ The `lutaml_uml_datamodel_description` macro can be used:
285
285
  -----
286
286
  [lutaml_uml_datamodel_description, path/to/example.xmi]
287
287
  --
288
- --
289
288
  [.before]
290
- ---
289
+ ....
291
290
  my text
292
- ---
291
+ ....
292
+
293
+ [.diagram_include_block, base_path="requirements/", format="emf"]
294
+ ....
295
+ Diagram text
296
+ ....
297
+
298
+ [.include_block, package="Another", base_path="spec/fixtures"]
299
+ ....
300
+ my text
301
+ ....
302
+
303
+ [.include_block, base_path="spec/fixtures"]
304
+ ....
305
+ my text
306
+ ....
293
307
 
294
308
  [.before, package="Another"]
295
- ---
309
+ ....
296
310
  text before Another package
297
- ---
311
+ ....
298
312
 
299
313
  [.after, package="Another"]
300
- ---
314
+ ....
301
315
  text after Another package
302
- ---
316
+ ....
303
317
 
304
318
  [.after, package="CityGML"]
305
- ---
319
+ ....
306
320
  text after CityGML package
307
- ---
321
+ ....
308
322
 
309
323
  [.after]
310
- ---
324
+ ....
311
325
  footer text
312
- ---
326
+ ....
313
327
  --
314
328
  --
315
329
  -----
@@ -318,102 +332,118 @@ Where:
318
332
 
319
333
  * `path/to/example.xmi` - required, path to the XMI file to render
320
334
 
321
- * `[.before]` - macro to add additional text before the rendered output, can be used only once, additional occurrences of macro will overwrite text
335
+ * `[.before]` - macro to add additional text before the rendered output, can be used only once, additional occurrences of macro will overwrite text, not that `literal` block style must be used in there(eg `....`)
322
336
 
323
337
  * `[.after]` - macro to add additional text after the rendered output, can be used only once, additional occurrences of macro will overwrite text
324
338
 
325
339
  * `[.after, package="Another"]` - macro with text to be inserted before(after in case of `.before` name) the package
326
340
 
327
-
328
- Will produce this output:
329
-
341
+ * `[.diagram_include_block]` - macro to automatically include diagram images. Attribute `base_path` is a required attribute to supply path prefix where to look for a digram image. `format` is an optional attribute that tells what file extention to use when including diagram file. The logic is as follows:
330
342
  [source,adoc]
331
343
  -----
332
- = preface
333
- my text
334
-
335
- text before Another package
336
-
337
- === Another
344
+ {% for diagram in package.diagrams %}
345
+ [[figure-{{ diagram.xmi_id }}]]
346
+ .{{ diagram.name }}
347
+ image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
348
+
349
+ {% if diagram.definition %}
350
+ {{ diagram.definition | html2adoc }}
351
+ {% endif %}
352
+ {% endfor %}
353
+ -----
354
+ Eg: script will take package diagrams supplied in xmi file and will try to include `image` with the name equal to diagram' xmi_id attribute plus `.png`. Also one can add any text to the macro text, it will be added as paragraph before each image include.
338
355
 
339
- [[rc_another-model_section]]
340
- ==== Another
356
+ * `[.diagram_include_block, package="Another"]` - same as above, but diagram will be included only for supplied package name
341
357
 
342
- ==== Requirements
358
+ * `[.include_block, base_path="spec/fixtures"]` - macro to inlude files(adoc/liquid) for each package name. Attribute `base_path` is a required attribute to supply path prefix where to look for file to include. Macro will look for a file called `base_path` + `/` `_package_name`(downcase, replace : -> '', ' ' -> '_') + `.adoc`[`.liquid`], eg for package 'My Package name' and `base_path` eq to `my/path`, macro will look for the following file path: `my/path/_my_package_name.adoc`.
343
359
 
344
- ==== Class Definitions
360
+ * `[.include_block, package="Another", base_path="spec/fixtures"]` - same as above, but include block will be included only for supplied package name
345
361
 
346
- .Classes used in Another
347
- [cols="2a,6a",options="header"]
348
- |===
349
- |Class |Description
362
+ In addition to macroses listed above that can be used only inside `lutaml_uml_datamodel_description` macro there is another macro called `lutaml_figure`. `lutaml_figure` is used to lookup and reference xmi package diagrams. The syntax is as follows:
350
363
 
364
+ [source,adoc]
365
+ -----
366
+ This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
367
+ -----
351
368
 
352
- |<<AbstractAtomicTimeseries-section,AbstractAtomicTimeseries>>
353
- «»
354
- |
369
+ This code will be transformed into `<<figure-{diagram.xmi_id}>>` and will point to diagram figure. One can only use this macro when document rendered `lutaml_uml_datamodel_description` macro as it needs diagram lookup table in order to refernce package diagram.
355
370
 
371
+ Will produce this output:
356
372
 
357
- |<<AbstractTimeseries-section,AbstractTimeseries>>
358
- «»
359
- |
373
+ [source,adoc]
374
+ -----
375
+ my text
376
+ == CityGML package
377
+ === CityGML overview
360
378
 
361
- ....
362
- |===
379
+ Diagram text
363
380
 
381
+ [[figure-EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29]]
382
+ .CityGML Package Diagram
383
+ image::requirements//EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29.png[]
364
384
 
385
+ BuildingFurnitureFunctionValue is a code list that enumerates the different purposes of a BuildingFurniture.
365
386
 
366
- .Data Types used in Another
367
- [cols="2,6",options="header"]
368
- |===
369
- |Name |Description
387
+ [[figure-EAID_938AE961_1C57_4052_B964_997D1894A58D]]
388
+ .Use of ISO and OASIS standards in CityGML
389
+ image::requirements//EAID_938AE961_1C57_4052_B964_997D1894A58D.png[]
370
390
 
391
+ The CityGML package is organized into
392
+ 2 packages with 1 modules:
371
393
 
372
- |<<ADEOfAbstractAtomicTimeseries-section,ADEOfAbstractAtomicTimeseries>>
373
- |
394
+ [arabic]
395
+ . Another package
396
+ . CityTML package
374
397
 
398
+ my text
375
399
 
376
- |<<ADEOfAbstractTimeseries-section,ADEOfAbstractTimeseries>>
377
- |
400
+ Content for CityGML package
378
401
 
379
- ....
380
- |===
402
+ ==== Defining tables
381
403
 
404
+ [arabic]
405
+ .<<tab-P-another-C-abstractatomictimeseries>> -- Elements of Another::AbstractAtomicTimeseries
382
406
 
383
-
384
- .Enumerated Classes used in Another
385
- [cols="2a,6a",options="header"]
407
+ [[tab-P-another-C-abstractatomictimeseries]]
408
+ .Elements of Another::AbstractAtomicTimeseries
409
+ [width="100%",cols="a,a,a,a,a,a,a,a"]
386
410
  |===
387
- |Name |Description
388
-
389
- |<<TimeseriesTypeValue-section,TimeseriesTypeValue>>
411
+ h|Name: 7+| AbstractAtomicTimeseries
412
+ h|Definition: 7+|
413
+ h|Stereotype: 7+| interface
414
+ h|Abstract: 7+|
415
+ .1+h|Associations: 7+| (none)
416
+ .4+h|Public attributes:
417
+ | _Name_
418
+ 2+| _Definition_
419
+ | _Derived_
420
+ | _Obligation_
421
+ | _Maximum occurrence_
422
+ | _Data type_
423
+ | adeOfAbstractAtomicTimeseries
424
+ 2+|
390
425
  |
391
-
426
+ | C
427
+ | *
428
+ | ADEOfAbstractAtomicTimeseries
429
+ | observationProperty
430
+ 2+|
431
+ |
432
+ | M
433
+ | 1
434
+ | CharacterString
435
+ | uom
436
+ 2+|
437
+ |
438
+ | C
439
+ | 1
440
+ | CharacterString
441
+ h|Constraints: 7+| (none)
392
442
  |===
393
443
 
394
-
395
- ==== Additional Information
396
-
397
- text after Another package
398
-
399
-
400
- === CityGML
401
-
402
- [[rc_citygml-model_section]]
403
- ==== CityGML
404
-
405
- ==== Requirements
406
-
407
- ==== Class Definitions
408
-
409
- ==== Additional Information
444
+ === Additional Information
410
445
 
411
446
  text after CityGML package
412
-
413
-
414
- = footer
415
- footer text
416
-
417
447
  -----
418
448
 
419
449
  In addition to just supplying XMI file, this macro also supports YAML
@@ -431,18 +461,21 @@ packages:
431
461
  - three
432
462
  # skips these packages
433
463
  - skip: four
464
+ render_style: entity_list|data_dictionary|default
465
+ section_depth: 2
434
466
  -----
435
467
 
436
468
  Where:
437
469
 
438
470
  * `packages` - required, root element with the list of strings or objects
439
-
440
471
  * `Package *` - pattern matching, specifies lookup condition for packages to
441
472
  render.
442
473
  +
443
474
  NOTE: In this example, it is equal to the following regular expression: `/^Package.*$/`
444
475
 
445
476
  * `skip: four` - object with package name to skip
477
+ * `render_style` - what template to use to render packages, can be: entity_list, data_dictionary or default
478
+ * `section_depth` - what package to use as root package for render, eg `section_depth` equal to 2 tells processor to use first nested package of the first root packages in xmi file. Example: if xmi file has this package structure: [{ name: 'One', packages: [{ name: 'one-1' }, { name: 'one-2' }] }, { name: 'Two', packages: [{ name: 'two-1' }, { name: 'two-2' }] }] and we have `section_depth` equal to 2, root package will be `one-1`
446
479
 
447
480
  Usage with macro:
448
481
 
@@ -4,6 +4,7 @@ require "metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor"
4
4
  require "metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor"
5
5
  require "metanorma/plugin/lutaml/lutaml_diagram_block"
6
6
  require "metanorma/plugin/lutaml/lutaml_diagram_block_macro"
7
+ require "metanorma/plugin/lutaml/lutaml_figure_inline_macro"
7
8
 
8
9
  module Metanorma
9
10
  module Plugin
@@ -0,0 +1,53 @@
1
+ module Metanorma
2
+ module Plugin
3
+ module Lutaml
4
+ module Liquid
5
+ class LocalFileSystem
6
+ attr_accessor :roots, :patterns
7
+
8
+ def initialize(roots, patterns = ["_%s.liquid"])
9
+ @roots = roots
10
+ @patterns = patterns
11
+ end
12
+
13
+ def read_template_file(template_path)
14
+ full_path = full_path(template_path)
15
+ raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path)
16
+
17
+ File.read(full_path)
18
+ end
19
+
20
+ def full_path(template_path)
21
+ raise ::Liquid::FileSystemError, "Illegal template name '#{template_path}'" unless %r{\A[^./][a-zA-Z0-9_/]+\z}.match?(template_path)
22
+
23
+ result_path = if template_path.include?('/')
24
+ roots
25
+ .map do |root|
26
+ patterns.map do |pattern|
27
+ File.join(root, File.dirname(template_path), pattern % File.basename(template_path))
28
+ end
29
+ end
30
+ .flatten
31
+ .find { |path| File.file?(path) }
32
+ else
33
+ roots
34
+ .map do |root|
35
+ patterns.map do |pattern|
36
+ File.join(root, pattern % template_path)
37
+ end
38
+ end
39
+ .flatten
40
+ .find { |path| File.file?(path) }
41
+ end
42
+
43
+ unless roots.any? { |root| File.expand_path(result_path).start_with?(File.expand_path(root)) }
44
+ raise ::Liquid::FileSystemError, "Illegal template path '#{File.expand_path(result_path)}'"
45
+ end
46
+
47
+ result_path
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,11 @@
1
+ {{ text }}
2
+
3
+ {% for diagram in package.diagrams %}
4
+ [[figure-{{ diagram.xmi_id }}]]
5
+ .{{ diagram.name }}
6
+ image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
7
+
8
+ {% if diagram.definition %}
9
+ {{ diagram.definition | html2adoc }}
10
+ {% endif %}
11
+ {% endfor %}
@@ -1,27 +1,29 @@
1
1
  {% for package in context.packages %}
2
- {% assign before_package_key = 'before;' | append: package.name %}
3
- {% if additional_context[before_package_key] %}
4
- {{ additional_context[before_package_key] }}
2
+ {% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
3
+ {% if additional_context.before and additional_context.before.size > 0 %}
4
+ {% for before in additional_context.before %}
5
+ {{ before.text }}
6
+ {% endfor %}
5
7
  {% endif %}
6
8
  {% assign is_package_spare = package.name | slice: 0,5 %}
7
9
  {% if is_package_spare == 'old: ' %}{% continue %}
8
10
  {% elsif is_package_spare == 'Spare' %}{% continue %}
9
11
  {% endif %}
10
- {% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
11
12
 
12
13
  {% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }} package
13
14
  {{equalsigns}}= {{ package.name }} overview
14
15
 
15
- // TODO: include blocks by base path
16
- //{% for diagram in package.diagrams %}
17
- //[[figure-{{ diagram.xmi_id }}]]
18
- //.{{ diagram.name }}
19
- //image::../../xmi-19170-only/Images/{{ diagram.xmi_id }}.png[]
20
- //
21
- //{% if diagram.definition %}
22
- //{{ diagram.definition | html2adoc }}
23
- //{% endif %}
24
- //{% endfor %}
16
+ {% assign before_package_key = 'before;' | append: package.name %}
17
+ {% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
18
+ {% for before in additional_context[before_package_key] %}
19
+ {{ before.text }}
20
+ {% endfor %}
21
+ {% endif %}
22
+ {% if additional_context.diagram_include_block %}
23
+ {% for diagram_include_block in additional_context.diagram_include_block %}
24
+ {% include "diagrams_block", package_name: package_name, image_base_path: diagram_include_block.base_path, text: diagram_include_block.text, format: diagram_include_block.format %}
25
+ {% endfor %}
26
+ {% endif %}
25
27
 
26
28
  {% if package.packages.size > 0 %}The {{ package.name }} package is organized into
27
29
  {{ package.packages.size }} packages{% assign modules_nested_size = 0 %}{% for module in package.packages %}{% assign modules_nested_size = modules_nested_size | plus: module.packages.size %}{% endfor %}{% if modules_nested_size > 0 %} with {{modules_nested_size}} modules{% endif %}:
@@ -38,7 +40,7 @@
38
40
  {% endif %}
39
41
  {% endfor %}
40
42
 
41
- {% if package.classes.size > 0 %}
43
+ {% if package.classes.size > 0 or package.enums.size > 0 or package.data_types.size > 0 %}
42
44
 
43
45
  {{equalsigns}}= Defining tables
44
46
 
@@ -83,26 +85,49 @@
83
85
  {% include "packages_data_type" %}
84
86
  {% endfor %}
85
87
 
86
- // TODO: include blocks by base path
87
- // {% capture requirement_filename %}requirements/REQ_{{ package_name }}{% endcapture %}
88
- // {% capture requirement_content %}{% include requirement_filename %}{% endcapture %}
89
- // {% unless requirement_content contains "Liquid error" %}
90
- // The following requirements apply:
91
- // {{ requirement_content }}
92
- //
93
- // {% for num in (1..5) %}
94
- // {% capture nested_requirement_filename %}requirements/REQ_{{ package_name }}_{{num}}{% endcapture %}
95
- // {% capture nested_requirement_content %}{% include nested_requirement_filename %}{% endcapture %}
96
- // {% unless nested_requirement_content contains "Liquid error" %}
97
- // {{ nested_requirement_content }}
98
- // {% endunless %}
99
- // {% endfor %}
100
- // {% endunless %}
88
+ {% endif %}
101
89
 
90
+ {% if additional_context.include_block and additional_context.include_block.size > 0 %}
91
+ {% for block in additional_context.include_block %}
92
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
93
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
94
+ {% unless block_content contains "Liquid error" %}
95
+ {% if block.text %}
96
+ {{ block.text }}
97
+ {% endif %}
98
+ {{ block_content }}
99
+ {% endunless %}
100
+ {% endfor %}
102
101
  {% endif %}
102
+
103
+ {% assign include_block_package_key = 'include_block;' | append: package.name %}
104
+ {% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
105
+ {% for block in additional_context[include_block_package_key] %}
106
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
107
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
108
+ {% unless block_content contains "Liquid error" %}
109
+ {% if block.text %}
110
+ {{ block.text }}
111
+ {% endif %}
112
+ {{ block_content }}
113
+ {% endunless %}
114
+ {% endfor %}
115
+ {% endif %}
116
+
103
117
  {% assign after_package_key = 'after;' | append: package.name %}
104
- {{equalsigns}}= Additional Information
105
118
  {% if additional_context[after_package_key] %}
106
- {{ additional_context[after_package_key] }}
119
+ {{equalsigns}}= Additional Information
120
+ {% for after in additional_context[after_package_key] %}
121
+ {{ after.text }}
122
+ {% endfor %}
123
+ {% endif %}
124
+ {% if package.packages.size > 0 and render_nested_packages %}
125
+ {% assign nested_depth = depth | plus: 1 %}{% include "packages", depth: nested_depth, context: package %}
107
126
  {% endif %}
108
127
  {% endfor %}
128
+
129
+ {% if additional_context.after and additional_context.after.size > 0 %}
130
+ {% for after in additional_context.after %}
131
+ {{ after.text }}
132
+ {% endfor %}
133
+ {% endif %}
@@ -0,0 +1,177 @@
1
+ {% for package in context.packages %}
2
+ {% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
3
+ {% if additional_context.before and additional_context.before.size > 0 %}
4
+ {% for before in additional_context.before %}
5
+ {{ before.text }}
6
+ {% endfor %}
7
+ {% endif %}
8
+ {% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }}
9
+ {{equalsigns}}= {{ package.name }}
10
+
11
+ {% assign before_package_key = 'before;' | append: package.name %}
12
+ {% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
13
+ {% for before in additional_context[before_package_key] %}
14
+ {{ before.text }}
15
+ {% endfor %}
16
+ {% endif %}
17
+
18
+ [cols="1a,4a"]
19
+ |===
20
+
21
+ h|Description: | {{ package.definition }}
22
+ h|Parent Package: | {{ context.name }}
23
+ h|Stereotype: | «{{ package.stereotype }}»
24
+
25
+ |===
26
+
27
+ {% assign feature_types = package.classes | where: "stereotype", "FeatureType" %}
28
+ {% assign object_types = package.classes | where: "stereotype", "ObjectType" %}
29
+ {% assign basic_types = package.classes | where: "stereotype", "BasicType" %}
30
+ {% assign unions = package.classes | where: "stereotype", "Union" %}
31
+ {% assign code_lists = package.classes | where: "stereotype", "CodeList" %}
32
+ {% if feature_types.size > 0 or object_types.size > 0 %}
33
+ {{equalsigns}}= Classes
34
+
35
+ {% include "packages_data_dictionary_classes", classes: feature_types %}
36
+ {% include "packages_data_dictionary_classes", classes: object_types %}
37
+ {% endif %}
38
+
39
+ {% if basic_types.size > 0 %}
40
+ {{equalsigns}}= Basic Types
41
+
42
+ {% include "packages_data_dictionary_classes", classes: basic_types %}
43
+ {% endif %}
44
+
45
+ {% if unions.size > 0 %}
46
+ {{equalsigns}}= Unions
47
+
48
+ {% include "packages_data_dictionary_classes", classes: unions %}
49
+ {% endif %}
50
+
51
+ {% if code_lists.size > 0 %}
52
+ {{equalsigns}}= Code Lists
53
+
54
+ {% include "packages_data_dictionary_classes", classes: code_lists %}
55
+ {% endif %}
56
+
57
+ {% if package.data_types.size > 0 %}
58
+ {{equalsigns}}= Data Types
59
+
60
+ {% for data_type in package.data_types %}
61
+ {% capture generalizations %}{% for assoc in data_type.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
62
+ [[{{ data_type.name }}-section]]
63
+ [cols="1a"]
64
+ |===
65
+ |*{{ data_type.name }}*
66
+ |[cols="1,4",frame=none,grid=none]
67
+ !===
68
+ !{nbsp}{nbsp}{nbsp}{nbsp}Definition: ! {{ data_type.definition }}
69
+ !{nbsp}{nbsp}{nbsp}{nbsp}Subclass of: ! {{ generalizations }}
70
+ !{nbsp}{nbsp}{nbsp}{nbsp}Stereotype: ! «DataType»
71
+ !===
72
+ {% if data_type.associations.size > 0 %}
73
+ {% capture rendered_associations %}
74
+ {% for assoc in data_type.associations %}
75
+ {% if assoc.member_end_attribute_name.size > 0 %}
76
+ {% capture cardinality %}{% if assoc.member_end_cardinality.min == 'C' %}[0..{{ assoc.member_end_cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ assoc.member_end_cardinality.max }}]{% endif %}{% endcapture %}
77
+ !{set:cellbgcolor:#FFFFFF} {{ assoc.member_end_attribute_name }} !<<{{assoc.member_end}}-section,{{assoc.member_end}}>> {{ cardinality }} ! {{ assoc.definition }}
78
+ {% endif %}
79
+ {% endfor %}
80
+ {% endcapture %}
81
+ {% if rendered_associations.size > 0 %}
82
+ |[cols="15,20,60",frame=none,grid=none,options="header"]
83
+ !===
84
+ !{set:cellbgcolor:#DDDDDD} *Role name* !*Target class and multiplicity* !*Definition*
85
+ {{ rendered_associations }}
86
+ !===
87
+ {% endif %}
88
+ {% endif %}
89
+ {% if data_type.attributes.size > 0 %}
90
+ |[cols="15,20,60",frame=none,grid=none,options="header"]
91
+ !===
92
+ !{set:cellbgcolor:#DDDDDD} *Attribute* !*Value type and multiplicity* !*Definition*
93
+ {% for attr in data_type.attributes %}
94
+ {% capture cardinality %}{% if attr.cardinality.min == 'C' %}[0..{{ attr.cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ attr.cardinality.max }}]{% endif %}{% endcapture %}
95
+ !{set:cellbgcolor:#FFFFFF} {{ attr.name }} !<<{{ attr.type }}-section,{{ attr.name }}>> {{ cardinality }} !{{ attr.definition }}
96
+ {% endfor %}
97
+ !===
98
+ |{set:cellbgcolor:#FFFFFF} Note: Unless otherwise specified, all attributes and role names have the stereotype «Property».
99
+ {% endif %}
100
+ |===
101
+
102
+ {% endfor %}
103
+ {% endif %}
104
+
105
+ {% if package.enums.size > 0 %}
106
+ {{equalsigns}}= Enumerations
107
+
108
+ {% for enum in package.enums %}
109
+ {% capture generalizations %}{% for assoc in enum.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
110
+ [[{{ enum.name }}-section]]
111
+ [cols="1a"]
112
+ |===
113
+ |*{{ enum.name }}*
114
+ |[cols="1,4",frame=none,grid=none]
115
+ !===
116
+ !{nbsp}{nbsp}{nbsp}{nbsp}Definition: ! {{ enum.definition }}
117
+ !{nbsp}{nbsp}{nbsp}{nbsp}Stereotype: ! «Enumeration»
118
+ !===
119
+ {% if enum.values.size > 0 %}
120
+ |[cols="1,4",frame=none,grid=none,options="header"]
121
+ !===
122
+ ^!{set:cellbgcolor:#DDDDDD} *Literal value* !*Definition*
123
+
124
+ {% for val in enum.values %}
125
+ ^!{set:cellbgcolor:#FFFFFF} {{ val.name }} !{{ val.definition }}
126
+ {% endfor %}
127
+ !===
128
+ {% endif %}
129
+ |===
130
+
131
+ {% endfor %}
132
+ {% endif %}
133
+
134
+ {% if additional_context.include_block and additional_context.include_block.size > 0 %}
135
+ {% for block in additional_context.include_block %}
136
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
137
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
138
+ {% unless block_content contains "Liquid error" %}
139
+ {% if block.text %}
140
+ {{ block.text }}
141
+ {% endif %}
142
+ {{ block_content }}
143
+ {% endunless %}
144
+ {% endfor %}
145
+ {% endif %}
146
+
147
+ {% assign include_block_package_key = 'include_block;' | append: package.name %}
148
+ {% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
149
+ {% for block in additional_context[include_block_package_key] %}
150
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
151
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
152
+ {% unless block_content contains "Liquid error" %}
153
+ {% if block.text %}
154
+ {{ block.text }}
155
+ {% endif %}
156
+ {{ block_content }}
157
+ {% endunless %}
158
+ {% endfor %}
159
+ {% endif %}
160
+
161
+ {% assign after_package_key = 'after;' | append: package.name %}
162
+ {% if additional_context[after_package_key] %}
163
+ {{equalsigns}}= Additional Information
164
+ {% for after in additional_context[after_package_key] %}
165
+ {{ after.text }}
166
+ {% endfor %}
167
+ {% endif %}
168
+ {% if package.packages.size > 0 and render_nested_packages %}
169
+ {% assign nested_depth = depth | plus: 1 %}{% include "packages_data_dictionary", depth: nested_depth, context: package %}
170
+ {% endif %}
171
+ {% endfor %}
172
+
173
+ {% if additional_context.after and additional_context.after.size > 0 %}
174
+ {% for after in additional_context.after %}
175
+ {{ after.text }}
176
+ {% endfor %}
177
+ {% endif %}
@@ -0,0 +1,43 @@
1
+ {% for klass in classes %}
2
+ {% capture generalizations %}{% for assoc in klass.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
3
+ [[{{ klass.name }}-section]]
4
+ [cols="1a"]
5
+ |===
6
+ |*{{ klass.name }}*
7
+ |[cols="1,4",frame=none,grid=none]
8
+ !===
9
+ !{nbsp}{nbsp}{nbsp}{nbsp}Definition: ! {{ klass.definition }}
10
+ !{nbsp}{nbsp}{nbsp}{nbsp}Subclass of: ! {{ generalizations }}
11
+ !{nbsp}{nbsp}{nbsp}{nbsp}Stereotype: ! «{{ klass.stereotype }}»
12
+ !===
13
+ {% if klass.associations.size > 0 %}
14
+ {% capture rendered_associations %}
15
+ {% for assoc in klass.associations %}
16
+ {% if assoc.member_end_attribute_name.size > 0 %}
17
+ {% capture cardinality %}{% if assoc.member_end_cardinality.min == 'C' %}[0..{{ assoc.member_end_cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ assoc.member_end_cardinality.max }}]{% endif %}{% endcapture %}
18
+ !{set:cellbgcolor:#FFFFFF} {{ assoc.member_end_attribute_name }} !<<{{assoc.member_end}}-section,{{assoc.member_end}}>> {{ cardinality }} ! {{ assoc.definition }}
19
+ {% endif %}
20
+ {% endfor %}
21
+ {% endcapture %}
22
+ {% if rendered_associations.size > 0 %}
23
+ |[cols="15,20,60",frame=none,grid=none,options="header"]
24
+ !===
25
+ !{set:cellbgcolor:#DDDDDD} *Role name* !*Target class and multiplicity* !*Definition*
26
+ {{ rendered_associations }}
27
+ !===
28
+ {% endif %}
29
+ {% endif %}
30
+ {% if klass.attributes.size > 0 %}
31
+ |[cols="15,20,60",frame=none,grid=none,options="header"]
32
+ !===
33
+ !{set:cellbgcolor:#DDDDDD} *Attribute* !*Value type and multiplicity* !*Definition*
34
+ {% for attr in klass.attributes %}
35
+ {% capture cardinality %}{% if attr.cardinality.min == 'C' %}[0..{{ attr.cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ attr.cardinality.max }}]{% endif %}{% endcapture %}
36
+ !{set:cellbgcolor:#FFFFFF} {{ attr.name }} !<<{{ attr.type }}-section,{{ attr.name }}>> {{ cardinality }} !{{ attr.definition }}
37
+ {% endfor %}
38
+ !===
39
+ |{set:cellbgcolor:#FFFFFF} Note: Unless otherwise specified, all attributes and role names have the stereotype «Property».
40
+ {% endif %}
41
+ |===
42
+
43
+ {% endfor %}
@@ -0,0 +1,113 @@
1
+ {% for package in context.packages %}
2
+ {% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
3
+ {% if additional_context.before and additional_context.before.size > 0 %}
4
+ {% for before in additional_context.before %}
5
+ {{ before.text }}
6
+ {% endfor %}
7
+ {% endif %}
8
+ {% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }}
9
+ [[rc_{{ package_name }}-model_section]]
10
+ {{equalsigns}}= {{ package.name }}
11
+
12
+ {% assign before_package_key = 'before;' | append: package.name %}
13
+ {% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
14
+ {% for before in additional_context[before_package_key] %}
15
+ {{ before.text }}
16
+ {% endfor %}
17
+ {% endif %}
18
+ {% if additional_context.diagram_include_block %}
19
+ {% for diagram_include_block in additional_context.diagram_include_block %}
20
+ {% include "diagrams_block", package_name: package_name, image_base_path: diagram_include_block.base_path, text: diagram_include_block.text %}
21
+ {% endfor %}
22
+ {% endif %}
23
+
24
+ {% if additional_context.include_block and additional_context.include_block.size > 0 %}
25
+ {% for block in additional_context.include_block %}
26
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
27
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
28
+ {% unless block_content contains "Liquid error" %}
29
+ {% if block.text %}
30
+ {{ block.text }}
31
+ {% endif %}
32
+ {{ block_content }}
33
+ {% endunless %}
34
+ {% endfor %}
35
+ {% endif %}
36
+
37
+ {% assign include_block_package_key = 'include_block;' | append: package.name %}
38
+ {% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
39
+ {% for block in additional_context[include_block_package_key] %}
40
+ {% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
41
+ {% capture block_content %}{% include block_filename %}{% endcapture %}
42
+ {% unless block_content contains "Liquid error" %}
43
+ {% if block.text %}
44
+ {{ block.text }}
45
+ {% endif %}
46
+ {{ block_content }}
47
+ {% endunless %}
48
+ {% endfor %}
49
+ {% endif %}
50
+
51
+ {{equalsigns}}= Class Definitions
52
+ {% if package.classes.size > 0 %}
53
+ .Classes used in {{ package.name }}
54
+ [cols="2a,6a",options="header"]
55
+ |===
56
+ |Class |Description
57
+
58
+ {% for klass in package.classes %}
59
+ |<<{{ klass.name }}-section,{{ klass.name }}>>
60
+ «{{ klass.stereotype }}»
61
+ |{{ klass.definition }}
62
+
63
+ {% endfor %}
64
+ |===
65
+ {% endif %}
66
+
67
+ {% if package.data_types.size > 0 %}
68
+ .Data Types used in {{ package.name }}
69
+ [cols="2,6",options="header"]
70
+ |===
71
+ |Name |Description
72
+
73
+ {% for klass in package.data_types %}
74
+ |<<{{ klass.name }}-section,{{ klass.name }}>>
75
+ |{{ klass.definition }}
76
+
77
+ {% endfor %}
78
+
79
+ |===
80
+ {% endif %}
81
+
82
+ {% if package.enums.size > 0 %}
83
+ .Enumerated Classes used in {{ package.name }}
84
+ [cols="2a,6a",options="header"]
85
+ |===
86
+ |Name |Description
87
+
88
+ {% for klass in package.enums %}
89
+ |<<{{ klass.name }}-section,{{ klass.name }}>>
90
+ |{{ klass.definition }}
91
+
92
+ {% endfor %}
93
+
94
+ |===
95
+ {% endif %}
96
+
97
+ {% assign after_package_key = 'after;' | append: package.name %}
98
+ {% if additional_context[after_package_key] %}
99
+ {{equalsigns}}= Additional Information
100
+ {% for after in additional_context[after_package_key] %}
101
+ {{ after.text }}
102
+ {% endfor %}
103
+ {% endif %}
104
+ {% if package.packages.size > 0 and render_nested_packages %}
105
+ {% assign nested_depth = depth | plus: 1 %}{% include "packages_entity_list", depth: nested_depth, context: package %}
106
+ {% endif %}
107
+ {% endfor %}
108
+
109
+ {% if additional_context.after and additional_context.after.size > 0 %}
110
+ {% for after in additional_context.after %}
111
+ {{ after.text }}
112
+ {% endfor %}
113
+ {% endif %}
@@ -5,6 +5,7 @@ require "asciidoctor"
5
5
  require "asciidoctor/reader"
6
6
  require "lutaml"
7
7
  require "lutaml/uml"
8
+ require "lutaml/formatter"
8
9
  require "metanorma/plugin/lutaml/utils"
9
10
 
10
11
  module Metanorma
@@ -41,7 +42,7 @@ module Metanorma
41
42
 
42
43
  # if no :imagesdir: leave image file in lutaml
43
44
  def generate_file(parent, _reader, uml_document)
44
- formatter = ::Lutaml::Uml::Formatter::Graphviz.new
45
+ formatter = ::Lutaml::Formatter::Graphviz.new
45
46
  formatter.type = :png
46
47
 
47
48
  imagesdir = if parent.document.attr("imagesdir")
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metanorma
4
+ module Plugin
5
+ module Lutaml
6
+ class LutamlFigureInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
7
+ include LutamlDiagramBase
8
+
9
+ use_dsl
10
+ named :lutaml_figure
11
+
12
+ def process(parent, _target, attrs)
13
+ diagram_key = [attrs["package"], attrs["name"]].compact.join(":")
14
+ return if parent.document.attributes['lutaml_figure_id'].nil?
15
+ xmi_id = parent.document.attributes['lutaml_figure_id'][diagram_key]
16
+ return unless xmi_id
17
+
18
+ %Q(<xref target="figure-#{xmi_id}"></xref>)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -14,7 +14,7 @@ module Metanorma
14
14
  # @example [lutaml_uml_attributes_table,path/to/lutaml,EntityName]
15
15
  class LutamlUmlAttributesTablePreprocessor < Asciidoctor::Extensions::Preprocessor
16
16
  MARCO_REGEXP =
17
- /\[lutaml_uml_attributes_table,([^,]+),?(.+)?,([^,]+),?(.+)?\]/
17
+ /\[lutaml_uml_attributes_table,([^,]+),?([^,]+),?(.+?)?\]/
18
18
  # search document for block `datamodel_attributes_table`
19
19
  # read include derectives that goes after that in block and transform
20
20
  # into yaml2text blocks
@@ -36,15 +36,16 @@ module Metanorma
36
36
  input_lines.each_with_object([]) do |line, result|
37
37
  if match = line.match(MARCO_REGEXP)
38
38
  lutaml_path = match[1]
39
- entity_name = match[3]
40
- result.push(*parse_marco(lutaml_path, entity_name, document))
39
+ entity_name = match[2]
40
+ skip_headers = match[3]
41
+ result.push(*parse_marco(lutaml_path, entity_name, document, skip_headers))
41
42
  else
42
43
  result.push(line)
43
44
  end
44
45
  end
45
46
  end
46
47
 
47
- def parse_marco(lutaml_path, entity_name, document)
48
+ def parse_marco(lutaml_path, entity_name, document, skip_headers)
48
49
  lutaml_document = lutaml_document_from_file(document, lutaml_path)
49
50
  .serialized_document
50
51
  entities = [lutaml_document["classes"], lutaml_document["enums"]]
@@ -53,12 +54,12 @@ module Metanorma
53
54
  entity_definition = entities.detect do |klass|
54
55
  klass["name"] == entity_name.strip
55
56
  end
56
- model_representation(entity_definition, document)
57
+ model_representation(entity_definition, document, skip_headers)
57
58
  end
58
59
 
59
- def model_representation(entity_definition, document)
60
+ def model_representation(entity_definition, document, skip_headers)
60
61
  render_result, errors = Utils.render_liquid_string(
61
- template_string: table_template,
62
+ template_string: table_template(skip_headers),
62
63
  context_items: entity_definition,
63
64
  context_name: "definition",
64
65
  document: document
@@ -68,9 +69,9 @@ module Metanorma
68
69
  end
69
70
 
70
71
  # rubocop:disable Layout/IndentHeredoc
71
- def table_template
72
+ def table_template(skip_headers)
72
73
  <<~TEMPLATE
73
- === {{ definition.name }}
74
+ #{"=== {{ definition.name }}" unless skip_headers}
74
75
  {{ definition.definition }}
75
76
 
76
77
  {% if definition.attributes %}
@@ -16,11 +16,18 @@ module Metanorma
16
16
  Asciidoctor::Extensions::Preprocessor
17
17
  MARCO_REGEXP =
18
18
  /\[lutaml_uml_datamodel_description,([^,]+),?(.+)?\]/
19
- SUPPORTED_NESTED_MACROSES = %w[before after].freeze
20
19
  LIQUID_INCLUDE_PATH = File.join(
21
20
  Gem.loaded_specs["metanorma-plugin-lutaml"].full_gem_path,
22
21
  "lib", "metanorma", "plugin", "lutaml", "liquid_templates"
23
22
  )
23
+ DEFAULT_RENDER_INCLUDE = 'packages'.freeze
24
+ RENDER_STYLES_INCLUDES = {
25
+ 'default' => 'packages',
26
+ 'entity_list' => 'packages_entity_list',
27
+ 'data_dictionary' => 'packages_data_dictionary'
28
+ }.freeze
29
+ SUPPORTED_NESTED_MACRO = %w[
30
+ before diagram_include_block after include_block].freeze
24
31
  # search document for block `lutaml_uml_datamodel_description`
25
32
  # read include derectives that goes after that in block and transform
26
33
  # into yaml2text blocks
@@ -58,35 +65,63 @@ module Metanorma
58
65
  block_match = line.match(MARCO_REGEXP)
59
66
  return [line] if block_match.nil?
60
67
 
68
+ lutaml_document = lutaml_document_from_file(document, block_match[1])
69
+ fill_in_diagrams_attributes(document, lutaml_document)
61
70
  model_representation(
62
- lutaml_document_from_file(document, block_match[1]),
71
+ lutaml_document,
63
72
  document,
64
73
  collect_additional_context(input_lines, input_lines.next),
65
74
  parse_yaml_config_file(document, block_match[2]))
66
75
  end
67
76
 
77
+ def fill_in_diagrams_attributes(document, lutaml_document_wrapper)
78
+ lutaml_document = lutaml_document_wrapper.original_document
79
+ package_flat_diagrams = lambda do |pks|
80
+ pks.each_with_object({}) do |package, res|
81
+ package.diagrams.map { |diag| res["#{package.name}:#{diag.name}"] = diag.xmi_id }
82
+ end
83
+ end
84
+ children_pks_daigs = package_flat_diagrams.call(lutaml_document.packages.map(&:children_packages).flatten)
85
+ document.attributes['lutaml_figure_id'] = package_flat_diagrams.call(lutaml_document.packages)
86
+ .merge(children_pks_daigs)
87
+ end
88
+
68
89
  def collect_additional_context(input_lines, end_mark)
69
- additional_context = {}
90
+ additional_context = Hash.new { |hash, key| hash[key] = [] }
91
+ block_lines = []
70
92
  while (block_line = input_lines.next) != end_mark
71
- nested_match = SUPPORTED_NESTED_MACROSES
72
- .map { |macro| [macro, block_line.match(/\[.#{macro}(,\s*package=("|')(?<package>.+?)("|'))?\]/)] }
73
- .detect { |n| !n.last.nil? }
74
- nested_context_value = []
75
- if nested_match
76
- macro_keyword = [nested_match.first, nested_match.last['package']].compact.join(";")
77
- nested_end_mark = input_lines.next
78
- while (block_line = input_lines.next) != nested_end_mark
79
- nested_context_value.push(block_line)
80
- end
81
- additional_context[macro_keyword] = nested_context_value
82
- .join("\n")
83
- end
93
+ block_lines.push(block_line)
94
+ end
95
+ block_document = (Asciidoctor::Document.new(block_lines, {})).parse
96
+ block_document.blocks.each do |block|
97
+ next unless SUPPORTED_NESTED_MACRO.include?(block.attributes['role'])
98
+
99
+ attrs = block.attributes
100
+ name = attrs.delete('role')
101
+ package = attrs.delete('package')
102
+ macro_keyword = [name, package].compact.join(";")
103
+ block_text = block.lines.length > 0 ? block.lines[1..-2].join("\n") : ''
104
+ additional_context[macro_keyword].push({ 'text' => block_text }.merge(attrs))
84
105
  end
85
106
  additional_context
86
107
  end
87
108
 
109
+ def package_level(lutaml_document, level)
110
+ return lutaml_document if level <= 0
111
+
112
+ package_level(lutaml_document['packages'].first, level - 1)
113
+ end
114
+
88
115
  def create_context_object(lutaml_document, additional_context, options)
89
- root_package = lutaml_document.to_liquid['packages'].first
116
+ root_package = package_level(lutaml_document.to_liquid, options['package_root_level'] || 1)
117
+ if options.length.zero? || options['packages'].nil?
118
+ return {
119
+ 'render_nested_packages' => true,
120
+ "packages" => root_package['packages'],
121
+ "additional_context" => additional_context
122
+ }
123
+ end
124
+
90
125
  all_packages = [root_package, *root_package['children_packages']]
91
126
  {
92
127
  "packages" => sort_and_filter_out_packages(all_packages, options),
@@ -129,7 +164,7 @@ module Metanorma
129
164
 
130
165
  def model_representation(lutaml_document, document, additional_context, options)
131
166
  render_result, errors = Utils.render_liquid_string(
132
- template_string: table_template,
167
+ template_string: table_template(options['section_depth'] || 2, options['render_style']),
133
168
  context_items: create_context_object(lutaml_document,
134
169
  additional_context,
135
170
  options),
@@ -141,9 +176,10 @@ module Metanorma
141
176
  render_result.split("\n")
142
177
  end
143
178
 
144
- def table_template
179
+ def table_template(section_depth, render_style)
180
+ include_name = RENDER_STYLES_INCLUDES.fetch(render_style, DEFAULT_RENDER_INCLUDE)
145
181
  <<~LIQUID
146
- {% include "packages", depth: 2, context: context, additional_context: context.additional_context %}
182
+ {% include "#{include_name}", depth: #{section_depth}, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
147
183
  LIQUID
148
184
  end
149
185
  end
@@ -1,5 +1,6 @@
1
1
  require "expressir/express/cache"
2
2
  require "metanorma/plugin/lutaml/liquid/custom_filters"
3
+ require "metanorma/plugin/lutaml/liquid/multiply_local_file_system"
3
4
 
4
5
  ::Liquid::Template.register_filter(Metanorma::Plugin::Lutaml::Liquid::CustomFilters)
5
6
 
@@ -25,8 +26,8 @@ module Metanorma
25
26
  context_name:, document:, include_path: nil)
26
27
  liquid_template = ::Liquid::Template.parse(template_string)
27
28
  # Allow includes for the template
28
- include_path ||= Utils.relative_file_path(document, "")
29
- liquid_template.registers[:file_system] = ::Liquid::LocalFileSystem.new(include_path)
29
+ include_paths = [Utils.relative_file_path(document, ""), include_path].compact
30
+ liquid_template.registers[:file_system] = ::Metanorma::Plugin::Lutaml::Liquid::LocalFileSystem.new(include_paths, ["_%s.liquid", "_%s.adoc"])
30
31
  rendered_string = liquid_template
31
32
  .render(context_name => context_items,
32
33
  strict_variables: true,
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Lutaml
4
- VERSION = "0.4.3".freeze
4
+ VERSION = "0.4.7".freeze
5
5
  end
6
6
  end
7
7
  end
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.4.3
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-28 00:00:00.000000000 Z
11
+ date: 2021-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -257,13 +257,19 @@ files:
257
257
  - lib/metanorma-plugin-lutaml.rb
258
258
  - lib/metanorma/plugin/lutaml/express_remarks_decorator.rb
259
259
  - lib/metanorma/plugin/lutaml/liquid/custom_filters.rb
260
+ - lib/metanorma/plugin/lutaml/liquid/multiply_local_file_system.rb
261
+ - lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid
260
262
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid
261
263
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_class.liquid
264
+ - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary.liquid
265
+ - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary_classes.liquid
262
266
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_type.liquid
267
+ - lib/metanorma/plugin/lutaml/liquid_templates/_packages_entity_list.liquid
263
268
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_enum.liquid
264
269
  - lib/metanorma/plugin/lutaml/lutaml_diagram_base.rb
265
270
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
266
271
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
272
+ - lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
267
273
  - lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb
268
274
  - lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb
269
275
  - lib/metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor.rb