Vorbild is a simple console app for generating files and their content from template sources specified by the user.
It may be useful if you have a regular structure and hierarchy of the project files.
Create your templates:
<templates-folder>
---<template1-folder>
---source
---values.json
---placeholder.json (optional)
...
---<templateN-folder>
---source
---values.json
---placeholder.json (optional)Directory source contains any files with paths and file content placeholder.
For example:
vorbild-templates
---module
---source
---{{^file_path}}/{{^feature_name}}Controller.kt
---values.jsonfeature_name is specified by the user, file_path depends on module_name and package_name
(see values example).
{{^feature_name}}Controller here is just a text file with your extension (.hs, .kt, .py, .txt etc.)
and content:
package {{^file_path#replace '/' '.'}}
class {{^feature_name}}Controller {
...
}Read here about #replace '/' '.'.
Values are specified in values.json:
[
{
"name" : "value_name_1",
"label" : "Label of value_name_1"
},
{
"name" : "some_dependent_value_N-k",
"value" : "some_text_1...{{^value_name_1}}...some_text_N...{{^value_name_N}}..."
},
{
"name" : "value_name_N",
"label" : "Label of value_name_N"
}
]If an item doesn't contain value then it must be specified by the user.
Taking into account example above:
[
{
"name" : "packange_name",
"label" : "Specify package name"
},
{
"name" : "module_name",
"label" : "Specify module name"
},
{
"name" : "feature_name",
"label" : "Specify feature name"
},
{
"name" : "file_path",
"value" : "com/{{^packange_name}}/{{^module_name}}"
}
]Suppose that user inputs are package_name = core, module_name = temperature,
feature_name = Measurement. So vorbild will generate this:
// com/core/temperature/MeasurementController.kt
package com.core.temperature
class MeasurementController {
...
}Examples above use replace '/' '.'. This simply replaces / to . in the
final file_path value.
More general form of this modifier is replace '<str1>' '<str2>'.
Currently supported modifiers:
replace 'old' 'new'toLowertoUppercapitalizetoCaseFoldtoCameltoSnaketoKebab
# is just a separator for modifiers. Several modifiers can be used together:
#replace 'a' 'b'#toLower#replace 'cd' 'xy'
More general form for value placeholders looks like this:
<openTag><valuePrefix><value><modifierSeparator><modifier1>...<modifierSeparator><modifierN><closeTag>
By default openTag == {{, closeTag = }}, valuePrefix = ^, modifierSeparator = #,
but it can be configured with the optional file placeholder.json:
{
"openTag" : "<openTag>",
"closeTag" : "closeTag",
"valuePrefix" : "<valuePrefix>",
"modifierSeparator" : "<modifierSeparator>"
}If you want to use a default config, just do not add this file to the template folder.
General command looks like:
vorbild (-s|--src template path) [-d|--dst destination path]If -d is not specified, current directory will be used.
Sometimes project has some files which should be updated after using template engine. Assumption is that file contains all controllers:
// com/core/temperature/flow.kt
package com.core.temperature
flow {
ConverterController
OperationsController
}
It's needed to add MeasurementController in block flow { ... } after its creation from template.
For this case define in <template>/modifieble special descriptor <descriptor_name>.json.
<templates-folder>
---<template1-folder>
---source
---modifieble (!)
---<descriptor1>.json
...
---<descriptorN>.json
---values.json
---placeholder.json (optional)
...
---<templateN-folder>
---source
---modifieble (!)
---<descriptor1>.json
...
---<descriptorN>.json
---values.json
---placeholder.json (optional)For this example:
vorbild-templates
---module
---modifieble
---flow.json
---source
---{{^file_path}}/{{^feature_name}}Controller.kt
---values.jsonWhere flow.json:
{
"filePath" : "{{^file_path}}",
"blockDescriptors" : [{
"edges": {
"start": "flow {\n",
"end": "}"
},
"id" : "flow",
"actions" : ["append:'\n {{^feature_name}}Controller'", "sortLines"]
}]
}Here vorbild will use specified values from previous sections to fild existing
file, append new text block between defined edges and sort all lines:
// com/core/temperature/flow.kt
package com.core.temperature
flow {
ConverterController
MeasurementController
OperationsController
}
Currently supported actions:
append:'<arg>'prepend:'<arg>'appendOnce:'<arg>'- if text block already exist then action will not be applied.prependOnce:<arg>sortLinessortLinesDesc
If edges aren't specified then full file content will be considered as block.
The following installation methods are available at the moment:
- Just download executable files from releases
- Use snap package manager:
sudo snap install vorbild- Download from AUR repository using AUR helper (yay, pacaur etc.)
Vorbild is distributed under the Apache-2.0 License.