so://phie

HomeGitCV

ductape

Static template generator for C

git clone git@soophie.de:/srv/git/ductape

ductape

Static template generator for C

ductape is static template generator with dynamic linking for C.

                                 +---------+                      (dlopen)
                           +---> |   .so   | ---------------------- load ------------------------+
+---------+    (ductape)   |     +---------+                                                     |
|  .html  | --- compile ---+                                                                     v
+---------+                |     +---------+                  +----------+      (cc)        +----------+
                           +---> |   .h    | --- include ---> |  main.c  | --- compile ---> |   main   |
                                 +---------+                  +----------+                  +----------+

Installation

git clone git@soophie.de:/srv/git/ductape
cd ductape
sudo make install

Quick Start

Create a macro.h file which needs to define DUC_OUT for storing the handle the content is later written to and DUC_WRITE which handles consuming and writing onto the handle.

The file can be extended with custom macros (like STRING, NUMBER, MARKDOWN, etc.), to simplify writing more complex templates.

#define DUC_OUT ((str_t *) out) // cast custom handle
#define DUC_WRITE($str) { str_append(DUC_OUT, $str); } // define custom write function

#define STRING DUC_WRITE

The template example.html is defined (could be any kind of language), which includes the previously defined macro header file, followed by the start of the template definition TEMPLDEF with the first parameter being the UID and succeeding with varies parameters which allow for injecting dynamic data. The end of the template is marked with ENDTEMPL. Inside the template definition. the content is rendered, while content outside will be ignored.

The symbol % marks the delimiter between template and C code. In order to use the delimiter in the template it needs to be repeated twice to escape the character. All parameters passed into the template are bound to the ctx variable.

% #include "macro.h" %

% TEMPLDEF(
  example,
  char *message;
) %

<p>% STRING(ctx->message) %</p>

% ENDTEMPL %

The template can be compiled with the the installed CLI command ductape. Simply pass a list of files to the command and it will generate the corresponding .h (header) and .so (shared library) files based on the specified UID of the template.

ductape example.html

Finally, a main function can be defined which imports the compiled example.h header file, which contains everything needed to dynamically render the template, such as the example_t context structure passed into the template, as well as the example_render function which renders the template into the specified out handle.

#include "example.h"

int main(void) {
  str_t out = STR_NULL;
  example_t ctx = {
    .message = "It works!",
  };
  int ret = example_render(&out, &ctx);
  if (ret == 0) {
    printf("%s", (char *) str_get(&out))
    str_free(&out);
  }
  return ret;
}

License

This project is licensed under the GNU General Public License v3.0 (GPLv3).

What this means: You are free to use, study, and modify this framework. However, if you distribute a program that uses this framework (including selling it), you must provide the full source code of your program under the same GPLv3 license.

See the LICENSE file for the full legal text.