Toda la documentación

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.

De un vistazo
  • 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

SintaxisQué 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:

VariableContiene
contentLa página o la entrada del blog: content.absolute_url, content.name, content.publish_date …
page_meta.html_title, page_meta.meta_descriptionEl título y la meta descripción de la configuración de la página.
requestLa solicitud: request.path, request.domain, request.query_dict (la cadena de consulta como diccionario).
local_dtLa fecha y la hora actuales, en la zona horaria de la cuenta.
themeLa configuración del tema, de su fields.json: theme.colors.primary.color, etc., según los nombres que use tu tema.
moduleDentro de un módulo: los valores de sus campos, module.heading, module.image.src …
contactLas propiedades de contacto del visitante conocido, para personalizar: contact.firstname.
is_in_editorVerdadero mientras la página está abierta en el editor de HubSpot.
Mantén las páginas rápidas. 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 de if.
  • 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.

FiltroEjemploResultado
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_urlalt="{{ 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ónQué 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

EtiquetaQué 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 campoHubL
Texto, texto enriquecido{{ module.heading }}, {{ module.text }}
Imagenmodule.image.src, .alt, .width, .height
Enlacemodule.link.url.href, module.link.open_in_new_tab
Colormodule.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_text y inline_rich_text hacen que un campo se pueda editar directamente en la página, dentro del editor.
  • module.css casi no admite HubL (solo funciones auxiliares como module_asset_url) y no puede leer los valores de los campos; module.js no admite nada. Para usar el valor de un campo, coloca un bloque {% require_css %} en module.html.
  • Un color elegido en un campo e impreso en un style="" en línea tiene prioridad sobre el CSS del módulo: revisa primero module.html cuando 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=true a 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.

Diseña tu web hoy y lánzala mañana.

En transjt, cada segundo cuenta. Por eso nuestra misión es sencilla: ahorrarte tiempo y eliminar fricciones de tu flujo de trabajo.