Generator framework based on Jinja template engine
This framework is implemented in
textX-jinja project. You have to install
it with pip install textX-jinja to be able to use it.
You can roll your own code generation approach with textX but sometimes it is good to have a predefined framework which is easy to get started with and only if you need something very specific later you can create your own code generator.
Here, we describe a little framework based on Jinja template engine.
The idea is simple. If you want to generate a set of files from your textX
model(s) you create a folder which resembles the outline of the file tree you
want to generate. Each file in your template folder can be a Jinja template
(with .jinja extension, e.g. index.html.jinja), in which case target file
will be created by running the template through the Jinja engine. If the file
doesn't end with .jinja extension it is copied as is to the target folder.
To call Jinja generator you use textx_jinja_generator function:
...
from textxjinja import textx_jinja_generator
...
@generator('mylang', 'mytarget')
def mygenerator(metamodel, model, output_path, overwrite, debug):
"Generate MyTarget from MyLang model."
# Prepare context dictionary
context = {}
context['some_param'] = "Some value"
template_folder = os.path.join(THIS_FOLDER, 'template')
# Run Jinja generator
textx_jinja_generator(template_folder, output_path, context, overwrite)
In this example we have our templates stored in template folder.
You can use variables from context dict in your templates as usual, but also
you can use them in filenames. If file name has a variable name in the format
__<variablename>__ it will be replaced by the value of the variable from the
context dict. If variable by the given name is not found the variablename is
treated as literal filename. For example
__package__
in the template file names will be replaced by package name from context dict.
Boolean values in file names are treated specially. If the value is of a bool
type the file will be skipped entirely if the value is False but will be used
if the value is True. This makes it easy to provide templates/files which
should be generated only under certain conditions (for example see __lang__
and __gen__ variable usage in template
names)
If a variable from context is iterable, then the generator will produce a file for each element of the iterable.
Parameter transform_names is a callable that is used to transform model
variables and return a string that will be used instead. It is applied to both
iterable and non-iterable model objects. This
test
is an example usage of iterables and name tranformation.
To see a full example of using textX-jinja you can take a look at the
implementation of startproject textX command in
textX-dev project. This textX command will
run a questionnaire based on the Questionnaire
DSL and with run a project
scaffolding generation by calling
textx_jinja_generate
with the templates for the
project.