STXT - Semantic Text
Built for humans. Reliable for machines.

STXT Plantillas (@stxt.template)

1. Introducción
2. Terminología
3. Relación entre STXT y Template
4. Estructura general de un Template
5. Un template por namespace objetivo
6. Bloque `Structure >>`
7. Cardinalidades
8. Tipos
9. ENUM y lista de valores
10. Namespaces dentro de `Structure`
11. Reglas de “nodos definidos”
12. Compilación a Schema (equivalencia semántica)
13. Errores de Template
14. Conformidad
15. Meta-template del propio sistema `@stxt.template`
16. Ejemplos normativos
17. Apéndice A — Gramática (informal)
18. Fin del Documento

1. Introducción

Este documento define la especificación del lenguaje STXT Template, un mecanismo para describir reglas semánticas (estructura, tipos y cardinalidades) aplicables a documentos STXT.

Un template:

Relación con @stxt.schema:

2. Terminología

Las palabras clave "DEBE", "NO DEBE", "DEBERÍA", "NO DEBERÍA", y "PUEDE" deben interpretarse según RFC 2119.

Términos como nodo, indentación, namespace, inline y bloque >> mantienen su significado en STXT-SPEC.

Definiciones adicionales:

3. Relación entre STXT y Template

La validación mediante templates ocurre después del parseo STXT:

  1. Parseo del documento STXT a estructura jerárquica.
  2. Resolución del namespace lógico por herencia.
  3. Selección del template correspondiente al namespace lógico.
  4. Aplicación de reglas del template (estructura, cardinalidad, tipos, valores).

Opcionalmente, un validador PUEDE aplicar reglas durante el parseo, siempre que esté débilmente acoplado al parser.

4. Estructura general de un Template

Un template es un documento cuyo nodo raíz es:

Template (@stxt.template): <namespace_objetivo>

El template DEBE contener un nodo Structure en forma de bloque (>>).

Template (@stxt.template): com.example.docs
	Description: Template de ejemplo
	Structure >>
		Document:
			Title: (1)
			Body: (1) TEXT

Reglas:

5. Un template por namespace objetivo

Para cada namespace lógico:

6. Bloque `Structure >>`

El bloque Structure >> define un árbol de plantillas de nodos usando indentación, donde:

6.1 Convención de estilo recomendada

Por legibilidad, se recomienda:

6.2 Sintaxis de una línea de `Structure`

Cada línea del bloque Structure >> tiene la forma:

<NodeName> [<NamespaceOverride>] ":" [<RuleSpec>]

donde:

Ejemplos:

Title:
Title: (1)
Body: (1) TEXT
Color: (?) ENUM [red, green, blue]
Metadata (com.google.html): (0,1)

Notas:

6.3 Reglas de parsing del `Structure >>`

Un parser de templates DEBE:

  1. Leer el bloque Structure >> como una secuencia de líneas (ya canonicalizadas por STXT core: trim derecha por línea).
  2. Ignorar líneas vacías.
  3. Calcular jerarquía por indentación (mismos principios que STXT: indentación consecutiva, sin saltos).
  4. Para cada línea, parsear:
    • Nombre del nodo + namespace opcional (ns) si existe.
    • El carácter : obligatorio.
    • La especificación de reglas opcional (RuleSpec).

Un parser de templates DEBE fallar si una línea no contiene :.

7. Cardinalidades

La cardinalidad se aplica por instancia del nodo padre, contando sólo hijos directos que coincidan por:

La cardinalidad se expresa como un token opcional entre paréntesis: ( ... ).

7.1 Formas permitidas

Formas permitidas:

Forma Significado
num Exactamente num.
* Cualquier número (0..∞).
+ Una o más (1..∞).
? Cero o una (0..1).
num+ num o más (num..∞).
num- Hasta num (0..num).
min,max Entre min y max.

Reglas:

7.2 Cardinalidad por defecto

Si no se especifica cardinalidad, el valor por defecto es:

8. Tipos

Los tipos en templates reutilizan el conjunto de tipos de STXT Schema, con la misma intención: validar forma del valor y, opcionalmente, su contenido.

El tipo se especifica como una palabra tras la cardinalidad (si existe).

Ejemplos:

Fecha: (1) DATE
Cuerpo: (1) TEXT
Es Público: (1) BOOLEAN

8.1 Tipo por defecto

Si se omite el tipo, el tipo por defecto es:

8.2 Compatibilidad con hijos

Un validador conforme DEBE aplicar estas reglas:

8.3 Conjunto de tipos

El conjunto de tipos recomendado es el mismo que STXT-SCHEMA-SPEC.

Un validador de templates:

9. ENUM y lista de valores

Si el tipo es ENUM, el template PUEDE declarar una lista de valores permitidos.

La lista de valores se especifica con corchetes [...] tras el tipo:

ENUM [valor1, valor2, valor3]

Color: (1) ENUM [red, green, blue]

Reglas:

10. Namespaces dentro de `Structure`

Cada línea puede incluir un namespace explícito para el nodo plantilla:

Metadata (com.google.html): (?)

Reglas:

Motivación:

11. Reglas de “nodos definidos”

En templates, un nodo existe si aparece en Structure. A diferencia de Schema, no existe una sección Node: separada; la propia estructura es la definición.

Regla de consistencia recomendada:

12. Compilación a Schema (equivalencia semántica)

Un template puede compilarse a un schema equivalente:

Reglas de traducción de cardinalidad:

13. Errores de Template

Un template es inválido si ocurre cualquiera de estas condiciones:

  1. El documento no tiene raíz Template (@stxt.template): <namespace_objetivo>.
  2. Falta Structure >> o Structure no es bloque >>.
  3. Una línea no vacía dentro de Structure no contiene :.
  4. Cardinalidad mal formada o con números inválidos.
  5. Tipo desconocido (según el conjunto de tipos soportado por el validador).
  6. Uso de [...] si el tipo no es ENUM.
  7. Tipo BLOCK-only con hijos definidos en Structure.
  8. Indentación inválida dentro de Structure (saltos de nivel, etc.).

14. Conformidad

Una implementación de templates es conforme si:

15. Meta-template del propio sistema `@stxt.template`

Esta sección define un template mínimo recomendado para validar documentos del namespace @stxt.template.

Template (@stxt.template): @stxt.template
	Structure >>
		Template: (1)
			Description: (0,1) TEXT
			Structure: (1) BLOCK

Notas:

16. Ejemplos normativos

16.1 Template simple (un namespace)

Template (@stxt.template): com.example.docs
	Description: Plantilla simple
	Structure >>
		Document:
			Title: (1)
			Author: (1)
			Date: (1) DATE
			Body: (1) TEXT

16.2 Template con repetición y nodos anidados

Template (@stxt.template): com.blog.post
	Structure >>
		Post:
			Title: (1)
			Slug: (1)
			Published: (1) BOOLEAN
			Tags: (?)
				Tag: (+)
			Sections: (1)
				Section: (+)
					Heading: (1)
					Content: (1) TEXT

16.3 Template con ENUM

Template (@stxt.template): com.ui.theme
	Structure >>
		Theme:
			Name: (1)
			Mode: (1) ENUM [light, dark]
			Accent: (?) ENUM [blue, green, orange]

16.4 Cross-namespace (referencias externas)

Template (@stxt.template): com.example.docs
	Structure >>
		Document:
			Metadata (com.google.html): (?)
			Content: (1) TEXT

En este caso:

17. Apéndice A — Gramática (informal)

TemplateDoc      = "Template" "(" "@stxt.template" ")" ":" NamespaceTarget { TemplateField }
TemplateField    = DescriptionField | StructureField
DescriptionField = "Description" ":" Text
StructureField   = "Structure" ">>" Newline { StructureLine }

StructureLine    = Indent NodeSpec Newline
NodeSpec         = NodeName [NsOverride] ":" [RuleSpec]
NsOverride       = "(" ["@"] Namespace ")"
RuleSpec         = [Card] [Type] [EnumValues]

Card             = "(" CardToken ")"
CardToken        = "*" | "+" | "?" | Num | Num "+" | Num "-" | Num "," Num
Type             = IdentUpper
EnumValues       = "[" Value { "," Value } "]"

NodeName         = Texto (hasta "(" o ":"), con trim y compactación de espacios
NamespaceTarget  = Namespace según STXT-SPEC
Namespace        = Ident { "." Ident }
Ident            = [a-z0-9]+
IdentUpper       = [A-Z0-9_]+  ; recomendado en mayúsculas (estilo)

18. Fin del Documento