---
name: render_template
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "render_template(template: str, context: dict, missing: str = '') -> str"
description: "Motor de templates minimalista sin dependencias. Soporta {{var}}, {{{raw}}}, {{obj.field}} dot-path, {% for x in list %}...{% endfor %}, {% if cond %}...{% endif %}, {% if not cond %}...{% endif %}. HTML-escaped por defecto."
tags: [template, render, html, string, format, jinja, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["re"]
params:
  - name: template
    desc: "String con template usando {{var}}, {{{raw}}}, {% for %}, {% if %}"
  - name: context
    desc: "Diccionario con valores para las variables"
  - name: missing
    desc: "Valor a usar cuando falta una variable (default: '')"
output: "String renderizado con variables sustituidas y lógica aplicada"
tested: true
tests:
  - "sustitucion simple"
  - "dot path en nested dicts"
  - "for loop con lista de strings"
  - "for loop con lista de dicts"
  - "if endif condicional"
  - "variable missing retorna string vacio"
  - "variable missing configurable"
  - "html escaping por defecto"
  - "triple braces sin escape"
test_file_path: "python/functions/core/render_template_test.py"
file_path: "python/functions/core/render_template.py"
---

## Ejemplo

```python
# Sustitucion simple
result = render_template("Hola {{nombre}}!", {"nombre": "Ana"})
# "Hola Ana!"

# Dot-path
ctx = {"user": {"name": "Bob", "city": "Madrid"}}
result = render_template("{{user.name}} en {{user.city}}", ctx)
# "Bob en Madrid"

# For loop
ctx = {"items": ["a", "b", "c"]}
result = render_template("{% for x in items %}-{{x}}{% endfor %}", ctx)
# "-a-b-c"

# If condicional
result = render_template("{% if show %}visible{% endif %}", {"show": True})
# "visible"

# Sin escape (raw)
result = render_template("{{{html}}}", {"html": "<b>bold</b>"})
# "<b>bold</b>"

# Variable ausente con valor configurable
result = render_template("{{falta}}", {}, missing="N/A")
# "N/A"
```

## Notas

No pretende reemplazar Jinja2. Cubre el 80% de casos simples sin dependencias.
HTML escape por defecto protege contra XSS al generar HTML desde datos de usuario.
Usa {{{triple}}} cuando el valor ya es HTML confiable.
Los bloques for/if pueden anidarse pero el parsing es iterativo, no recursivo profundo.
