metanorma-plugin-lutaml 0.7.16 → 0.7.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +501 -274
- data/lib/metanorma/plugin/lutaml/liquid_templates/_klass_table.liquid +4 -4
- data/lib/metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro.rb +50 -8
- data/lib/metanorma/plugin/lutaml/lutaml_ea_xmi_base.rb +57 -5
- data/lib/metanorma/plugin/lutaml/utils.rb +6 -1
- data/lib/metanorma/plugin/lutaml/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f680f88df78449b51a5edc5344da198ca126fa9d2dd5400dfe309ed456cd32a
|
4
|
+
data.tar.gz: ea9831bdfae3d53412f5581ae82a8ee79f18d3a81ce78e40295d1eacb5394614
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3a5caabd987904ed65645ed49a343cac93aa2ce6d250dc521d1c51a5d5c52e43fcf9d381a6961976654dfaa892a266bf33d14ef6275e9b58d33c0387fdbbd41
|
7
|
+
data.tar.gz: 6bf56d6a0f8be8a79e9fdc643ceeec22acd3f3327550dfa7295a72dbfcac6647456d194fd43be0cb3bdd02c665dae6ea5d8400d8b309741e8d23889edc7a6175
|
data/README.adoc
CHANGED
@@ -4,13 +4,15 @@ image:https://github.com/metanorma/metanorma-plugin-lutaml/workflows/rake/badge.
|
|
4
4
|
|
5
5
|
== Purpose
|
6
6
|
|
7
|
-
LutaML is a data model accessor that supports various data model formats
|
8
|
-
|
7
|
+
LutaML is a data model accessor that supports various data model formats.
|
8
|
+
|
9
|
+
This plugin allows you to access the following types of information models from
|
10
|
+
within a Metanorma document:
|
9
11
|
|
10
12
|
* EXPRESS (`*.exp` files)
|
11
|
-
*
|
13
|
+
* LutaML-UML (`*.lutaml` files)
|
14
|
+
* Enterprise Architect exported UML in XMI format (`*.xmi` files)
|
12
15
|
|
13
|
-
This plugin allows you to access LutaML models from within a Metanorma document.
|
14
16
|
|
15
17
|
== Installation
|
16
18
|
|
@@ -24,11 +26,93 @@ $ gem install metanorma-plugin-lutaml
|
|
24
26
|
|
25
27
|
=== General
|
26
28
|
|
29
|
+
The LutaML plugin supports working with EXPRESS schema files to render EXPRESS
|
30
|
+
models and definitions.
|
31
|
+
|
27
32
|
LutaML supports accessing EXPRESS models via the
|
28
33
|
https://github.com/lutaml/expressir[Expressir] parser.
|
29
34
|
|
30
35
|
|
31
|
-
===
|
36
|
+
=== Document attribute `:lutaml-express-index:`
|
37
|
+
|
38
|
+
This attribute allows specifying one or more EXPRESS files to defined names
|
39
|
+
for later use with `lutaml_express` command.
|
40
|
+
|
41
|
+
Syntax:
|
42
|
+
|
43
|
+
[source,adoc]
|
44
|
+
----
|
45
|
+
:lutaml-express-index: shortname_of_index; name_of_schemas_listing_file.yml;
|
46
|
+
----
|
47
|
+
|
48
|
+
Where:
|
49
|
+
|
50
|
+
`shortname_of_index`:: is name of the parsed EXPRESS files context for the later
|
51
|
+
use.
|
52
|
+
|
53
|
+
`name_of_schemas_listing_file.yml`:: location of the YAML index file to parse
|
54
|
+
all EXPRESS files listed within.
|
55
|
+
|
56
|
+
|
57
|
+
[example]
|
58
|
+
.Define an index in the document and use it in the `lutaml_express` command
|
59
|
+
====
|
60
|
+
[source,adoc]
|
61
|
+
-----
|
62
|
+
:lutaml-express-index: my_custom_name; /path/to/schemas.yml
|
63
|
+
|
64
|
+
[lutaml_express,my_custom_name,context]
|
65
|
+
----
|
66
|
+
{% for schema in context.schemas %}
|
67
|
+
== {{schema.id}}
|
68
|
+
|
69
|
+
{% for entity in schema.entities %}
|
70
|
+
=== {{entity.id}}
|
71
|
+
{% endfor %}
|
72
|
+
|
73
|
+
{% endfor %}
|
74
|
+
-----
|
75
|
+
|
76
|
+
Where the `schemas.yml` file contains:
|
77
|
+
|
78
|
+
[source,yaml]
|
79
|
+
----
|
80
|
+
---
|
81
|
+
schemas:
|
82
|
+
action_schema:
|
83
|
+
path: "../../schemas/resources/action_schema/action_schema.exp"
|
84
|
+
application_context_schema:
|
85
|
+
path: "../../schemas/resources/application_context_schema/application_context_schema.exp"
|
86
|
+
----
|
87
|
+
====
|
88
|
+
|
89
|
+
|
90
|
+
=== Schemas listing file
|
91
|
+
|
92
|
+
The schemas listing file is a YAML file that lists all EXPRESS files to be
|
93
|
+
parsed. The file should have the following structure:
|
94
|
+
|
95
|
+
[source,yaml]
|
96
|
+
----
|
97
|
+
---
|
98
|
+
schemas:
|
99
|
+
schema_name:
|
100
|
+
path: path/to/schema_file.exp
|
101
|
+
schema_name_2:
|
102
|
+
path: path/to/schema_file_2.exp
|
103
|
+
----
|
104
|
+
|
105
|
+
Where:
|
106
|
+
|
107
|
+
`schema_name`:: is the name of the EXPRESS schema.
|
108
|
+
|
109
|
+
`path`:: (optional) path to the EXPRESS schema file. When the path is not
|
110
|
+
specified, the command will look for the schema file in the directory where the
|
111
|
+
YAML file is located using the filename pattern `{schema_name}.exp`. The path
|
112
|
+
can be relative to the YAML file or an absolute path.
|
113
|
+
|
114
|
+
|
115
|
+
=== Usage of the `lutaml_express` command
|
32
116
|
|
33
117
|
Given an `example.exp` EXPRESS file with content:
|
34
118
|
|
@@ -57,13 +141,12 @@ SCHEMA test_schema 'test';
|
|
57
141
|
END_SCHEMA;
|
58
142
|
----
|
59
143
|
|
60
|
-
And the `
|
144
|
+
And the `lutaml_express` block:
|
61
145
|
|
62
146
|
[source,adoc]
|
63
147
|
-----
|
64
|
-
[
|
148
|
+
[lutaml_express,example.exp,my_context]
|
65
149
|
----
|
66
|
-
|
67
150
|
{% for schema in my_context.schemas %}
|
68
151
|
== {{schema.id}}
|
69
152
|
|
@@ -75,6 +158,11 @@ And the `lutaml` block:
|
|
75
158
|
----
|
76
159
|
-----
|
77
160
|
|
161
|
+
NOTE: The `lutaml` command can auto-detect the EXPRESS schema file type by the
|
162
|
+
file extension. If the file extension is `.exp`, the command will use the
|
163
|
+
`Expressir` parser to parse the file. If the file extension is `.lutaml`, the
|
164
|
+
command will use the `Lutaml` parser to parse the file.
|
165
|
+
|
78
166
|
Where:
|
79
167
|
|
80
168
|
* content within the block is called the "`template`";
|
@@ -107,28 +195,27 @@ ____
|
|
107
195
|
=== my_type5
|
108
196
|
____
|
109
197
|
|
110
|
-
This command also supports `.lutaml` files.
|
111
198
|
|
112
|
-
Instead of using the direct path to the file one can use
|
199
|
+
Instead of using the direct path to the file one can use `:lutaml-express-index:`
|
113
200
|
document attribute to supply directory with express files or YAML index file to
|
114
201
|
parse as well as the cache file location.
|
115
202
|
|
116
|
-
|
203
|
+
Syntax:
|
117
204
|
|
118
205
|
[source,adoc]
|
119
|
-
|
206
|
+
----
|
120
207
|
:lutaml-express-index: my_custom_name; dir_or_index_path[; cache=cache_path]
|
121
|
-
|
208
|
+
----
|
122
209
|
|
123
210
|
Where:
|
124
211
|
|
125
|
-
|
126
|
-
use with lutaml
|
212
|
+
`my_custom_name`:: is name of the parsed EXPRESS files context for the later
|
213
|
+
use with lutaml command
|
127
214
|
|
128
|
-
|
215
|
+
`dir_or_index_path`:: location of directory with EXPRESS files or path to the
|
129
216
|
YAML index file to parse
|
130
217
|
|
131
|
-
|
218
|
+
`cache_path`:: (optional) location of the Expressir cache file to use
|
132
219
|
|
133
220
|
Example of usage:
|
134
221
|
|
@@ -146,22 +233,22 @@ Author
|
|
146
233
|
----
|
147
234
|
-----
|
148
235
|
|
149
|
-
===
|
236
|
+
=== Filtering EXPRESS schemas defined in an index for `lutaml_express`
|
150
237
|
|
151
238
|
This functionality allows `[lutaml_express]` blocks to load a full set of
|
152
239
|
EXPRESS schemas in one index, and then provide a select ("filter") option
|
153
240
|
per-block via a separate YAML file.
|
154
241
|
|
155
242
|
[source,adoc]
|
156
|
-
|
243
|
+
-----
|
157
244
|
:lutaml-express-index: all_schemas; ../schemas_all.yaml;
|
158
245
|
|
159
246
|
[lutaml_express,all_schemas,context,leveloffset=+1,config_yaml=schemas.yaml]
|
160
|
-
|
247
|
+
----
|
161
248
|
{% assign selected = context.schemas | where: "selected" %}
|
162
249
|
{% render "templates/resources/schema" for selected as schema %}
|
163
|
-
---
|
164
250
|
----
|
251
|
+
-----
|
165
252
|
|
166
253
|
Where `schemas_all.yml` provides all schemas:
|
167
254
|
|
@@ -195,18 +282,25 @@ The resulting block adds the `select` attribute to every schema of the the
|
|
195
282
|
via Liquid:
|
196
283
|
|
197
284
|
[source,liquid]
|
198
|
-
|
285
|
+
-----
|
199
286
|
[lutaml_express,schemas_1,repo,leveloffset=+1,config_yaml=select.yaml]
|
200
|
-
|
287
|
+
----
|
201
288
|
{% assign selected = repo.schemas | where: "selected" %}
|
202
289
|
... do things with `selected` ...
|
203
|
-
|
290
|
+
---
|
291
|
+
-----
|
204
292
|
|
205
293
|
NOTE: This functionality is used in the ISO 10303 SRL to load the full schema
|
206
294
|
set at once but only render the selected schemas in individual documents.
|
207
295
|
|
208
296
|
|
209
|
-
== Usage with UML
|
297
|
+
== Usage with Lutaml-UML
|
298
|
+
|
299
|
+
=== General
|
300
|
+
|
301
|
+
The LutaML plugin supports working with LutaML UML files to render UML diagrams
|
302
|
+
and class definitions.
|
303
|
+
|
210
304
|
|
211
305
|
=== Rendering a LutaML view: `lutaml_diagram`
|
212
306
|
|
@@ -239,9 +333,9 @@ diagram MyView {
|
|
239
333
|
The `lutaml_diagram` command will add the image to the document.
|
240
334
|
|
241
335
|
[source,adoc]
|
242
|
-
|
336
|
+
----
|
243
337
|
lutaml_diagram::example.lutaml[]
|
244
|
-
|
338
|
+
----
|
245
339
|
|
246
340
|
The `lutaml_diagram` command can also be used to denote a block with an embedded
|
247
341
|
LutaML view.
|
@@ -273,172 +367,7 @@ diagram MyView {
|
|
273
367
|
....
|
274
368
|
----
|
275
369
|
|
276
|
-
===
|
277
|
-
|
278
|
-
This command allows to quickly render a LutaML diagram as an image file by
|
279
|
-
specifying the name of diagram.
|
280
|
-
|
281
|
-
[source,adoc]
|
282
|
-
-----
|
283
|
-
lutaml_ea_diagram::[name="name_of_diagram",base_path="/path/to/xmi-images",format="png"]
|
284
|
-
-----
|
285
|
-
|
286
|
-
The code will search the diagram with name `name_of_diagram` and then
|
287
|
-
render it as:
|
288
|
-
|
289
|
-
[source,adoc]
|
290
|
-
-----
|
291
|
-
[[figure-{{ diagram.xmi_id }}]]
|
292
|
-
.{{ diagram.name }}
|
293
|
-
image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
|
294
|
-
-----
|
295
|
-
|
296
|
-
=== Rendering a LutaML GML Dictionary: `lutaml_gml_dictionary`
|
297
|
-
|
298
|
-
This command allows to render a LutaML GML Dictionary by using Liquid Drop.
|
299
|
-
|
300
|
-
GmlDictionaryDrop has the following attributes:
|
301
|
-
|
302
|
-
* name
|
303
|
-
* file_name
|
304
|
-
* dictionary_entry
|
305
|
-
|
306
|
-
Each `dictionary_entry` has the following attributes:
|
307
|
-
|
308
|
-
* name
|
309
|
-
* description
|
310
|
-
|
311
|
-
[source,adoc]
|
312
|
-
-----
|
313
|
-
lutaml_gml_dictionary::/path/to/dictionary.xml[template="/path/to/template.liquid",context=dict]
|
314
|
-
-----
|
315
|
-
|
316
|
-
The command accepts the options listed below:
|
317
|
-
|
318
|
-
* `/path/to/dictionary.xml` specifies the path of xml file of the
|
319
|
-
GML Dictionary.
|
320
|
-
|
321
|
-
* `template="/path/to/template.liquid"` specifies the liquid template.
|
322
|
-
For example, you can create a liquid template and link it by `template`.
|
323
|
-
|
324
|
-
* `context=dict` define the context in the template.
|
325
|
-
|
326
|
-
[source,adoc]
|
327
|
-
-----
|
328
|
-
[cols="3a,22a"]
|
329
|
-
|===
|
330
|
-
| Name | {{ dict.file_name }}
|
331
|
-
|
332
|
-
h| Code h| Description
|
333
|
-
{% for entry in dict.dictionary_entry %}
|
334
|
-
| {{ entry.name }} | {{ entry.description }}
|
335
|
-
{% endfor %}
|
336
|
-
|===
|
337
|
-
|
338
|
-
[.source]
|
339
|
-
<<source_link>>
|
340
|
-
-----
|
341
|
-
|
342
|
-
In spite of specifying the path of the template, you can also define an inline
|
343
|
-
template within a block by
|
344
|
-
`[lutaml_gml_dictionary,"/path/to/dictionary.xml",context=dict]`.
|
345
|
-
|
346
|
-
[source,adoc]
|
347
|
-
-----
|
348
|
-
[lutaml_gml_dictionary,"/path/to/dictionary.xml",context=dict]
|
349
|
-
--
|
350
|
-
{% capture link %}https://www.test.com/{{ dict.file_name }}{% endcapture %}
|
351
|
-
|
352
|
-
[cols="3a,22a"]
|
353
|
-
|===
|
354
|
-
| File Name | {{ dict.file_name }}
|
355
|
-
h| URL | {{ link }}
|
356
|
-
h| Help | Description
|
357
|
-
{% for entry in dict.dictionary_entry %}
|
358
|
-
| {{ entry.name }} | {{ entry.description }}
|
359
|
-
{% endfor %}
|
360
|
-
|===
|
361
|
-
|
362
|
-
[.source]
|
363
|
-
<<source_link>>
|
364
|
-
--
|
365
|
-
-----
|
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",template="/path/to/templates/_my_klass_table.liquid"]
|
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` option only, `name` option with `package` option or `path` option.
|
390
|
-
One of 3 forms of options can be used to specify the name of the class.
|
391
|
-
|
392
|
-
** `name="NameOfClass"` specifies the name of the `class`.
|
393
|
-
(e.g. `name="Building"`)
|
394
|
-
If there are multiple classes with the same name, other form of options
|
395
|
-
are recommended to specify the class.
|
396
|
-
|
397
|
-
** `package="NameOfPackage"name="NameOfClass"` specifies the name of the
|
398
|
-
`class` (specified by `name` option) inside the `package`
|
399
|
-
(specified by `package` option).
|
400
|
-
The `package` option must be used with the `name` option.
|
401
|
-
(e.g. `package="uro",name="_BoundarySurface"`)
|
402
|
-
|
403
|
-
** `path="PathOfClass"` specifies the `absolute` path of the `class`
|
404
|
-
which is started with `::`
|
405
|
-
(e.g. `path="::EA_Model::Conceptual Models::i-UR::Urban Planning ADE 3.
|
406
|
-
1::uro::_BoundarySurface"`)
|
407
|
-
or `relative` path of the `class` which is not started with `::`
|
408
|
-
(e.g. `path="uro::_BoundarySurface"`).
|
409
|
-
The last part of the path separated by `::` is the name of the `class`.
|
410
|
-
The other parts of the path are the names of the `packages`.
|
411
|
-
|
412
|
-
* `template="/path/to/templates/_my_klass_table.liquid"` specifies the path of
|
413
|
-
the liquid template. (Optional)
|
414
|
-
By default, it will look for the template `_klass_table.liquid` defined in
|
415
|
-
`lib/metanorma/plugin/lutaml/templates`. This template can be customized by
|
416
|
-
changing the template path in the `template` option.
|
417
|
-
|
418
|
-
* `guidance="/path/to/my_guidance.yml"` specifies the path of
|
419
|
-
the yaml file of the guidance. (Optional)
|
420
|
-
|
421
|
-
The guidance file should be in the following format:
|
422
|
-
|
423
|
-
[source,yaml]
|
424
|
-
----
|
425
|
-
---
|
426
|
-
classes:
|
427
|
-
- name: Name Of Class
|
428
|
-
attributes:
|
429
|
-
- name: Name Of Attribute (e.g. gml:boundedBy)
|
430
|
-
used: false
|
431
|
-
guidance: |
|
432
|
-
Drop guidance message here.
|
433
|
-
...
|
434
|
-
----
|
435
|
-
|
436
|
-
If you want to define the guidance, you can define the `name` of the class
|
437
|
-
under `classes`. Then define which `attributes` you want to add guidance by the
|
438
|
-
`name`. Set `used` to show the attribute is used or not. Drop the message of
|
439
|
-
guidance in `guidance`.
|
440
|
-
|
441
|
-
=== Generating UML class and attributes: `lutaml_uml_class`
|
370
|
+
=== Generating a UML class and attributes clause: `lutaml_uml_class`
|
442
371
|
|
443
372
|
This command allows rendering a definition clause for a UML class.
|
444
373
|
|
@@ -503,17 +432,17 @@ ____
|
|
503
432
|
|
504
433
|
The command accepts two options:
|
505
434
|
|
506
|
-
|
435
|
+
`skip_headers=true`:: (or just `skip_headers`) The initial heading (the UML class name)
|
507
436
|
will not be generated. This is useful if additional content is to be supplied
|
508
437
|
to the clause, such as diagrams that are defined outside the UML model.
|
509
438
|
|
510
|
-
|
439
|
+
`depth={n}`:: (default: `2`) This determines the depth of the generated headings.
|
511
440
|
A depth of `2` means the initial heading will have 2 equal signs, and so forth.
|
512
441
|
The heading depth of the attributes are in relation to the initial depth, so
|
513
442
|
a depth of `2` will have the "Attributes" section at depth `3`.
|
514
443
|
|
515
444
|
|
516
|
-
=== `lutaml_uml_attributes_table`
|
445
|
+
=== Generating a UML attributes table: `lutaml_uml_attributes_table`
|
517
446
|
|
518
447
|
This command allows rendering definition tables for a UML model.
|
519
448
|
|
@@ -541,12 +470,12 @@ diagram MyView {
|
|
541
470
|
}
|
542
471
|
----
|
543
472
|
|
544
|
-
And the `lutaml_uml_attributes_table`
|
473
|
+
And the `lutaml_uml_attributes_table` command:
|
545
474
|
|
546
475
|
[source,adoc]
|
547
|
-
|
476
|
+
----
|
548
477
|
[lutaml_uml_attributes_table, example.lutaml, AttributeProfile]
|
549
|
-
|
478
|
+
----
|
550
479
|
|
551
480
|
Will produce this output:
|
552
481
|
|
@@ -568,9 +497,9 @@ ____
|
|
568
497
|
In case of "enumeration" (AddressClassProfile) entity:
|
569
498
|
|
570
499
|
[source,adoc]
|
571
|
-
|
500
|
+
----
|
572
501
|
[lutaml_uml_attributes_table, example.lutaml, AddressClassProfile]
|
573
|
-
|
502
|
+
----
|
574
503
|
|
575
504
|
Will produce this output:
|
576
505
|
|
@@ -586,20 +515,305 @@ ____
|
|
586
515
|
|===
|
587
516
|
____
|
588
517
|
|
589
|
-
=== Usage of `lutaml_uml_datamodel_description` macro
|
590
518
|
|
591
|
-
|
592
|
-
objects for supplied XMI file.
|
519
|
+
== Usage with Enterprise Architect (UML in XMI)
|
593
520
|
|
594
|
-
|
521
|
+
=== General
|
595
522
|
|
596
|
-
|
597
|
-
|
523
|
+
The LutaML plugin supports working with Enterprise Architect exported XMI files
|
524
|
+
to render UML diagrams and class definitions.
|
598
525
|
|
599
|
-
The `
|
526
|
+
The commands are prefixed as `lutaml_ea_*` to denote their specific use with
|
527
|
+
Enterprise Architect XMI files.
|
528
|
+
|
529
|
+
|
530
|
+
=== Document attribute `:lutaml-xmi-index:`
|
531
|
+
|
532
|
+
This attribute allows specifying one or more XMI files to defined names
|
533
|
+
for later use with `lutaml_ea_*` commands.
|
534
|
+
|
535
|
+
Syntax:
|
600
536
|
|
601
537
|
[source,adoc]
|
602
|
-
|
538
|
+
----
|
539
|
+
:lutaml-xmi-index: index_name; index_path[; config=config_path]
|
540
|
+
----
|
541
|
+
|
542
|
+
where:
|
543
|
+
|
544
|
+
`index_name`:: name of index
|
545
|
+
`index_path`:: path to XMI file for the later use with `lutaml_ea_*` command
|
546
|
+
`config_path`:: optional, location of YAML configuration file that specifies
|
547
|
+
what packages to include in the render, what render style is desired and
|
548
|
+
location of the root package.
|
549
|
+
|
550
|
+
|
551
|
+
[example]
|
552
|
+
.Define two indexes in the document and use them in the `lutaml_ea_xmi` command
|
553
|
+
====
|
554
|
+
[source,adoc]
|
555
|
+
----
|
556
|
+
:lutaml-xmi-index: first-xmi-index; /path/to/first.xmi
|
557
|
+
:lutaml-xmi-index: second-xmi-index; /path/to/second.xmi; config=/path/to/config.yml
|
558
|
+
|
559
|
+
[lutaml_ea_xmi,index=first-xmi-index]
|
560
|
+
--
|
561
|
+
...
|
562
|
+
--
|
563
|
+
|
564
|
+
lutaml_ea_diagram::[name="NameOfDiagramInSecondXmiIndex",base_path="./xmi-images",format="png",index="second-xmi-index"]
|
565
|
+
...
|
566
|
+
----
|
567
|
+
|
568
|
+
The command `lutaml_ea_xmi` will load the XMI file from the path
|
569
|
+
`/path/to/first.xmi` which is specified by the `index`: `first-xmi-index`.
|
570
|
+
|
571
|
+
The command `lutaml_ea_diagram` will load the XMI file from the path
|
572
|
+
`/path/to/second.xmi` which is specified by the `index`: `second-xmi-index`.
|
573
|
+
====
|
574
|
+
|
575
|
+
|
576
|
+
=== Rendering a Enterprise Architect diagram from XMI: `lutaml_ea_diagram`
|
577
|
+
|
578
|
+
This command allows to quickly render a LutaML diagram as an image file by
|
579
|
+
specifying the name of diagram.
|
580
|
+
|
581
|
+
Syntax:
|
582
|
+
|
583
|
+
[source,adoc]
|
584
|
+
----
|
585
|
+
lutaml_ea_diagram::[{options}]
|
586
|
+
----
|
587
|
+
|
588
|
+
where `{options}` is a hash of options, where:
|
589
|
+
|
590
|
+
`name`:: (mandatory) name of the diagram to render.
|
591
|
+
`base_path`:: (mandatory) base path where the diagram images are located.
|
592
|
+
`format`:: (optional) format of the image file. Defaults to `png`.
|
593
|
+
`index`:: (optional) index name of the XMI file. If the index is not provided,
|
594
|
+
the command will look for the diagram in the first XMI file specified through
|
595
|
+
the `lutaml_ea_xmi` command.
|
596
|
+
`package`:: (optional) name of the package which contains the diagram. If the
|
597
|
+
package is not provided, the command will look for the diagram across all
|
598
|
+
packages in the XMI file.
|
599
|
+
|
600
|
+
The diagram with name `name_of_diagram` will be converted into the following
|
601
|
+
Metanorma block:
|
602
|
+
|
603
|
+
[source,adoc]
|
604
|
+
----
|
605
|
+
[[figure-{{ diagram.xmi_id }}]]
|
606
|
+
.{{ diagram.name }}
|
607
|
+
image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
|
608
|
+
----
|
609
|
+
|
610
|
+
[example]
|
611
|
+
.Specifying a diagram within an XMI file
|
612
|
+
====
|
613
|
+
[source,adoc]
|
614
|
+
----
|
615
|
+
lutaml_ea_diagram::[name="name_of_diagram",base_path="/path/to/xmi-images",format="png"]
|
616
|
+
----
|
617
|
+
|
618
|
+
Renders the diagram with name `name_of_diagram` from the XMI file in PNG format,
|
619
|
+
where the EA images exported with the XMI file are at `/path/to/xmi-images`.
|
620
|
+
====
|
621
|
+
|
622
|
+
[example]
|
623
|
+
.Specifying a diagram within a specific package (if there are multiple diagrams with the same name)
|
624
|
+
====
|
625
|
+
[source,adoc]
|
626
|
+
----
|
627
|
+
lutaml_ea_diagram::[name="DiagramName",package="PackageA",base_path="/path/to/xmi-images"]
|
628
|
+
----
|
629
|
+
|
630
|
+
The search wil be restricted to the diagrams named `DiagramName` in the
|
631
|
+
`PackageA` package.
|
632
|
+
====
|
633
|
+
|
634
|
+
[example]
|
635
|
+
.Specifying a diagram using a specific index
|
636
|
+
====
|
637
|
+
[source,adoc]
|
638
|
+
----
|
639
|
+
:lutaml-xmi-index: index_name; /path/to/xmi-file.xmi
|
640
|
+
|
641
|
+
...
|
642
|
+
|
643
|
+
lutaml_ea_diagram::[name="name_of_diagram",base_path="/path/to/xmi-images",format="png",index="index_name"]
|
644
|
+
----
|
645
|
+
|
646
|
+
Renders the diagram with name `name_of_diagram` from the XMI file in PNG format,
|
647
|
+
where the EA images exported with the XMI file are at `/path/to/xmi-images` and
|
648
|
+
the XMI file defined in the index `index_name`.
|
649
|
+
====
|
650
|
+
|
651
|
+
|
652
|
+
|
653
|
+
=== Generating a class definition table for a class: `lutaml_klass_table`
|
654
|
+
|
655
|
+
This command allows to render a LutaML table of a class by using Liquid Drop.
|
656
|
+
|
657
|
+
The table will show:
|
658
|
+
|
659
|
+
* Class Name
|
660
|
+
* Class Definition
|
661
|
+
* Inherited Properties
|
662
|
+
* Self-defined Properties
|
663
|
+
* Properties Inherited from Association
|
664
|
+
* Properties Defined in Association
|
665
|
+
|
666
|
+
[source,adoc]
|
667
|
+
----
|
668
|
+
lutaml_klass_table::/path/to/example.xmi[name="NameOfClass",template="/path/to/templates/_my_klass_table.liquid"]
|
669
|
+
----
|
670
|
+
|
671
|
+
The command accepts the options listed below:
|
672
|
+
|
673
|
+
* `/path/to/example.xmi` specifies the path of xmi file.
|
674
|
+
|
675
|
+
* `name` option only, `name` option with `package` option or `path` option.
|
676
|
+
One of 3 forms of options can be used to specify the name of the class.
|
677
|
+
|
678
|
+
** `name="NameOfClass"` specifies the name of the `class`.
|
679
|
+
(e.g. `name="Building"`)
|
680
|
+
If there are multiple classes with the same name, other form of options
|
681
|
+
are recommended to specify the class.
|
682
|
+
|
683
|
+
** `package="NameOfPackage"name="NameOfClass"` specifies the name of the
|
684
|
+
`class` (specified by `name` option) inside the `package`
|
685
|
+
(specified by `package` option).
|
686
|
+
The `package` option must be used with the `name` option.
|
687
|
+
(e.g. `package="uro",name="_BoundarySurface"`)
|
688
|
+
|
689
|
+
** `path="PathOfClass"` specifies the `absolute` path of the `class`
|
690
|
+
which is started with `::`
|
691
|
+
(e.g. `path="::EA_Model::Conceptual Models::i-UR::Urban Planning ADE 3.
|
692
|
+
1::uro::_BoundarySurface"`)
|
693
|
+
or `relative` path of the `class` which is not started with `::`
|
694
|
+
(e.g. `path="uro::_BoundarySurface"`).
|
695
|
+
The last part of the path separated by `::` is the name of the `class`.
|
696
|
+
The other parts of the path are the names of the `packages`.
|
697
|
+
|
698
|
+
* `template="/path/to/templates/_my_klass_table.liquid"` specifies the path of
|
699
|
+
the liquid template. (Optional)
|
700
|
+
By default, it will look for the template `_klass_table.liquid` defined in
|
701
|
+
`lib/metanorma/plugin/lutaml/templates`. This template can be customized by
|
702
|
+
changing the template path in the `template` option.
|
703
|
+
|
704
|
+
* `guidance="/path/to/my_guidance.yml"` specifies the path of
|
705
|
+
the yaml file of the guidance. (Optional)
|
706
|
+
|
707
|
+
The guidance file should be in the following format:
|
708
|
+
|
709
|
+
[source,yaml]
|
710
|
+
----
|
711
|
+
---
|
712
|
+
classes:
|
713
|
+
- name: Name Of Class
|
714
|
+
attributes:
|
715
|
+
- name: Name Of Attribute (e.g. gml:boundedBy)
|
716
|
+
used: false
|
717
|
+
guidance: |
|
718
|
+
Drop guidance message here.
|
719
|
+
...
|
720
|
+
----
|
721
|
+
|
722
|
+
If you want to define the guidance, you can define the `name` of the class
|
723
|
+
under `classes`. Then define which `attributes` you want to add guidance by the
|
724
|
+
`name`. Set `used` to show the attribute is used or not. Drop the message of
|
725
|
+
guidance in `guidance`.
|
726
|
+
|
727
|
+
|
728
|
+
|
729
|
+
|
730
|
+
=== Usage of `lutaml_ea_xmi` command
|
731
|
+
|
732
|
+
The `lutaml_ea_xmi` command supersedes the `lutaml_uml_datamodel_description`
|
733
|
+
command which it is functionally equivalent to.
|
734
|
+
|
735
|
+
This command renders data model packages and its dependent objects for supplied
|
736
|
+
XMI file, by using Liquid Drop objects.
|
737
|
+
|
738
|
+
NOTE: The performance of `lutaml_ea_xmi` exceeds
|
739
|
+
`lutaml_uml_datamodel_description` by 10~20 times (Tested with a 10.6MB XMI file
|
740
|
+
with 120,000+ lines).
|
741
|
+
|
742
|
+
NOTE: To migrate to this command from `lutaml_uml_datamodel_description`, just
|
743
|
+
replace the command `lutaml_uml_datamodel_description` by `lutaml_ea_xmi`.
|
744
|
+
|
745
|
+
Replace:
|
746
|
+
|
747
|
+
[source,adoc]
|
748
|
+
----
|
749
|
+
[lutaml_uml_datamodel_description, path/to/example.xmi]
|
750
|
+
...
|
751
|
+
----
|
752
|
+
|
753
|
+
By:
|
754
|
+
|
755
|
+
[source,adoc]
|
756
|
+
----
|
757
|
+
[lutaml_ea_xmi, path/to/example.xmi]
|
758
|
+
...
|
759
|
+
----
|
760
|
+
|
761
|
+
You can define guidance in the configuration file as well. The configuration
|
762
|
+
file will looks like:
|
763
|
+
|
764
|
+
[source,yaml]
|
765
|
+
----
|
766
|
+
packages:
|
767
|
+
- my_package
|
768
|
+
guidance: "path/to/guidance.yaml"
|
769
|
+
----
|
770
|
+
|
771
|
+
The guidance file should be in the following format:
|
772
|
+
|
773
|
+
[source,yaml]
|
774
|
+
----
|
775
|
+
---
|
776
|
+
classes:
|
777
|
+
- name: "NameOfClass"
|
778
|
+
attributes:
|
779
|
+
- name: Name Of Attribute (e.g. gml:boundedBy)
|
780
|
+
used: false
|
781
|
+
guidance: |
|
782
|
+
Drop guidance message here.
|
783
|
+
...
|
784
|
+
----
|
785
|
+
|
786
|
+
If you want to define the guidance, you can define the `name` of the class
|
787
|
+
under `classes`. Then define which `attributes` you want to add guidance by the
|
788
|
+
`name`. Set `used` to show the attribute is used or not. Drop the message of
|
789
|
+
guidance in `guidance`.
|
790
|
+
|
791
|
+
The `name` of class can be defined in the following ways:
|
792
|
+
|
793
|
+
* `name: "NameOfClass"` specifies the name of the `class`.
|
794
|
+
(e.g. `name: "Building"`)
|
795
|
+
If there are multiple classes with the same name, it is recommended to
|
796
|
+
specify the class by absolute path.
|
797
|
+
|
798
|
+
* `name: "::NameOfPackage::NameOfClass"` specifies the name of the `class` in
|
799
|
+
`absolute` path.
|
800
|
+
(e.g. `name: "::EA_Model::Conceptual Models::CityGML2.0::bldg::Building"`)
|
801
|
+
|
802
|
+
|
803
|
+
=== Usage of `lutaml_uml_datamodel_description` command
|
804
|
+
|
805
|
+
This command allows to quickly render data model packages and its dependent
|
806
|
+
objects for supplied XMI file.
|
807
|
+
|
808
|
+
Given an Enterprise Architect `example.xmi` file with 2 packages:
|
809
|
+
|
810
|
+
* 'Another'
|
811
|
+
* 'CityGML'
|
812
|
+
|
813
|
+
The `lutaml_uml_datamodel_description` command can be used:
|
814
|
+
|
815
|
+
[source,adoc]
|
816
|
+
----
|
603
817
|
[lutaml_uml_datamodel_description, path/to/example.xmi]
|
604
818
|
--
|
605
819
|
[.before]
|
@@ -643,15 +857,15 @@ footer text
|
|
643
857
|
....
|
644
858
|
--
|
645
859
|
--
|
646
|
-
|
860
|
+
----
|
647
861
|
|
648
862
|
Where:
|
649
863
|
|
650
864
|
* `path/to/example.xmi` - required, path to the XMI file to render
|
651
865
|
|
652
|
-
* `[.before]` - block text that adds additional text before the rendered output, can be used only once, additional occurrences of
|
866
|
+
* `[.before]` - block text that adds additional text before the rendered output, can be used only once, additional occurrences of command will overwrite text, not that `literal` block style must be used in there(eg `....`)
|
653
867
|
|
654
|
-
* `[.after]` - block text that adds additional text after the rendered output, can be used only once, additional occurrences of
|
868
|
+
* `[.after]` - block text that adds additional text after the rendered output, can be used only once, additional occurrences of command will overwrite text
|
655
869
|
|
656
870
|
* `[.after, package="Another"]` - block text to be inserted before(after in case of `.before` name) the package
|
657
871
|
|
@@ -663,7 +877,7 @@ Where:
|
|
663
877
|
+
|
664
878
|
The logic is as follows:
|
665
879
|
[source,adoc]
|
666
|
-
|
880
|
+
----
|
667
881
|
{% for diagram in package.diagrams %}
|
668
882
|
[[figure-{{ diagram.xmi_id }}]]
|
669
883
|
.{{ diagram.name }}
|
@@ -673,18 +887,21 @@ image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[
|
|
673
887
|
{{ diagram.definition | html2adoc }}
|
674
888
|
{% endif %}
|
675
889
|
{% endfor %}
|
676
|
-
|
890
|
+
----
|
677
891
|
|
678
|
-
For instance, the script will take package diagrams supplied in the 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
|
892
|
+
For instance, the script will take package diagrams supplied in the 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 command text, it will be added as paragraph before each image include.
|
679
893
|
|
680
894
|
* `[.diagram_include_block, package="Another"]` - same as above, but diagram will be included only for supplied package name
|
681
895
|
|
682
|
-
* `[.include_block, base_path="spec/fixtures"]` -
|
896
|
+
* `[.include_block, base_path="spec/fixtures"]` - command to include files (`*.adoc` or `*.liquid`) for each package name. Attribute `base_path` is a required attribute to supply path prefix where to look for file to include. command 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`, command will look for the following file path: `my/path/_my_package_name.adoc`.
|
683
897
|
|
684
898
|
* `[.include_block, package="Another", base_path="spec/fixtures"]` - same as above, but include block will be included only for supplied package name
|
685
899
|
|
686
900
|
|
687
|
-
NOTE: .after, .before, package_text and include_block
|
901
|
+
NOTE: .after, .before, package_text and include_block commandses all can be used with additional option - `liquid`, if this option is supplied then the code inside block will be interpolated in liquid context
|
902
|
+
|
903
|
+
|
904
|
+
=== Referencing objects generated by LutaML
|
688
905
|
|
689
906
|
|
690
907
|
There are two other commands that are used to refer to LutaML generated document elements:
|
@@ -695,10 +912,11 @@ There are two other commands that are used to refer to LutaML generated document
|
|
695
912
|
* `lutaml_table`. Provides a reference anchor to the definition tables of a
|
696
913
|
particular package, class, enumeration or data type object in the XMI.
|
697
914
|
|
915
|
+
|
698
916
|
The syntax is as follows:
|
699
917
|
|
700
918
|
[source,adoc]
|
701
|
-
|
919
|
+
----
|
702
920
|
// For lutaml_figure
|
703
921
|
This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
|
704
922
|
|
@@ -707,14 +925,14 @@ This is lutaml_table::[package="Wrapper root package"] package
|
|
707
925
|
This is lutaml_table::[package="Wrapper root package", class="my name"] class
|
708
926
|
This is lutaml_table::[package="Wrapper root package", enum="my name"] enumeration
|
709
927
|
This is lutaml_table::[package="Wrapper root package", data_type="my name"] data type
|
710
|
-
|
928
|
+
----
|
711
929
|
|
712
|
-
This code will be transformed into `<<figure-{diagram.xmi_id}>>` and will point to diagram figure. One can only use this
|
930
|
+
This code will be transformed into `<<figure-{diagram.xmi_id}>>` and will point to diagram figure. One can only use this command when document rendered `lutaml_uml_datamodel_description` command as it needs diagram lookup table in order to reference package diagram.
|
713
931
|
|
714
932
|
Will produce this output:
|
715
933
|
|
716
934
|
[source,adoc]
|
717
|
-
|
935
|
+
----
|
718
936
|
my text
|
719
937
|
== CityGML package
|
720
938
|
=== CityGML overview
|
@@ -785,9 +1003,9 @@ h|Constraints: 7+| (none)
|
|
785
1003
|
=== Additional Information
|
786
1004
|
|
787
1005
|
text after CityGML package
|
788
|
-
|
1006
|
+
----
|
789
1007
|
|
790
|
-
In addition to the XMI file, this
|
1008
|
+
In addition to the XMI file, this command also supports a YAML configuration file
|
791
1009
|
that specifies:
|
792
1010
|
|
793
1011
|
* What packages to include in the render;
|
@@ -853,7 +1071,7 @@ equal to 2, root package will be `one-1`.
|
|
853
1071
|
]
|
854
1072
|
----
|
855
1073
|
|
856
|
-
Usage with
|
1074
|
+
Usage with command:
|
857
1075
|
|
858
1076
|
[source,adoc]
|
859
1077
|
--
|
@@ -870,73 +1088,82 @@ and iterate through packages according to the order supplied in the file. All
|
|
870
1088
|
packages that matches `skip` in the YAML config file will be skipped during
|
871
1089
|
render.
|
872
1090
|
|
873
|
-
=== Usage of `lutaml_ea_xmi` macro
|
874
1091
|
|
875
|
-
This command is a replacement for `lutaml_uml_datamodel_description` to perform
|
876
|
-
the same functionalities of `lutaml_uml_datamodel_description`, which is to
|
877
|
-
render data model packages and its dependent objects for supplied XMI file, by
|
878
|
-
using Liquid Drop. The performance of `lutaml_ea_xmi` can be improved by
|
879
|
-
10~20 times. (Tested with a 10.6MB XMI file with 120000+ lines)
|
880
1092
|
|
881
|
-
To use this macro, you only need to replace `lutaml_uml_datamodel_description`
|
882
|
-
by `lutaml_ea_xmi`.
|
883
1093
|
|
884
|
-
|
1094
|
+
== Usage with GML
|
885
1095
|
|
886
|
-
|
887
|
-
-----
|
888
|
-
[lutaml_uml_datamodel_description, path/to/example.xmi]
|
889
|
-
...
|
890
|
-
-----
|
1096
|
+
=== Rendering a LutaML GML Dictionary: `lutaml_gml_dictionary`
|
891
1097
|
|
892
|
-
|
1098
|
+
This command allows to render a LutaML GML Dictionary by using Liquid Drop.
|
1099
|
+
|
1100
|
+
GmlDictionaryDrop has the following attributes:
|
1101
|
+
|
1102
|
+
* name
|
1103
|
+
* file_name
|
1104
|
+
* dictionary_entry
|
1105
|
+
|
1106
|
+
Each `dictionary_entry` has the following attributes:
|
1107
|
+
|
1108
|
+
* name
|
1109
|
+
* description
|
893
1110
|
|
894
1111
|
[source,adoc]
|
895
|
-
|
896
|
-
[
|
897
|
-
|
898
|
-
-----
|
1112
|
+
----
|
1113
|
+
lutaml_gml_dictionary::/path/to/dictionary.xml[template="/path/to/template.liquid",context=dict]
|
1114
|
+
----
|
899
1115
|
|
900
|
-
|
901
|
-
file will looks like:
|
1116
|
+
The command accepts the options listed below:
|
902
1117
|
|
903
|
-
|
904
|
-
|
905
|
-
packages:
|
906
|
-
- my_package
|
907
|
-
guidance: "path/to/guidance.yaml"
|
908
|
-
-----
|
1118
|
+
* `/path/to/dictionary.xml` specifies the path of xml file of the
|
1119
|
+
GML Dictionary.
|
909
1120
|
|
910
|
-
|
1121
|
+
* `template="/path/to/template.liquid"` specifies the liquid template.
|
1122
|
+
For example, you can create a liquid template and link it by `template`.
|
911
1123
|
|
912
|
-
|
1124
|
+
* `context=dict` define the context in the template.
|
1125
|
+
|
1126
|
+
[source,adoc]
|
913
1127
|
----
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
1128
|
+
[cols="3a,22a"]
|
1129
|
+
|===
|
1130
|
+
| Name | {{ dict.file_name }}
|
1131
|
+
|
1132
|
+
h| Code h| Description
|
1133
|
+
{% for entry in dict.dictionary_entry %}
|
1134
|
+
| {{ entry.name }} | {{ entry.description }}
|
1135
|
+
{% endfor %}
|
1136
|
+
|===
|
1137
|
+
|
1138
|
+
[.source]
|
1139
|
+
<<source_link>>
|
923
1140
|
----
|
924
1141
|
|
925
|
-
|
926
|
-
|
927
|
-
`
|
928
|
-
guidance in `guidance`.
|
1142
|
+
In spite of specifying the path of the template, you can also define an inline
|
1143
|
+
template within a block by
|
1144
|
+
`[lutaml_gml_dictionary,"/path/to/dictionary.xml",context=dict]`.
|
929
1145
|
|
930
|
-
|
1146
|
+
[source,adoc]
|
1147
|
+
----
|
1148
|
+
[lutaml_gml_dictionary,"/path/to/dictionary.xml",context=dict]
|
1149
|
+
--
|
1150
|
+
{% capture link %}https://www.test.com/{{ dict.file_name }}{% endcapture %}
|
931
1151
|
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
1152
|
+
[cols="3a,22a"]
|
1153
|
+
|===
|
1154
|
+
| File Name | {{ dict.file_name }}
|
1155
|
+
h| URL | {{ link }}
|
1156
|
+
h| Help | Description
|
1157
|
+
{% for entry in dict.dictionary_entry %}
|
1158
|
+
| {{ entry.name }} | {{ entry.description }}
|
1159
|
+
{% endfor %}
|
1160
|
+
|===
|
1161
|
+
|
1162
|
+
[.source]
|
1163
|
+
<<source_link>>
|
1164
|
+
--
|
1165
|
+
----
|
936
1166
|
|
937
|
-
* `name: "::NameOfPackage::NameOfClass"` specifies the name of the `class` in
|
938
|
-
`absolute` path.
|
939
|
-
(e.g. `name: "::EA_Model::Conceptual Models::CityGML2.0::bldg::Building"`)
|
940
1167
|
|
941
1168
|
== Documentation
|
942
1169
|
|
@@ -28,7 +28,7 @@ h| Property Name h| Property Type and Multiplicity h| Definition
|
|
28
28
|
({{ attr.gen_name }})
|
29
29
|
{%- endcapture -%}
|
30
30
|
| {{ name_col | newline_to_br }}
|
31
|
-
| {{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
31
|
+
| {{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
32
32
|
| {{ attr.definition }}
|
33
33
|
{%- endif -%}
|
34
34
|
{% endfor %}
|
@@ -42,7 +42,7 @@ h| Property Name h| Property Type and Multiplicity h| Definition
|
|
42
42
|
({{ attr.gen_name }})
|
43
43
|
{%- endcapture -%}
|
44
44
|
| {{ name_col | newline_to_br }}
|
45
|
-
| {{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
45
|
+
| {{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
46
46
|
| {{ attr.definition }}
|
47
47
|
{%- endif -%}
|
48
48
|
{% endfor %}
|
@@ -56,7 +56,7 @@ h| Property Name h| Property Type and Multiplicity h| Definition
|
|
56
56
|
({{ attr.gen_name }})
|
57
57
|
{%- endcapture -%}
|
58
58
|
| {{ name_col | newline_to_br }}
|
59
|
-
| {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
59
|
+
| {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
60
60
|
| {{ attr.definition }}
|
61
61
|
{%- endif -%}
|
62
62
|
{% endfor %}
|
@@ -70,7 +70,7 @@ h| Property Name h| Property Type and Multiplicity h| Definition
|
|
70
70
|
({{ attr.gen_name }})
|
71
71
|
{%- endcapture -%}
|
72
72
|
| {{ name_col | newline_to_br }}
|
73
|
-
| {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
73
|
+
| {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality.min }}..{{ attr.cardinality.max }}]
|
74
74
|
| {{ attr.definition }}
|
75
75
|
{%- endif -%}
|
76
76
|
{% endfor %}
|
@@ -7,13 +7,14 @@ module Metanorma
|
|
7
7
|
module Lutaml
|
8
8
|
class LutamlEaDiagramBlockMacro < ::Asciidoctor::Extensions::BlockMacroProcessor
|
9
9
|
include LutamlDiagramBase
|
10
|
+
include LutamlEaXmiBase
|
10
11
|
|
11
12
|
use_dsl
|
12
13
|
named :lutaml_ea_diagram
|
13
14
|
|
14
15
|
def process(parent, _target, attrs)
|
15
|
-
orig_doc = get_original_document(parent)
|
16
|
-
diagram = fetch_diagram_by_name(orig_doc, attrs
|
16
|
+
orig_doc = get_original_document(parent, attrs["index"])
|
17
|
+
diagram = fetch_diagram_by_name(orig_doc, attrs)
|
17
18
|
return if diagram.nil?
|
18
19
|
|
19
20
|
through_attrs = generate_attrs(attrs)
|
@@ -26,13 +27,43 @@ module Metanorma
|
|
26
27
|
|
27
28
|
private
|
28
29
|
|
29
|
-
def
|
30
|
-
|
30
|
+
def parse_result_document(full_path, guidance = nil)
|
31
|
+
::Lutaml::XMI::Parsers::XML.serialize_xmi_to_liquid(
|
32
|
+
File.new(full_path, encoding: "UTF-8"),
|
33
|
+
guidance,
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_original_document(parent, index = nil)
|
38
|
+
path = get_path_from_index(parent, index) if index
|
39
|
+
|
40
|
+
if index && path
|
41
|
+
doc = lutaml_document_from_file_or_cache(parent.document, path, {})
|
42
|
+
end
|
43
|
+
|
44
|
+
doc ||= parent.document.attributes["lutaml_xmi_cache"].values.first
|
31
45
|
return doc if doc.instance_of?(::Lutaml::XMI::RootDrop)
|
32
46
|
|
33
47
|
doc.original_document
|
34
48
|
end
|
35
49
|
|
50
|
+
def get_path_from_index(parent, index_name) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
51
|
+
lutaml_xmi_index = parent.document
|
52
|
+
.attributes["lutaml_xmi_index"][index_name]
|
53
|
+
|
54
|
+
if lutaml_xmi_index.nil? || lutaml_xmi_index[:path].nil?
|
55
|
+
::Metanorma::Util.log(
|
56
|
+
"[metanorma-plugin-lutaml] lutaml_xmi_index error: " \
|
57
|
+
"XMI index #{index_name} path not found!",
|
58
|
+
:error,
|
59
|
+
)
|
60
|
+
|
61
|
+
return nil
|
62
|
+
end
|
63
|
+
|
64
|
+
lutaml_xmi_index[:path]
|
65
|
+
end
|
66
|
+
|
36
67
|
def img_src_path(document, attrs, diagram)
|
37
68
|
base_path = attrs["base_path"]
|
38
69
|
format = attrs["format"] || "png"
|
@@ -41,19 +72,30 @@ module Metanorma
|
|
41
72
|
"#{img_path}/#{diagram.xmi_id}.#{format}"
|
42
73
|
end
|
43
74
|
|
44
|
-
def fetch_diagram_by_name(orig_doc,
|
75
|
+
def fetch_diagram_by_name(orig_doc, attrs)
|
76
|
+
name = attrs["name"]
|
77
|
+
package_name = attrs["package"]
|
45
78
|
found_diagrams = []
|
46
|
-
|
79
|
+
|
80
|
+
loop_sub_packages(
|
81
|
+
orig_doc.packages.first, name, found_diagrams, package_name
|
82
|
+
)
|
83
|
+
|
47
84
|
found_diagrams.first
|
48
85
|
end
|
49
86
|
|
50
|
-
def loop_sub_packages(package, name, found_diagrams)
|
87
|
+
def loop_sub_packages(package, name, found_diagrams, package_name) # rubocop:disable Metrics/CyclomaticComplexity
|
51
88
|
found_diagram = package.diagrams.find { |diag| diag.name == name }
|
52
89
|
|
90
|
+
if found_diagram && package_name &&
|
91
|
+
found_diagram.package_name != package_name
|
92
|
+
found_diagram = nil
|
93
|
+
end
|
94
|
+
|
53
95
|
found_diagrams << found_diagram if found_diagram
|
54
96
|
|
55
97
|
package.packages.each do |sub_package|
|
56
|
-
loop_sub_packages(sub_package, name, found_diagrams)
|
98
|
+
loop_sub_packages(sub_package, name, found_diagrams, package_name)
|
57
99
|
end
|
58
100
|
end
|
59
101
|
end
|
@@ -27,6 +27,7 @@ module Metanorma
|
|
27
27
|
SUPPORTED_NESTED_MACRO = %w[
|
28
28
|
before diagram_include_block after include_block package_text
|
29
29
|
].freeze
|
30
|
+
XMI_INDEX_REGEXP = /^:lutaml-xmi-index:(?<index_name>.+?);(?<index_path>.+?);?(\s*config=(?<config_path>.+))?$/.freeze # rubocop:disable Lint/MixedRegexpCaptureTypes,Layout/LineLength
|
30
31
|
|
31
32
|
# search document for block `lutaml_ea_xmi`
|
32
33
|
# or `lutaml_uml_datamodel_description`
|
@@ -92,16 +93,38 @@ module Metanorma
|
|
92
93
|
self.class.const_get(:MACRO_REGEXP)
|
93
94
|
end
|
94
95
|
|
95
|
-
def
|
96
|
+
def process_xmi_index_lines(document, line)
|
97
|
+
block_match = line.match(XMI_INDEX_REGEXP)
|
98
|
+
|
99
|
+
return if block_match.nil?
|
100
|
+
|
101
|
+
name = block_match[:index_name]&.strip
|
102
|
+
path = block_match[:index_path]&.strip
|
103
|
+
config = block_match[:config_path]&.strip
|
104
|
+
|
105
|
+
document.attributes["lutaml_xmi_index"] ||= {}
|
106
|
+
document.attributes["lutaml_xmi_index"][name] = {
|
107
|
+
path: path,
|
108
|
+
config: config,
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
def process_text_blocks(document, input_lines) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
|
96
113
|
line = input_lines.next
|
114
|
+
process_xmi_index_lines(document, line)
|
97
115
|
block_match = line.match(get_macro_regexp)
|
98
116
|
|
99
117
|
return [line] if block_match.nil?
|
100
118
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
119
|
+
config_yaml_path = block_match[2]&.strip
|
120
|
+
xmi_or_index = block_match[1]&.strip
|
121
|
+
|
122
|
+
lutaml_document, yaml_config = load_lutaml_doc_and_config(
|
123
|
+
document,
|
124
|
+
xmi_or_index,
|
125
|
+
config_yaml_path,
|
126
|
+
)
|
127
|
+
|
105
128
|
fill_in_diagrams_attributes(document, lutaml_document)
|
106
129
|
model_representation(
|
107
130
|
lutaml_document, document,
|
@@ -110,6 +133,35 @@ module Metanorma
|
|
110
133
|
)
|
111
134
|
end
|
112
135
|
|
136
|
+
def load_lutaml_doc_and_config(document, xmi_or_index, config_yaml_path)
|
137
|
+
index = xmi_or_index.match(/index=(.*)/)
|
138
|
+
|
139
|
+
if index
|
140
|
+
# load lutaml index
|
141
|
+
index_name = index[1]
|
142
|
+
|
143
|
+
if document.attributes["lutaml_xmi_index"][index_name].nil? ||
|
144
|
+
document.attributes["lutaml_xmi_index"][index_name][:path].nil?
|
145
|
+
::Metanorma::Util.log(
|
146
|
+
"[metanorma-plugin-lutaml] lutaml_xmi_index error: " \
|
147
|
+
"XMI index #{index_name} path not found!",
|
148
|
+
:error,
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
152
|
+
xmi_or_index = document
|
153
|
+
.attributes["lutaml_xmi_index"][index_name][:path]
|
154
|
+
config_yaml_path = document
|
155
|
+
.attributes["lutaml_xmi_index"][index_name][:config]
|
156
|
+
end
|
157
|
+
|
158
|
+
yaml_config = parse_yaml_config_file(document, config_yaml_path)
|
159
|
+
lutaml_document = lutaml_document_from_file_or_cache(document,
|
160
|
+
xmi_or_index,
|
161
|
+
yaml_config)
|
162
|
+
[lutaml_document, yaml_config]
|
163
|
+
end
|
164
|
+
|
113
165
|
def get_original_document(wrapper)
|
114
166
|
doc = wrapper
|
115
167
|
return doc if doc.instance_of?(::Lutaml::XMI::RootDrop)
|
@@ -4,7 +4,12 @@ require "expressir/express/cache"
|
|
4
4
|
require "metanorma/plugin/lutaml/liquid/custom_filters"
|
5
5
|
require "metanorma/plugin/lutaml/liquid/multiply_local_file_system"
|
6
6
|
|
7
|
-
|
7
|
+
liquid_klass = if Object.const_defined?("Liquid::Environment")
|
8
|
+
Object.const_get("Liquid::Environment").default
|
9
|
+
else
|
10
|
+
Object.const_get("Liquid::Template")
|
11
|
+
end
|
12
|
+
liquid_klass.register_filter(Metanorma::Plugin::Lutaml::Liquid::CustomFilters)
|
8
13
|
|
9
14
|
module Metanorma
|
10
15
|
module Plugin
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-plugin-lutaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -354,7 +354,7 @@ homepage: https://github.com/metanorma/metanorma-plugin-lutaml
|
|
354
354
|
licenses:
|
355
355
|
- BSD-2-Clause
|
356
356
|
metadata: {}
|
357
|
-
post_install_message:
|
357
|
+
post_install_message:
|
358
358
|
rdoc_options: []
|
359
359
|
require_paths:
|
360
360
|
- lib
|
@@ -370,7 +370,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
370
370
|
version: '0'
|
371
371
|
requirements: []
|
372
372
|
rubygems_version: 3.3.27
|
373
|
-
signing_key:
|
373
|
+
signing_key:
|
374
374
|
specification_version: 4
|
375
375
|
summary: Metanorma plugin for LutaML
|
376
376
|
test_files: []
|