DocumentaciónHubSpotGuía rápida de HubL
Guía rápida de HubL
El HubSpot Markup Language en una página: la sintaxis, los filtros, las funciones y las etiquetas que más usas, y cómo funcionan los campos de los módulos, cada uno con un ejemplo.
- HubL es el HubSpot Markup Language: el lenguaje de plantillas de los temas, módulos, parciales y correos electrónicos de HubSpot CMS.
- Se basa en Jinjava, la versión en Java de Jinja creada por HubSpot, así que la mayoría de lo que haces en Jinja te sigue sirviendo.
- HubSpot lo renderiza en el servidor; los visitantes solo ven el HTML terminado.
- transjt escribe el HubL por ti: cada módulo exportado viene con sus campos ya conectados. Esta guía es para los momentos en que quieras ajustarlo.
Delimitadores
| Sintaxis | Qué hace |
|---|---|
{{ ... }} | Imprime una expresión: una variable, un campo, el resultado de una función. |
{% ... %} | Una instrucción o etiqueta: if, for, set, module, include … |
{# ... #} | Un comentario. Nunca llega a la página. |
{%- ... -%} | Control de espacios en blanco: el guion elimina los espacios en blanco antes o después de la etiqueta. |
{# A module's heading field #}
<h1>{{ module.heading }}</h1>
Variables
Define las tuyas con set. Las cadenas, los números, los booleanos, las listas y los diccionarios funcionan como en Jinja:
{% set title = "Pricing" %}
{% set sizes = [480, 960, 1440] %}
{% set button = {"label": "Start free", "url": "/start/"} %}
{{ title ~ " | transjt" }} {# ~ joins strings #}
{{ sizes[0] }} {# 480 #}
{{ button.label }} {# or button["label"] #}
{% do sizes.append(1920) %} {# change a list in place #}
HubSpot pone estas variables a tu disposición en todas las páginas:
| Variable | Contiene |
|---|---|
content | La página o la entrada del blog: content.absolute_url, content.name, content.publish_date … |
page_meta.html_title, page_meta.meta_description | El título y la meta descripción de la configuración de la página. |
request | La solicitud: request.path, request.domain, request.query_dict (la cadena de consulta como diccionario). |
local_dt | La fecha y la hora actuales, en la zona horaria de la cuenta. |
theme | La configuración del tema, de su fields.json: theme.colors.primary.color, etc., según los nombres que use tu tema. |
module | Dentro de un módulo: los valores de sus campos, module.heading, module.image.src … |
contact | Las propiedades de contacto del visitante conocido, para personalizar: contact.firstname. |
is_in_editor | Verdadero mientras la página está abierta en el editor de HubSpot. |
contact, local_dt, request.query_dict y today() cambian con cada visita, así que HubSpot no puede servir por completo desde su caché prerrenderizada una página que los use. Úsalos solo donde los necesites.If y for
{% if module.items %}
<ul>
{% for item in module.items %}
<li class="{{ 'is-first' if loop.first else '' }}">{{ loop.index }}. {{ item.title }}</li>
{% endfor %}
</ul>
{% elif is_in_editor %}
<p>Add an item in the sidebar.</p>
{% else %}
{# Nothing to show on the live page #}
{% endif %}
- En un bucle:
loop.index(desde 1),loop.index0(desde 0),loop.first,loop.last,loop.length. {% unless condition %} … {% endunless %}es lo contrario deif.- Los tests se leen como frases en inglés:
{% if module.subtitle is defined %},is string,is number,is even,is divisibleby 3. - Operadores:
==,!=,and,or,not,in.
Filtros
Un filtro modifica un valor tras una barra vertical, {{ value|filter }}, y los filtros se encadenan de izquierda a derecha.
| Filtro | Ejemplo | Resultado |
|---|---|---|
default | {{ module.label|default("Read more", true) }} | Un valor alternativo cuando falta el valor; con true, también cuando está vacío |
upper, lower, capitalize, title | {{ "hubl"|upper }} | HUBL |
truncate | {{ text|truncate(120) }} | Recortado a 120 caracteres en un límite de palabra, seguido de «...» |
truncatehtml | {{ module.text|truncatehtml(200) }} | Acorta el texto enriquecido y mantiene sus etiquetas cerradas |
striptags | {{ module.text|striptags }} | Texto plano, sin el HTML |
escape_html, escape_attr, escape_url | alt="{{ module.alt|escape_attr }}" | Salida segura en texto HTML, atributos y URL |
replace | {{ "a-b"|replace("-", " ") }} | a b |
split, join | {{ "a,b"|split(",")|join(" · ") }} | a · b |
length | {{ module.items|length }} | El número de elementos |
sort | {{ posts|sort(False, False, "name") }} | Ordenado por un atributo (orden inverso, distinción entre mayúsculas y minúsculas, atributo) |
selectattr, map | {{ items|selectattr("featured")|map("title")|join(", ") }} | Los títulos de los elementos destacados |
format_datetime | {{ content.publish_date|format_datetime("medium", "Europe/Berlin") }} | Una fecha y hora con formato, en esa zona horaria (UTC si no indicas ninguna) |
int, float, round | {{ "3.7"|float|round }} | 4 |
tojson | {{ module|tojson }} | El valor como JSON, para un script |
pprint | {{ module|pprint }} | Imprime un valor con su tipo, para depurar |
Funciones
| Función | Qué hace |
|---|---|
get_asset_url("../css/main.css") | La URL pública de un archivo de tu tema. |
require_css(url), require_js(url) | Carga una hoja de estilos en el head o un script antes de la etiqueta de cierre del body, una sola vez por página, por muchas veces que se llame. |
resize_image_url(url, 800) | Una copia redimensionada de una imagen del File Manager, de 800 píxeles de ancho. |
menu("main") | Un menú de navegación por nombre o ID, con sus elementos hijos, para tu propio marcado. |
blog_recent_posts("default", 3) | Las tres entradas más recientes del blog predeterminado. |
blog_popular_posts("default", 5) | Las cinco entradas más leídas del último año, actualizadas cada seis horas. |
hubdb_table_rows(table, "orderBy=name&limit=10") | Filas de una tabla de HubDB, filtradas y ordenadas mediante una cadena de consulta (Content Hub Professional o Enterprise). |
color_variant("#FF00F4", -40) | Un color más claro (valor positivo) o más oscuro (valor negativo). |
today(), unixtimestamp(local_dt) | La fecha de hoy; una fecha como marca de tiempo Unix en milisegundos. |
{% for post in blog_recent_posts("default", 3) %}
<a href="{{ post.absolute_url }}">{{ post.name }}</a>
{% endfor %}
Etiquetas
| Etiqueta | Qué hace |
|---|---|
{% module "hero" path="../modules/hero" %} | Coloca un módulo en una posición fija de una plantilla. |
{% dnd_area "main" %} … {% end_dnd_area %} | Un área de arrastrar y soltar que los editores rellenan en el editor de páginas, con dnd_section, dnd_row, dnd_column y dnd_module dentro. |
{% include "../partials/footer.html" %} | Inserta otro archivo. |
{% global_partial path="../partials/header.html" %} | Un parcial que se edita una vez y que comparten todas las páginas. |
{% extends "./layouts/base.html" %} con {% block body %} | Herencia de plantillas: una página rellena los bloques de su plantilla base. |
{% macro button(label, url) %} | Un fragmento reutilizable con parámetros, que se comparte con {% from "/my-theme/macros.html" import button %} (la ruta del archivo en el Design Manager). |
{% require_css %} … {% end_require_css %} | Un bloque <style> que se traslada al head, donde puede usar HubL. A diferencia de la función, se añade cada vez. |
{% raw %} … {% endraw %} | Imprime su contenido tal cual, sin ejecutar el HubL que contenga. |
Toda plantilla de página necesita {{ standard_header_includes }} antes de la etiqueta de cierre </head> y {{ standard_footer_includes }} antes de la etiqueta de cierre </body>: cargan los scripts, los estilos y el seguimiento propios de HubSpot.
<!--
templateType: page
isAvailableForNewContent: true
label: Landing page
-->
{% extends "./layouts/base.html" %}
{% block body %}
{% dnd_area "main" label="Main" %}
{% dnd_section %}
{% dnd_column %}
{% dnd_row %}
{% dnd_module path="@hubspot/rich_text" %}{% end_dnd_module %}
{% end_dnd_row %}
{% end_dnd_column %}
{% end_dnd_section %}
{% end_dnd_area %}
{% endblock %}
Módulos y campos
Un módulo es una carpeta que termina en .module y contiene module.html (HubL), module.css, module.js, fields.json y meta.json. En module.html, cada campo es module. más su nombre:
| Tipo de campo | HubL |
|---|---|
| Texto, texto enriquecido | {{ module.heading }}, {{ module.text }} |
| Imagen | module.image.src, .alt, .width, .height |
| Enlace | module.link.url.href, module.link.open_in_new_tab |
| Color | module.color.color, module.color.opacity |
| Opción, booleano | {{ module.style }}, {% if module.show_button %} |
Repetidor (un campo con occurrence) | {% for item in module.items %} |
{% set img = module.image %}
<section class="hero hero--{{ name }}">
{% inline_text field="heading" value="{{ module.heading }}" %}
{% if img.src %}
<img src="{{ img.src }}" alt="{{ img.alt|escape_attr }}" width="{{ img.width }}" height="{{ img.height }}" loading="lazy">
{% endif %}
</section>
{{ name }}es el nombre único de la instancia del módulo: úsalo para limitar el CSS a una sola instancia.inline_textyinline_rich_texthacen que un campo se pueda editar directamente en la página, dentro del editor.module.csscasi no admite HubL (solo funciones auxiliares comomodule_asset_url) y no puede leer los valores de los campos;module.jsno admite nada. Para usar el valor de un campo, coloca un bloque{% require_css %}enmodule.html.- Un color elegido en un campo e impreso en un
style=""en línea tiene prioridad sobre el CSS del módulo: revisa primeromodule.htmlcuando un estilo no cambie.
Depuración
{{ module|pprint }}imprime un valor con su tipo, directamente en la página. Quítalo antes de publicar.- Añade
?hsDebug=truea la URL de una página publicada: su CSS y su JavaScript se cargan sin minificar ni combinar, nada sale de la caché, y al final del código fuente de la página aparecen los errores y avisos de HubL, el tiempo de renderizado y si la página se puede prerrenderizar. - El Design Manager marca los errores de HubL en el archivo mientras editas. Con la CLI de HubSpot,
hs cms lint <path>revisa los archivos, y las subidas informan de los errores fatales en la terminal. - HubSpot vuelve a renderizar por sí solo las páginas que usan un módulo o una plantilla actualizados, lo que puede tardar unos minutos. Si una página publicada sigue mostrando la versión anterior, vuelve a publicarla.
HubL en los temas de transjt
Cuando exportas un diseño o un build de IA, transjt escribe el tema por ti: plantillas con áreas de arrastrar y soltar, y un módulo por sección con sus textos, imágenes, enlaces y colores como campos. Tu equipo de marketing edita esos campos en el editor de páginas; nadie tiene que escribir HubL.
Para ajustar un tema por tu cuenta, guarda tu propio CSS y JavaScript en custom.css y custom.js: se conservan cuando vuelves a exportar. Consulta Para desarrolladores de HubSpot y Usar tu tema en HubSpot.
La referencia completa de HubL está en la documentación para desarrolladores de HubSpot.