# Using Compiled Templates in Demo App This demo supports both runtime template rendering (default) and compiled templates for maximum performance. ## Quick Start ### 1. Build the pug-compile tool (from main pugz directory) ```bash cd ../../.. # Go to pugz root zig build ``` ### 2. Compile templates ```bash cd src/tests/examples/demo zig build compile-templates ``` This generates Zig code in the `generated/` directory. ### 3. Enable compiled templates Edit `src/main.zig` and change: ```zig const USE_COMPILED_TEMPLATES = false; ``` to: ```zig const USE_COMPILED_TEMPLATES = true; ``` ### 4. Build and run ```bash zig build run ``` Visit http://localhost:8081/simple to see the compiled template in action. ## How It Works 1. **Template Compilation**: The `pug-compile` tool converts `.pug` files to native Zig functions 2. **Generated Code**: Templates in `generated/` are pure Zig with zero parsing overhead 3. **Type Safety**: Data structures are generated with compile-time type checking 4. **Performance**: ~10-100x faster than runtime parsing ## Directory Structure ``` demo/ ├── views/pages/ # Source .pug templates │ └── simple.pug # Simple template for testing ├── generated/ # Generated Zig code (after compilation) │ ├── helpers.zig # Shared helper functions │ ├── pages/ │ │ └── simple.zig # Compiled template │ └── root.zig # Exports all templates └── src/ └── main.zig # Demo app with template routing ``` ## Switching Modes **Runtime Mode** (default): - Templates parsed on every request - Instant template reload during development - No build step required - Supports all Pug features **Compiled Mode**: - Templates pre-compiled to Zig - Maximum performance in production - Requires rebuild when templates change - Currently supports: basic tags, text interpolation, attributes, doctypes ## Example **Template** (`views/pages/simple.pug`): ```pug doctype html html head title #{title} body h1 #{heading} p Welcome to #{siteName}! ``` **Generated** (`generated/pages/simple.zig`): ```zig pub const Data = struct { heading: []const u8 = "", siteName: []const u8 = "", title: []const u8 = "", }; pub fn render(allocator: std.mem.Allocator, data: Data) ![]const u8 { // ... optimized rendering code ... } ``` **Usage** (`src/main.zig`): ```zig const templates = @import("templates"); const html = try templates.pages_simple.render(arena, .{ .title = "My Page", .heading = "Hello!", .siteName = "Demo Site", }); ``` ## Benefits - **Performance**: No parsing overhead, direct HTML generation - **Type Safety**: Compile-time checks for missing fields - **Bundle Size**: Templates embedded in binary - **Zero Dependencies**: Generated code is self-contained ## Limitations Currently supported features: - ✅ Tags and nesting - ✅ Text and interpolation (`#{field}`) - ✅ Attributes (static and dynamic) - ✅ Doctypes - ✅ Comments - ✅ Buffered code (`p= field`) - ✅ HTML escaping Not yet supported: - ⏳ Conditionals (if/unless) - in progress - ⏳ Loops (each) - ⏳ Mixins - ⏳ Includes/extends - ⏳ Case/when For templates using unsupported features, continue using runtime mode.