ninox-d_dsp ~master
Dlang server pages
To use this package, run the following command in your project's root directory:
Manual usage
Put the following dependency into your project's dependences section:
ninox.d-dsp
Package to provide a build-time template language called "DSP" (Dlang Server Pages).
License
The code in this repository is licensed under AGPL-3.0-or-later; for more details see the LICENSE
file in the repository.
Usage
Template syntax
The template syntax is heavily inspired by other "server pages" template systems.
There are special "tags" that start with <%
and end with %>
. The start tag is followed by a identifier, which is a string starting from the start-tag until the first space (or the endtag in some special cases).
This identifier is used to determine what a tag is doing:
<%layout abc %>
specifies a layout (in this caseabc.dsp
), which is tried to be called with the current template as a delegate passed toemitSlot
(see below).<%head ... %>
contains arbitary dlang code to be emitted at the top-most level (or module level) of the generated dlang source file.<%d ... %>
contains arbitrary dlang code to be emitted at the current position in the generated source file. This is usefull to make dynamic templates.<%inc abc %>
includes a other template to be rendered at the current position. Here it tries to includeabc.dsp
. You can specify which data to render the template with, by writing a dlang expression right after the template name:<%inc abc 12 %>
.<%slot %>
is the "slot" or insertion-point for a template that is rendered as a layout for another template.<%attrs ... %>
's content will be emitted as the template's rendering funcion's attributes. With this it is possible to add@gc
or similar attributes to the rendering function. Example:<%attrs @gc %>
.
Additionally there exists two syntaxes for directly rendering data; note that each result is first passed to std.conv.to!(const char[])
before emitted:
{% expr %}
uses the given content and treats it as a dlang expression, which result needs to be emitted.[[ name ]]
can be used in combination with a assocative array as data to lookup the given name inside it. Technically, this is compiled down toctx.data["name"]
, this also allowing any custom type that implements the index operator with a string parameter to be used.
Abart from that, the dlang code specified in the various tags can always refer to ctx
for the given render context (see below). The <%d
tags also is allowed to use @
to refer to ctx.data
and $(...)
for a call to ctx.emit(...)
.
Whitespace triming
Each tag (i.e. <%d ... %>
), is allowed to have one special "whitespace-control" character as it's first or last character in its identifier; is is removed upon detection and does not alter the general meaning of the tag in any other way expect the effects described here:
<%-xxx
strips any previous text content's right whitespace until a newline. I.e.:<div> <d+ %>a </div>
Will remove the four spaces before the
<%d
, resulting in:<div> a </div>
<%xxx-
strips any whitespace after the tag up and including a newline:<div> <%d %> a </div>
Will remove the newline after the
%>
, resulting in:<div> a </div>
<%xxx!
or<%!xxx
combines the effects of the previous two.
Rendering templates
Each generated sourcefile will have an exported renderTemplate
function you can use to render the template. It's signature is as follows:
import ninox.dsp : Context;
public void renderTemplate(ref Context ctx, void delegate() emitSlot = null);
The first parameter, ref Context ctx
is the rendering context. It holds:
- the
emit
callable which accepts aconst char[]
as single parameter and has a returntype ofvoid
. It is used by the templates to emit text data. - the
data
variant, which can hold any data.
The second parameter, void delegate() emitSlot
is a optional delegate to render the <%slot%>
element. Will be un-used if no slot is present.
Processing template files
To process template files, you'll need to run this package via dub run
:
$ dub run ninox-d_dsp -- --input=./templates --output=./source --package=app
The command above will read templates from the ./templates
path by building and executing the glob ./templates/**/*.dsp
. The generated code will be written into ./source
, where each .dsp
file will get transformed into a .gen.d
file. Folder structure is preserved. It uses the package name (or module prefix to be precise) of app
. Each generated dlang sourcefile will also contain the folder path relative to the input path in its module name.
For example, a template located at ./templates/some/path/file.dsp
will be written to ./source/some/path/file.dsp.gen.d
, with a module identifier of app.some.path.file
.
Usage in projects via dub
To start using dsp files, you'll need to do the following:
edit your project's
dub.json
- add a dependency for
ninox-d_dsp
- add
dub run ninox-d_dsp -- --input=xxx --output=xxx --package=xxx
topreGenerateCommands
, and replace / set the options accordingly.
- add a dependency for
use the
renderTemplate
function(s) of the modules generated
- ~master released 4 months ago
- Bithero-Agency/ninox.d-dsp
- AGPL-3.0-or-later
- Copyright © 2024, Mai-Lapyst
- Authors:
- Dependencies:
- ninox-d_std:callable
- Versions:
-
1.0.0 2024-Jul-06 ~master 2024-Jul-06 - Download Stats:
-
-
0 downloads today
-
0 downloads this week
-
0 downloads this month
-
0 downloads total
-
- Score:
- 0.3
- Short URL:
- ninox-d_dsp.dub.pm