metanorma-plugin-lutaml 0.4.5 → 0.4.6

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: 0a510a5a23684dee91557fb6047267ca6ac87be25cbe11e0bcad8e4c0d0812b9
4
- data.tar.gz: 5d6e5cfc99c66b42ed50b7f6c6b1346fd2887ee9bba4436cacd5fbc56121dde6
3
+ metadata.gz: 636e4bec2488f6e9044ab15915f37485cf08ddcec31e2e852c9d381188b2d99e
4
+ data.tar.gz: c9c0e74be3a5d5856336f5202c7cb18e442d18548e1a29f476b72694d767eac5
5
5
  SHA512:
6
- metadata.gz: ea2e863ee349fb9bc5e60c43802569b0592b3437f2aad58f5bdb5591ecd430388566aff7ad8ff6d6c187e64868df9f1f303917afa94e73396e5c6d6564d0571a
7
- data.tar.gz: dc8d9a72fbea070f7aec02fa576c59859ce34abf6375e307ef18685cdbd70130edcc3958839e7b82e9e7155befc8b51657c685d5f42cef96e900de0fd4a50532
6
+ metadata.gz: 0e15f9f636f56f0f110baaec844dde2691aefbc882d3be878abe4ccd57e917472847ceb7dcca32f41c1d713d202f4e5caed0530171aad7d368fdde16431fdaee
7
+ data.tar.gz: 623fb7a37ad8be5e2aac50bbb32be6f366c75abeb47226800af1ae3ec88e24e6c024b7f57016862791f3fa89f4e8181a5c55710f71ab557d25f13480e88e53d9
data/README.adoc CHANGED
@@ -286,44 +286,44 @@ The `lutaml_uml_datamodel_description` macro can be used:
286
286
  [lutaml_uml_datamodel_description, path/to/example.xmi]
287
287
  --
288
288
  [.before]
289
- ...
289
+ ....
290
290
  my text
291
- ...
291
+ ....
292
292
 
293
293
  [.diagram_include_block, base_path="requirements/"]
294
- ...
294
+ ....
295
295
  Diagram text
296
- ...
296
+ ....
297
297
 
298
298
  [.include_block, package="Another", base_path="spec/fixtures"]
299
- ...
299
+ ....
300
300
  my text
301
- ...
301
+ ....
302
302
 
303
303
  [.include_block, base_path="spec/fixtures"]
304
- ...
304
+ ....
305
305
  my text
306
- ...
306
+ ....
307
307
 
308
308
  [.before, package="Another"]
309
- ...
309
+ ....
310
310
  text before Another package
311
- ...
311
+ ....
312
312
 
313
313
  [.after, package="Another"]
314
- ...
314
+ ....
315
315
  text after Another package
316
- ...
316
+ ....
317
317
 
318
318
  [.after, package="CityGML"]
319
- ...
319
+ ....
320
320
  text after CityGML package
321
- ...
321
+ ....
322
322
 
323
323
  [.after]
324
- ...
324
+ ....
325
325
  footer text
326
- ...
326
+ ....
327
327
  --
328
328
  --
329
329
  -----
@@ -332,7 +332,7 @@ Where:
332
332
 
333
333
  * `path/to/example.xmi` - required, path to the XMI file to render
334
334
 
335
- * `[.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 `....`)
336
336
 
337
337
  * `[.after]` - macro to add additional text after the rendered output, can be used only once, additional occurrences of macro will overwrite text
338
338
 
@@ -359,6 +359,14 @@ Eg: script will take package diagrams supplied in xmi file and will try to inclu
359
359
 
360
360
  * `[.include_block, package="Another", base_path="spec/fixtures"]` - same as above, but include block will be included only for supplied package name
361
361
 
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:
363
+
364
+ [source,adoc]
365
+ -----
366
+ This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
367
+ -----
368
+
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.
362
370
 
363
371
  Will produce this output:
364
372
 
@@ -453,18 +461,21 @@ packages:
453
461
  - three
454
462
  # skips these packages
455
463
  - skip: four
464
+ render_style: entity_list|data_dictionary|default
465
+ section_depth: 2
456
466
  -----
457
467
 
458
468
  Where:
459
469
 
460
470
  * `packages` - required, root element with the list of strings or objects
461
-
462
471
  * `Package *` - pattern matching, specifies lookup condition for packages to
463
472
  render.
464
473
  +
465
474
  NOTE: In this example, it is equal to the following regular expression: `/^Package.*$/`
466
475
 
467
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`
468
479
 
469
480
  Usage with macro:
470
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
@@ -1,11 +1,9 @@
1
1
  {% for package in context.packages %}
2
2
  {% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
3
- {% if additional_context.before %}
4
- {{ additional_context.before.text }}
5
- {% endif %}
6
- {% assign before_package_key = 'before;' | append: package.name %}
7
- {% if additional_context[before_package_key] %}
8
- {{ additional_context[before_package_key].text }}
3
+ {% if additional_context.before and additional_context.before.size > 0 %}
4
+ {% for before in additional_context.before %}
5
+ {{ before.text }}
6
+ {% endfor %}
9
7
  {% endif %}
10
8
  {% assign is_package_spare = package.name | slice: 0,5 %}
11
9
  {% if is_package_spare == 'old: ' %}{% continue %}
@@ -15,8 +13,16 @@
15
13
  {% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }} package
16
14
  {{equalsigns}}= {{ package.name }} overview
17
15
 
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 %}
18
22
  {% if additional_context.diagram_include_block %}
19
- {% include "diagrams_block", package_name: package_name, image_base_path: additional_context.diagram_include_block.base_path, text: additional_context.diagram_include_block.text %}
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 %}
25
+ {% endfor %}
20
26
  {% endif %}
21
27
 
22
28
  {% if package.packages.size > 0 %}The {{ package.name }} package is organized into
@@ -81,9 +87,9 @@
81
87
 
82
88
  {% endif %}
83
89
 
84
- {% if additional_context.include_block %}
85
- {% assign block = additional_context.include_block %}
86
- {% capture block_filename %}{{ block.base_path }}/{{ package_name }}{% endcapture %}
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 %}
87
93
  {% capture block_content %}{% include block_filename %}{% endcapture %}
88
94
  {% unless block_content contains "Liquid error" %}
89
95
  {% if block.text %}
@@ -91,12 +97,13 @@
91
97
  {% endif %}
92
98
  {{ block_content }}
93
99
  {% endunless %}
100
+ {% endfor %}
94
101
  {% endif %}
95
102
 
96
103
  {% assign include_block_package_key = 'include_block;' | append: package.name %}
97
- {% assign block = additional_context[include_block_package_key] %}
98
- {% if block %}
99
- {% capture block_filename %}{{ block.base_path }}/{{ package_name }}{% endcapture %}
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 %}
100
107
  {% capture block_content %}{% include block_filename %}{% endcapture %}
101
108
  {% unless block_content contains "Liquid error" %}
102
109
  {% if block.text %}
@@ -104,16 +111,23 @@
104
111
  {% endif %}
105
112
  {{ block_content }}
106
113
  {% endunless %}
114
+ {% endfor %}
107
115
  {% endif %}
108
116
 
109
117
  {% assign after_package_key = 'after;' | append: package.name %}
110
- {{equalsigns}}= Additional Information
111
118
  {% if additional_context[after_package_key] %}
112
- {{ additional_context[after_package_key].text }}
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 %}
113
126
  {% endif %}
114
- {% if package.packages.size > 0 and render_nested_packages %}{% assign nested_depth = depth | plus: 1 %}{% include "packages", depth: nested_depth, context: package %}{% endif %}
115
127
  {% endfor %}
116
128
 
117
- {% if additional_context.after %}
118
- {{ additional_context.after.text }}
129
+ {% if additional_context.after and additional_context.after.size > 0 %}
130
+ {% for after in additional_context.after %}
131
+ {{ after.text }}
132
+ {% endfor %}
119
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 %}
@@ -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
@@ -20,6 +20,14 @@ module Metanorma
20
20
  Gem.loaded_specs["metanorma-plugin-lutaml"].full_gem_path,
21
21
  "lib", "metanorma", "plugin", "lutaml", "liquid_templates"
22
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
23
31
  # search document for block `lutaml_uml_datamodel_description`
24
32
  # read include derectives that goes after that in block and transform
25
33
  # into yaml2text blocks
@@ -57,40 +65,63 @@ module Metanorma
57
65
  block_match = line.match(MARCO_REGEXP)
58
66
  return [line] if block_match.nil?
59
67
 
68
+ lutaml_document = lutaml_document_from_file(document, block_match[1])
69
+ fill_in_diagrams_attributes(document, lutaml_document)
60
70
  model_representation(
61
- lutaml_document_from_file(document, block_match[1]),
71
+ lutaml_document,
62
72
  document,
63
73
  collect_additional_context(input_lines, input_lines.next),
64
74
  parse_yaml_config_file(document, block_match[2]))
65
75
  end
66
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
+
67
89
  def collect_additional_context(input_lines, end_mark)
68
- additional_context = {}
90
+ additional_context = Hash.new { |hash, key| hash[key] = [] }
69
91
  block_lines = []
70
92
  while (block_line = input_lines.next) != end_mark
71
93
  block_lines.push(block_line)
72
94
  end
73
95
  block_document = (Asciidoctor::Document.new(block_lines, {})).parse
74
96
  block_document.blocks.each do |block|
97
+ next unless SUPPORTED_NESTED_MACRO.include?(block.attributes['role'])
98
+
75
99
  attrs = block.attributes
76
100
  name = attrs.delete('role')
77
101
  package = attrs.delete('package')
78
102
  macro_keyword = [name, package].compact.join(";")
79
- additional_context[macro_keyword] = { 'text' => block.lines[1..-2].join("\n") }.merge(attrs)
103
+ block_text = block.lines.length > 0 ? block.lines[1..-2].join("\n") : ''
104
+ additional_context[macro_keyword].push({ 'text' => block_text }.merge(attrs))
80
105
  end
81
106
  additional_context
82
107
  end
83
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
+
84
115
  def create_context_object(lutaml_document, additional_context, options)
85
- if options.length.zero?
116
+ root_package = package_level(lutaml_document.to_liquid, options['package_root_level'] || 1)
117
+ if options.length.zero? || options['packages'].nil?
86
118
  return {
87
119
  'render_nested_packages' => true,
88
- "packages" => lutaml_document.to_liquid['packages'].first['packages'].first['packages'],
120
+ "packages" => root_package['packages'],
89
121
  "additional_context" => additional_context
90
122
  }
91
123
  end
92
124
 
93
- root_package = lutaml_document.to_liquid['packages'].first
94
125
  all_packages = [root_package, *root_package['children_packages']]
95
126
  {
96
127
  "packages" => sort_and_filter_out_packages(all_packages, options),
@@ -133,7 +164,7 @@ module Metanorma
133
164
 
134
165
  def model_representation(lutaml_document, document, additional_context, options)
135
166
  render_result, errors = Utils.render_liquid_string(
136
- template_string: table_template,
167
+ template_string: table_template(options['section_depth'] || 2, options['render_style']),
137
168
  context_items: create_context_object(lutaml_document,
138
169
  additional_context,
139
170
  options),
@@ -145,9 +176,10 @@ module Metanorma
145
176
  render_result.split("\n")
146
177
  end
147
178
 
148
- def table_template
179
+ def table_template(section_depth, render_style)
180
+ include_name = RENDER_STYLES_INCLUDES.fetch(render_style, DEFAULT_RENDER_INCLUDE)
149
181
  <<~LIQUID
150
- {% include "packages", depth: 2, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
182
+ {% include "#{include_name}", depth: #{section_depth}, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
151
183
  LIQUID
152
184
  end
153
185
  end
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Lutaml
4
- VERSION = "0.4.5".freeze
4
+ VERSION = "0.4.6".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.5
4
+ version: 0.4.6
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-08-05 00:00:00.000000000 Z
11
+ date: 2021-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -261,11 +261,15 @@ files:
261
261
  - lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid
262
262
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid
263
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
264
266
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_type.liquid
267
+ - lib/metanorma/plugin/lutaml/liquid_templates/_packages_entity_list.liquid
265
268
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_enum.liquid
266
269
  - lib/metanorma/plugin/lutaml/lutaml_diagram_base.rb
267
270
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
268
271
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
272
+ - lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
269
273
  - lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb
270
274
  - lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb
271
275
  - lib/metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor.rb