Top Related Projects
A very fast and expressive template engine.
Liquid markup language. Safe, customer facing template language for flexible web apps.
A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)
The Web framework for perfectionists with deadlines.
Minimal templating on steroids.
Quick Overview
Stencil is a simple and powerful template language for Swift. It provides a syntax similar to Django and Mustache, allowing developers to create flexible and reusable templates for various purposes, such as generating dynamic content or code generation.
Pros
- Easy to learn and use, with a syntax familiar to developers who have worked with Django or Mustache
- Supports custom filters and tags, allowing for extensibility and customization
- Provides safety features like automatic HTML escaping to prevent XSS attacks
- Offers good performance and is actively maintained
Cons
- Limited built-in filters and tags compared to some more mature template engines
- Lack of extensive documentation and examples for advanced use cases
- May require additional setup and configuration for use in server-side Swift applications
- Not as widely adopted as some other template engines in the Swift ecosystem
Code Examples
- Basic variable rendering:
let template = "Hello, {{ name }}!"
let context = ["name": "World"]
let rendered = try stencil.render(template: template, context: context)
// Output: "Hello, World!"
- Using filters:
let template = "The price is {{ price | currency }}"
let context = ["price": 42.5]
let rendered = try stencil.render(template: template, context: context)
// Output: "The price is $42.50"
- Conditional statements:
let template = """
{% if isLoggedIn %}
Welcome back, {{ username }}!
{% else %}
Please log in.
{% endif %}
"""
let context = ["isLoggedIn": true, "username": "John"]
let rendered = try stencil.render(template: template, context: context)
// Output: "Welcome back, John!"
Getting Started
To use Stencil in your Swift project, follow these steps:
- Add Stencil to your project using Swift Package Manager:
dependencies: [
.package(url: "https://github.com/stencilproject/Stencil.git", from: "0.15.1")
]
- Import Stencil in your Swift file:
import Stencil
- Create a simple template and render it:
let environment = Environment(loader: FileSystemLoader(paths: ["path/to/templates"]))
let template = try environment.loadTemplate(name: "greeting.stencil")
let context = ["name": "Swift Developer"]
let rendered = try template.render(context)
print(rendered)
Competitor Comparisons
A very fast and expressive template engine.
Pros of Jinja
- More mature and widely adopted, with extensive documentation and community support
- Offers a richer set of features, including complex control structures and filters
- Supports multiple programming languages beyond Python
Cons of Jinja
- Can be more complex to learn and use, especially for beginners
- May have a larger footprint and slower performance for simpler templating needs
Code Comparison
Jinja:
{% for item in items %}
<li>{{ item.name | capitalize }}</li>
{% endfor %}
Stencil:
{% for item in items %}
<li>{{ item.name | capitalize }}</li>
{% endfor %}
Both Jinja and Stencil use similar syntax for basic templating operations, making it easier for developers to switch between them. However, Jinja offers more advanced features and flexibility, while Stencil focuses on simplicity and Swift integration.
Jinja is better suited for complex templating needs across multiple languages, while Stencil is ideal for Swift-based projects that require a lightweight and easy-to-use templating solution.
Liquid markup language. Safe, customer facing template language for flexible web apps.
Pros of Liquid
- More mature and widely adopted, especially in e-commerce platforms
- Extensive documentation and community support
- Built-in filters and tags for common e-commerce operations
Cons of Liquid
- Less flexible syntax compared to Stencil
- Limited extensibility without custom Ruby code
- Performance can be slower for complex templates
Code Comparison
Liquid:
{% if product.title contains 'Pack' %}
This product is part of a pack
{% endif %}
Stencil:
{{#contains product.title 'Pack'}}
This product is part of a pack
{{/contains}}
Key Differences
- Syntax: Liquid uses
{% %}
for logic and{{ }}
for output, while Stencil uses Handlebars-style syntax - Language: Liquid is implemented in Ruby, Stencil in Swift
- Extensibility: Stencil allows for easier custom tag and filter creation
- Performance: Stencil generally offers better performance, especially for complex templates
- Use case: Liquid is more e-commerce focused, while Stencil is more general-purpose
Conclusion
Both Liquid and Stencil are powerful templating engines with their own strengths. Liquid excels in e-commerce scenarios and has a larger ecosystem, while Stencil offers more flexibility and potentially better performance for general-purpose templating needs.
A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)
Pros of Nunjucks
- More extensive feature set, including asynchronous support and custom filters
- Larger community and ecosystem, with more resources and third-party extensions
- Better performance for complex templates and large datasets
Cons of Nunjucks
- Steeper learning curve due to more advanced features
- Heavier footprint, which may impact load times in browser environments
- Less focus on simplicity and minimalism compared to Stencil
Code Comparison
Nunjucks:
{% for item in items %}
<li>{{ item.name | capitalize }}</li>
{% endfor %}
Stencil:
{% for item in items %}
<li>{{ item.name | capitalize }}</li>
{% endfor %}
While the basic syntax is similar, Nunjucks offers more advanced features like:
{% asyncEach item in items %}
<li>{{ item.name | async_filter }}</li>
{% endeach %}
Stencil focuses on simplicity and doesn't include async operations or complex filters out of the box. Both templating engines provide similar core functionality, but Nunjucks offers more advanced features at the cost of increased complexity. Stencil aims for a simpler, more lightweight approach, which may be preferable for projects with straightforward templating needs.
The Web framework for perfectionists with deadlines.
Pros of Django
- Full-featured web framework with built-in admin interface, ORM, and authentication system
- Large, active community with extensive documentation and third-party packages
- Follows the "batteries included" philosophy, providing a complete solution out of the box
Cons of Django
- Steeper learning curve due to its comprehensive nature
- Can be overkill for smaller projects or simple websites
- Opinionated structure may limit flexibility in some cases
Code Comparison
Django (URL routing):
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
path('', views.home, name='home'),
]
Stencil (template rendering):
let context = ["name": "World"]
let template = Template(templateString: "Hello, {{ name }}!")
let result = try template.render(context)
print(result) // Output: Hello, World!
Django is a full-stack web framework for Python, while Stencil is a lightweight templating engine for Swift. Django offers a complete solution for web development, including an ORM, admin interface, and authentication system. Stencil, on the other hand, focuses solely on templating and is more suitable for use in iOS and macOS applications. Django's comprehensive nature makes it ideal for complex web applications, while Stencil's simplicity makes it a good choice for rendering templates in Swift projects.
Minimal templating on steroids.
Pros of Handlebars.js
- More mature and widely adopted, with a larger community and ecosystem
- Supports both client-side and server-side rendering
- Offers pre-compilation for improved performance
Cons of Handlebars.js
- Syntax can be more verbose compared to Stencil
- Limited built-in functionality, often requiring custom helpers
- Steeper learning curve for complex templates
Code Comparison
Handlebars.js:
{{#each items}}
<li>{{name}}: {{price}}</li>
{{/each}}
Stencil:
{% for item in items %}
<li>{{ item.name }}: {{ item.price }}</li>
{% endfor %}
Both templating engines offer similar functionality for basic loops and variable output. Handlebars.js uses {{#each}}
for iteration, while Stencil uses a more familiar {% for %}
syntax. Stencil's syntax is generally more concise and resembles other popular templating languages.
Handlebars.js is better suited for projects requiring cross-platform compatibility and extensive customization through helpers. Stencil, on the other hand, offers a simpler syntax and is particularly well-integrated with Swift and Apple platforms, making it an excellent choice for iOS and macOS development.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Stencil
Stencil is a simple and powerful template language for Swift. It provides a syntax similar to Django and Mustache. If you're familiar with these, you will feel right at home with Stencil.
Example
There are {{ articles.count }} articles.
<ul>
{% for article in articles %}
<li>{{ article.title }} by {{ article.author }}</li>
{% endfor %}
</ul>
import Stencil
struct Article {
let title: String
let author: String
}
let context = [
"articles": [
Article(title: "Migrating from OCUnit to XCTest", author: "Kyle Fuller"),
Article(title: "Memory Management with ARC", author: "Kyle Fuller"),
]
]
let environment = Environment(loader: FileSystemLoader(paths: ["templates/"]))
let rendered = try environment.renderTemplate(name: "article_list.html", context: context)
print(rendered)
Philosophy
Stencil follows the same philosophy of Django:
If you have a background in programming, or if youâre used to languages which mix programming code directly into HTML, youâll want to bear in mind that the Django template system is not simply Python embedded into HTML. This is by design: the template system is meant to express presentation, not program logic.
The User Guide
Resources for Stencil template authors to write Stencil templates:
Resources to help you integrate Stencil into a Swift project:
Projects that use Stencil
Sourcery, SwiftGen, Kitura, Weaver, Genesis
License
Stencil is licensed under the BSD license. See LICENSE for more info.
Top Related Projects
A very fast and expressive template engine.
Liquid markup language. Safe, customer facing template language for flexible web apps.
A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)
The Web framework for perfectionists with deadlines.
Minimal templating on steroids.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot