VeeMarker

An advanced Template Engine for V Language with FreeMarker syntax compatibility. VeeMarker is OpenSource and distributed with an MIT license.

Version Technology Category
20251015 / Stable V Language Software Library: V Module

Key Features

🚀 Performance

High-performance implementation built with V language for maximum speed and efficiency.

🎨 Design

Clean, intuitive API with no external module dependencies. Uses V stdlib, no external calls to C.

Use-cases

VeeMarker can be used for any type of template, not just webpages. some example use-cases might be:

  • HTML, CSS, XML
  • Email Template
  • Text files
  • Markdown

Utilizing the notion of includes and template inheritence provides for a powerful engine that lets you generate output for a variety of document types.

🔧 Compatibility

VeeMarker takes inspiration directly from Apache's FreeMarker project. FreeMarker is an extremely powerful and widely used template engine for Java. When developing VeeMarker, the goal was to introduce a multi-purpose template engine, not just one designed for webpages. VeeMarker offers significant compatibility with the FreeMarker language reference.

What does it look like? 👀

V (main.v)

module main

import veemarker
import os

fn main() {
    println('VeeMarker Hello World Example')
    println('='.repeat(40))

    // Create the template engine
    mut engine := veemarker.new_engine(veemarker.EngineConfig{
        template_dir: '.'
        dev_mode: true
    })

    // Prepare template data
    mut data := map[string]veemarker.Any{}

    // Simple data
    data['greeting'] = veemarker.Any('Hello')
    data['name'] = veemarker.Any('World')

    // A list of items
    items := [
        veemarker.Any('Learn VeeMarker'),
        veemarker.Any('Create templates'),
        veemarker.Any('Build amazing apps')
    ]
    data['items'] = veemarker.Any(items)

    // Nested object
    mut user := map[string]veemarker.Any{}
    user['username'] = veemarker.Any('developer')
    user['level'] = veemarker.Any(42)
    user['premium'] = veemarker.Any(true)
    data['user'] = veemarker.Any(user)

    // Numbers for calculations
    data['year'] = veemarker.Any(2025)
    data['pi'] = veemarker.Any(3.14159)

    // Render from string template first
    println('\n1. String Template Example:')
    println('-'.repeat(30))

    simple_template := r'${greeting}, ${name}!'
    result := engine.render_string(simple_template, data) or {
        eprintln('Error rendering string template: ${err}')
        return
    }
    println(result)

    // Render from file template
    println('\n2. File Template Example:')
    println('-'.repeat(30))

    // Check if template file exists
    if !os.exists('hello.vtpl') {
        eprintln('Template file hello.vtpl not found!')
        eprintln('Please run this example from the helloworld directory')
        return
    }

    file_result := engine.render('hello.vtpl', data) or {
        eprintln('Error rendering file template: ${err}')
        return
    }
    println(file_result)

    println('\n' + '='.repeat(40))
    println('Example completed successfully!')
}

VeeMarker Template (hello.vtpl)

<#-- VeeMarker Hello World Template -->
<#-- This template demonstrates various VeeMarker features -->

========================================
${greeting?upper_case}, ${name?upper_case}!
========================================

Welcome to VeeMarker - A FreeMarker-compatible template engine for V!

Current year: ${year}
PI value: ${pi}

<#-- User Information Section -->
User Profile:
-------------
<#if user.premium>
⭐ Premium Member
<#else>
Regular Member
</#if>
Username: ${user.username}
Level: ${user.level}
<#if user.level > 40>
Status: Expert (Level ${user.level})
<#else>
Status: Learning (Level ${user.level})
</#if>

<#-- List Iteration Example -->
Things to do:
-------------
<#list items as item>
  ${item_index + 1}. ${item}
</#list>

<#-- Variable Assignment --> 
<#assign message = "VeeMarker is awesome!">
<#assign calc = year + 5>

Special Message: ${message?lower_case}
In 5 years it will be: ${calc}

<#-- Expression Examples -->
Calculations:
-------------
Year + 100 = ${year + 100}
PI * 2 = ${pi * 2}
Is 2025? ${year == 2025}

<#-- String Manipulations -->
Text Processing:
----------------
Original: ${greeting}, ${name}!
Uppercase: ${greeting?upper_case}, ${name?upper_case}!
Length of greeting: ${greeting?length}

<#-- Nested Conditionals -->
<#if user.premium>
<#if user.level > 50>
🏆 You're a elite premium user!
<#else>
⭐ Welcome premium member! Keep leveling up!
</#if>
<#else>
Consider upgrading to premium for more features.
</#if>

<#-- Array Access Example -->
First task: ${items[0]}
Total tasks: ${items?size}

========================================
Thank you for trying VeeMarker!
========================================

Output

Hello, World!

2. File Template Example:
------------------------------

========================================
HELLO, WORLD!
========================================

Welcome to VeeMarker - A FreeMarker-compatible template engine for V!

Current year: 2025
PI value: 3.14159

User Profile:
-------------
⭐ Premium Member
Username: developer
Level: 42
Status: Expert (Level 42)

Things to do:
-------------
  1. Learn VeeMarker
  2. Create templates
  3. Build amazing apps

Special Message: veemarker is awesome!
In 5 years it will be: 2030

Calculations:
-------------
Year + 100 = 2125
PI * 2 = 6.28318
Is 2025? true

Text Processing:
----------------
Original: Hello, World!
Uppercase: HELLO, WORLD!
Length of greeting: 5
⭐ Welcome premium member! Keep leveling up!

First task: Learn VeeMarker
Total tasks: 3

========================================
Thank you for trying VeeMarker!
========================================

Technical Specifications

Specification Details
Programming Language V Language
Platform Support (tested) macOS, Linux - should work on any platform V can compile
Dependencies V >= 0.4.11., V stdlib

Getting Started

Ready to try VeeMarker? Follow these simple steps:

  1. Download - Get the latest version from github (or)
  2. Install from VPM vpm install veemarker
  3. Read the Docs

Documentation

VeeMarker Reference Guide