Text Templates in OpenSCAD

Our first program will demonstrate how to use text templates in OpenSCAD. OpenSCAD doesn’t have built-in support for text templates, so we’ll implement a simple template system using string concatenation and functions.

// Helper function to replace placeholders in a template
function replace_placeholder(template, placeholder, value) = 
    let(
        parts = split(template, str("{{", placeholder, "}}"))
    )
    len(parts) > 1 ? 
        str(parts[0], value, replace_placeholder(parts[1], placeholder, value)) :
        template;

// Simple template function
function render_template(template, data) =
    replace_placeholder(template, "value", data);

// Example usage
template1 = "Value is {{value}}";
echo(render_template(template1, "some text"));
echo(render_template(template1, 5));
echo(render_template(template1, ["Go", "Rust", "C++", "C#"]));

// Template with a named field
function render_named_template(template, data) =
    replace_placeholder(template, "Name", data["Name"]);

template2 = "Name: {{Name}}";
echo(render_named_template(template2, ["Name", "Jane Doe"]));
echo(render_named_template(template2, ["Name", "Mickey Mouse"]));

// Conditional template (simple version)
function render_conditional_template(template, data) =
    len(data) > 0 ? "yes" : "no";

template3 = "{{if data}}yes{{else}}no{{end}}";
echo(render_conditional_template(template3, "not empty"));
echo(render_conditional_template(template3, ""));

// Range template (simple version)
function render_range_template(data) =
    str("Range: ", join(data, " "));

echo(render_range_template(["Go", "Rust", "C++", "C#"]));

In this OpenSCAD implementation, we’ve created simple functions to mimic the behavior of text templates. Here’s a breakdown of the code:

  1. We define a replace_placeholder function that replaces placeholders in a template string.

  2. The render_template function uses replace_placeholder to render a simple template with a single value.

  3. We demonstrate the usage of this template system with various data types.

  4. For named fields, we create a render_named_template function that works with a dictionary-like data structure.

  5. We implement a very simple conditional template using the render_conditional_template function. This function just checks if the data is empty or not.

  6. Finally, we create a render_range_template function that joins an array of strings, mimicking the behavior of a range template.

To run this program, save it as a .scad file and open it in OpenSCAD. The results will be displayed in the console output.

Note that this is a very basic implementation of templates in OpenSCAD. It doesn’t support all the features of a full-fledged template system, but it demonstrates the concept using OpenSCAD’s built-in functions and string manipulation capabilities.