LutaML is a data model accessor that supports various data model formats, including:
-
EXPRESS (
*.exp
files) -
OMG UML in XMI format (
*.xmi
files)
This plugin allows you to access LutaML models from within a Metanorma document.
LutaML supports accessing EXPRESS models via the Expressir parser.
Given an example.exp
EXPRESS file with the content:
SCHEMA test_schema 'test';
(* Need select elements for measure_value *)
REFERENCE FROM measure_schema
(measure_value);
TYPE my_type1 = EXTENSIBLE SELECT;
END_TYPE;
TYPE my_type2 = EXTENSIBLE ENUMERATION;
END_TYPE;
TYPE my_type3 = EXTENSIBLE ENUMERATION;
END_TYPE;
TYPE my_type4 = EXTENSIBLE ENUMERATION;
END_TYPE;
TYPE my_type5 = EXTENSIBLE ENUMERATION;
END_TYPE;
END_SCHEMA;
And the lutaml
macro block:
[lutaml,example.exp,my_context]
----
{% for schema in my_context.schemas %}
== {{schema.id}}
{% for entity in schema.entities %}
=== {{entity.id}}
{% endfor %}
{% endfor %}
----
Where:
-
content within the block is called the “template”;
-
{example.exp}
is the location of the EXPRESS schema file (*.exp
) that contains data to be loaded. Location of the file is computed relative to the source directory that[lutaml]
is used (e.g., if[lutaml,example.exp,my_context]
is invoked in an.adoc
file located at/foo/bar/doc.adoc
, the data file is expected to be found at/foo/bar/example.exp
); -
{my_context}
is the name where the EXPRESS Repository read from the.exp
file can be accessed with.
Will produce this output:
== test_schema
=== my_type1 === my_type2 === my_type3 === my_type4 === my_type5
This command also supports .lutaml
files.
Instead of using the direct path to the file one can use lutaml-express-index
document attribute to supply directory with express files or YAML index file to
parse as well as the cache file location.
The syntax is as follows:
:lutaml-express-index: my_custom_name; dir_or_index_path[; cache=cache_path]
Where:
-
my_custom_name
- is name of the parsed EXPRESS files context for the later use with lutaml macro -
dir_or_index_path
- location of directory with EXPRESS files or path to the YAML index file to parse -
cache_path
- optional, location of the Expressir cache file to use
Example of usage:
= Document title
Author
:lutaml-express-index: index_name; /path/to/express_files; cache=/path/to/cache_file.yaml
[lutaml,index_name,context]
----
{% for schema in context.schemas %}
== {{schema.id}}
{% endfor %}
----
This command allows to quickly render a LutaML view as an image file.
Given a file example.lutaml
file with content:
diagram MyView {
title "my diagram"
enum AddressClassProfile {
imlicistAttributeProfile: CharacterString [0..1] {
definition
this is multiline with `asciidoc`
end definition
}
}
class AttributeProfile {
+addressClassProfile: CharacterString [0..1]
imlicistAttributeProfile: CharacterString [0..1] {
definition this is attribute definition
}
}
}
The lutaml_diagram
command will add the image to the document.
lutaml_diagram::example.lutaml[]
The lutaml_diagram
command can also be used to denote a block with an embedded
LutaML view.
For example:
[lutaml_diagram]
....
diagram MyView {
title "my diagram"
enum AddressClassProfile {
imlicistAttributeProfile: CharacterString [0..1] {
definition {
This is multiline AsciiDoc content.
}
}
}
class AttributeProfile {
+addressClassProfile: CharacterString [0..1]
imlicistAttributeProfile: CharacterString [0..1] {
definition this is attribute definition
}
}
}
....
This command allows rendering definition tables for a UML model.
Given example.lutaml
file with the content:
diagram MyView {
title "my diagram"
enum AddressClassProfile {
imlicistAttributeProfile: CharacterString [0..1] {
definition
this is multiline with `ascidoc`
end definition
}
}
class AttributeProfile {
+addressClassProfile: CharacterString [0..1]
imlicistAttributeProfile: CharacterString [0..1] {
definition this is attribute definition
}
}
}
And the lutaml_uml_attributes_table
macro:
[lutaml_uml_attributes_table, example.lutaml, AttributeProfile]
Will produce this output:
=== AttributeProfile
Table 1. AttributeProfile attributes
Name Definition Mandatory/ Optional/ Conditional Max Occur Data Type addressClassProfile
TODO: enum’s definition
M
1
CharacterString
imlicistAttributeProfile
this is attribute definition with multiply lines
M
1
CharacterString
In case of "enumeration" (AddressClassProfile) entity:
[lutaml_uml_attributes_table, example.lutaml, AddressClassProfile]
Will produce this output:
=== AddressClassProfile
Table 2. AddressClassProfile values
Name Definition imlicistAttributeProfile
this is multiline with
asciidoc
This command allows to quickly render data model packages and its dependent objects for supplied XMI file.
Given an Enterprise Architect example.xmi
file with 2 packages:
-
'Another'
-
'CityGML'
The lutaml_uml_datamodel_description
macro can be used:
[lutaml_uml_datamodel_description, path/to/example.xmi]
--
[.before]
....
my text
....
[.diagram_include_block, base_path="requirements/", format="emf"]
....
Diagram text
....
[.include_block, package="Another", base_path="spec/fixtures"]
....
my text
....
[.include_block, base_path="spec/fixtures"]
....
my text
....
[.before, package="Another"]
....
text before Another package
....
[.after, package="Another"]
....
text after Another package
....
[.after, package="CityGML"]
....
text after CityGML package
....
[.after]
....
footer text
....
--
--
Where:
-
path/to/example.xmi
- required, path to the XMI file to render -
[.before]
- block text that adds additional text before the rendered output, can be used only once, additional occurrences of macro will overwrite text, not thatliteral
block style must be used in there(eg….
) -
[.after]
- block text that adds additional text after the rendered output, can be used only once, additional occurrences of macro will overwrite text -
[.after, package="Another"]
- block text to be inserted before(after in case of.before
name) the package -
[.package_text, position="after", package="Another"]
- include custom adoc code into package rendered body,position
is a arequired attribute which tells where to insert the code. -
[.package_text, package="Another"]
- same as above, but include block will be included only for supplied package name -
[.diagram_include_block]
- block text to automatically include diagram images. Attributebase_path
is a required attribute to supply path prefix where to look for a diagram image.format
is an optional attribute that tells what file extension to use when including diagram file.The logic is as follows:
{% for diagram in package.diagrams %} [[figure-{{ diagram.xmi_id }}]] .{{ diagram.name }} image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[] {% if diagram.definition %} {{ diagram.definition | html2adoc }} {% endif %} {% endfor %}
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 macro text, it will be added as paragraph before each image include.
-
[.diagram_include_block, package="Another"]
- same as above, but diagram will be included only for supplied package name -
[.include_block, base_path="spec/fixtures"]
- macro to include files (.adoc
or.liquid
) for each package name. Attributebase_path
is a required attribute to supply path prefix where to look for file to include. Macro will look for a file calledbase_path
+/
package_name
(downcase, replace : → '', ' ' → '') +.adoc
[.liquid
], eg for package 'My Package name' andbase_path
eq tomy/path
, macro will look for the following file path:my/path/_my_package_name.adoc
. -
[.include_block, package="Another", base_path="spec/fixtures"]
- same as above, but include block will be included only for supplied package name
Note
|
.after, .before, package_text and include_block macroses all can be used with additional option - liquid , if this option is supplied then the code inside block will be interpolated in liquid context
|
There are two other commands that are used to refer to LutaML generated document elements:
-
lutaml_figure
. Provides a reference anchor to a figure defined in the XMI file, using its XMI ID for reference. -
lutaml_table
. Provides a reference anchor to the definition tables of a particular package, class, enumeration or data type object in the XMI.
The syntax is as follows:
// For lutaml_figure
This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
// For lutaml_table
This is lutaml_table::[package="Wrapper root package"] package
This is lutaml_table::[package="Wrapper root package", class="my name"] class
This is lutaml_table::[package="Wrapper root package", enum="my name"] enumeration
This is lutaml_table::[package="Wrapper root package", data_type="my name"] data type
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 reference package diagram.
Will produce this output:
my text
== CityGML package
=== CityGML overview
Diagram text
[[figure-EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29]]
.CityGML Package Diagram
image::requirements/EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29.png[]
BuildingFurnitureFunctionValue is a code list that enumerates the different purposes of a BuildingFurniture.
[[figure-EAID_938AE961_1C57_4052_B964_997D1894A58D]]
.Use of ISO and OASIS standards in CityGML
image::requirements/EAID_938AE961_1C57_4052_B964_997D1894A58D.png[]
The CityGML package is organized into
2 packages with 1 modules:
. Another package
. CityTML package
my text
Content for CityGML package
==== Defining tables
.<<section-EAPK_9C96A88B_E98B_490b_8A9C_24AEDAC64293>> -- Elements of “Another::AbstractAtomicTimeseries” (class)
[[section-EAPK_9C96A88B_E98B_490b_8A9C_24AEDAC64293]]
.Elements of “Another::AbstractAtomicTimeseries” (class)
[width="100%",cols="a,a,a,a,a,a,a,a"]
|===
h|Name: 7+| AbstractAtomicTimeseries
h|Definition: 7+|
h|Stereotype: 7+| interface
h|Abstract: 7+|
h|Associations: 7+| (none)
.4+h|Public attributes:
| _Name_
2+| _Definition_
| _Derived_
| _Obligation_
| _Maximum occurrence_
| _Data type_
| adeOfAbstractAtomicTimeseries
2+|
|
| C
| *
| ADEOfAbstractAtomicTimeseries
| observationProperty
2+|
|
| M
| 1
| CharacterString
| uom
2+|
|
| C
| 1
| CharacterString
h|Constraints: 7+| (none)
|===
=== Additional Information
text after CityGML package
In addition to the XMI file, this macro also supports a YAML configuration file that specifies:
-
What packages to include in the render;
-
What render style is desired;
-
Location of the root package (which package should the iterative process start at).
The format for using the YAML configuration file:
---
packages:
# includes these packages
- "Package *"
- two*
- three
# skips these packages
- skip: four
render_style: entity_list | data_dictionary | default
section_depth: 2
Where:
-
packages
- required, root element with the list of strings or objects -
Package *
- pattern matching, specifies lookup condition for packages to render.NoteIn this example, it is equal to the following regular expression: /^Package.*$/
-
skip: four
- object with package name to skip -
render_style
- what template to use to render packages, can be one of:-
entity_list
-
data_dictionary
; or -
default
-
-
section_depth
- what package to use as root package for render. e.g., asection_depth
equal to2
tells the processor to use the first nested package of the first root packages in XMI file.EXAMPLE: If the XMI file has this package structure, and we have
section_depth
equal to 2, root package will beone-1
.[ { name: 'One', packages: [{ name: 'one-1' }, { name: 'one-2' }] }, { name: 'Two', packages: [{ name: 'two-1' }, { name: 'two-2' }] } ]
Usage with macro:
[lutaml_uml_datamodel_description, path/to/example.xmi, path/to/config.yml]
----
[.diagram_include_block, base_path="models/Images", format="png"]
...
...
----
The processor will read the supplied YAML config file (path/to/config.yml
),
and iterate through packages according to the order supplied in the file. All
packages that matches skip
in the YAML config file will be skipped during
render.
Please refer to https://www.metanorma.oeg.