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:
- Download - Get the latest version from github (or)
- Install from VPM
vpm install veemarker - Read the Docs