Ginja is a string template engine for Godot 4.
Provides access to (some of) Inja
's features.
This is a GdExtension
addon for Godot 4
.
- Generate tailored, efficient shaders.
- Generate gdscript during development.
- Generate dialogues, messages, and roleplays.
- …
If you have a bleeding edge Godot 4 (more recent than alpha9), you can download and run the demo in Releases to see an example shader generation.
This source tree holds what's needed to build the shared libraries, not the shared libraries themselves since they are binary blobs.
var tpl = "Hello, {{ name }} !"
var ginja = Ginja.new()
var msg = ginja.render(tpl, {
'name': "Nathanaël",
})
print(msg)
This is a very simple example, but you may use loops, conditions, comments, etc. See Inja's documentation for the available features.
You may also define your own functions for use in the templates:
func _ready():
var ginja = Ginja.new()
ginja.add_function("repeat", 2, self, "call_repeat")
var msg = ginja.render("{{ repeat(msg, amount) }}", {
'msg': "🎶!",
'amount': 5,
})
assert(msg == "🎶!🎶!🎶!🎶!🎶!")
func call_repeat(msg: String, amount: int) -> String:
return msg.repeat(times)
You HAVE TO specify the amount of arguments your custom function uses.
You can also define and register variadic functions, like sum
here:
func _ready():
var ginja = Ginja.new()
ginja.add_function_variadic("sum", self, "call_sum")
var answer = ginja.render("{{ sum(a, b, c) }}", {
'a': 41,
'b': -5,
'c': 6,
})
assert(answer == "42")
func call_sum(arguments: Array) -> int:
var total := 0
for argument in arguments:
total += argument
return total
- LEAKING (see #1 — might not be us)
- GdNative DOES NOT WORK IN EXPORTED HTML5 BUILDS
- Single character unicode strings (like
🎶
) behave oddly and yield empty strings sometimes - No personal plans for testing Windows or Mac, contribs welcome
- Variadic user-defined functions need at least one parameter when called
- Limited to Inja capabilities. Eg: Inja offers no filters
include
andextend
might not work in exported projects (to check)- Error when fetching callback
Object
from itsRID
: (but it works)
ERROR: Condition "_instance_bindings != nullptr" is true.
at: set_instance_binding (core/object/object.cpp:1771)
Can't figure out if it's our fault or not, for this one. Idea: try
Ref<Object>
instead ofRID&
.
Unsupported in HTML5 builds, beware ! See the state of GdNative on HTML5.
- Linux x86_64
- Linux x86_32 (to test)
- Windows x86_64 (to test)
- Windows x86_32 (to test)
- Mac x86_64 (to test)
- …
Shader and gdscript generation is still useful during development, even if we can't rely on it at runtime for now.
The installation is as usual, through the Assets Library. (todo)
Meanwhile, dowload the latest Release (on the right), or clone this repository and build the shared objects.
The shared libs were not added to this repository, since they are build artifacts. (CI is coming)
Then you can copy the addons/
directory of this project into yours.
Finally, enable the plugin in Scene > Project Settings > Plugins
.
Build the shared libraries:
cd gdextension_generator
CORES=4 TARGET=debug build.sh
CORES=4 TARGET=release build.sh
Want to do this using CI, but we need a custom action, or to find a docker image with everything we need.
Use homebuilt Godot 4 from master, not alpha9.
Ideally:
git submodule add -b 4.x https://github.com/godotengine/godot-cpp gdextension_generator/godot-cpp
Pragma 'til the 4.x
branch exists:
git submodule add https://github.com/godotengine/godot-cpp gdextension_generator/godot-cpp
Remember to init the submodules!
The first step is always to compile the godot-cpp
library:
cd gdextension_generator/godot-cpp
scons target=debug
Then we can compile our shared library:
cd gdextension_generator
scons target=debug
It outputs in the addons/goutte.template.inja/bin/
directory.
The libs are voluminous because they are not
strip
ped, you may do so:
strip addons/goutte.template.inja/bin/libgd*
The demo uses a symlink to get as child its sibling addons/
directory.
Might not hold through git across platforms, beware.
Inja has been copied from 3.3
, and the #include
of json
have been changed to use the local file: #include "json.hpp"
. Both are warts, and enlightened suggestions are welcome.
Just thoughts on a vanilla gdscript fallback for Ginja.
Needs gdscript
templates and runtime first. Those are 404
for now.
Would allow for easier customization of the enclosing markup tokens. Much more work. Faster code, though. (if done well)