Template engines are tools that combine static text with dynamic data to generate output. They're fundamental to web development, document generation, and many other applications where you need to create personalized or data-driven content.
At their core, template engines solve a simple problem: how do you insert variable data into predefined text patterns? Instead of manually concatenating strings (which becomes unwieldy with complex templates), template engines use placeholder syntax to mark where data should be inserted.
Most template engines follow a similar pattern:
The parsing step typically uses regular expressions to find placeholder patterns. Common syntaxes include {{variable}} (Handlebars/Mustache style), ${variable} (JavaScript template literals), or %{variable}s (Python string formatting). The double-brace syntax {{variable}} is popular because it's unlikely to conflict with actual content and is visually distinct.
Validation is crucial for catching errors early. Rather than silently ignoring missing variables or crashing during substitution, good template engines check upfront that all required data is present. This makes debugging much easier.
The substitution step replaces each placeholder with its corresponding value. Most engines convert all values to strings automatically, allowing you to pass numbers, booleans, or other data types without manual conversion.
Template engines enable separation of concerns: designers can work on templates while developers focus on data logic. They also improve maintainability by centralizing text formatting and making it easy to modify output without touching application code.
1import re
2
3def simple_template(text, data):
4 """A basic template function using {{variable}} syntax"""
5 # Find all variables in the template
6 variables = re.findall(r'{{(\w+)}}', text)
7
8 # Replace each variable with its value
9 result = text
10 for var in variables:
11 if var in data:
12 result = result.replace(f"{{{{{var}}}}}", str(data[var]))
13
14 return result
15
16# Usage example
17template_text = "Dear {{customer}}, your order #{{order_id}} is ready!"
18data = {"customer": "Sarah", "order_id": 12345}
19output = simple_template(template_text, data)
20print(output) # "Dear Sarah, your order #12345 is ready!"