Función @picture para Blogger

Función utilitaria diseñada para generar marcas HTML5 de imágenes adaptables (<picture>) en temas de Blogger de forma nativa. Al segmentar dinámicamente un arreglo de dimensiones en múltiples etiquetas <source> y un fallback <img>, optimiza el rendimiento y la descarga de recursos multimedia según las resoluciones de pantalla o dispositivos del cliente.

Esta función forma parte del proyecto Hamlet. Puedes revisar el código fuente en GitHub.

Definición de la función

<b:includable id='@picture'>
  <b:comment>
  Create a responsive custom picture tag using native Blogger image sizing.
  @author zkreations
  @param {image} src - Image URL or Blogger image object
  @param {number[]} [sourceSet=[700,400]] - Array of widths for the responsive sources
  @param {Number} [width] - Explicit image width for the fallback img
  @param {Number} [height] - Explicit image height for the fallback img
  @param {String} [ratio] - Aspect ratio (e.g., "16:9", "1:1")
  @param {String} [id] - Unique identifier for the img tag
  @param {String} [class] - Additional CSS classes for the img tag
  @param {String} [imgClass] - CSS classes for the fallback img tag
  @param {string} [sizes] - Sizes attribute
  @param {string} [loading] - Loading attribute
  @param {string} [fetchpriority] - Fetch priority attribute
  @param {string} [crossorigin] - Cross-origin attribute
  @param {string} [decoding] - Decoding attribute
  @param {string} [referrerpolicy] - Referrer policy attribute
  @param {string} [alt] - Alt text
  @param {string} [params] - Additional parameters for proxy images
  </b:comment>
  <b:if cond='data:src'>
    <picture>
      <b:class cond='data:class' expr:name='data:class'/>
      <b:with value='data:src.isYoutube
        ? data:src.youtubeMaxResDefaultUrl
        : data:src' var='baseImage'>
        <b:with value='data:sourceSet ?: [700, 400]' var='availableSizes'>
          <b:with value='[
            "com/img/a/",
            "com/blogger_img_proxy"
          ] any (server => server in data:baseImage)' var='isProxyImg'>
            <b:with value='data:params and data:isProxyImg ? ("-" + data:params) : ""' var='params'>
              <b:loop index='i' values='data:availableSizes' var='size'>
                <b:if cond='data:i + 1 != data:availableSizes.length'>
                  <b:with value='resizeImage(data:baseImage, data:size, data:ratio)' var='sourceUrl'>
                    <source expr:media='"(min-width: " + data:size + "px)"' expr:srcset='data:sourceUrl + data:params'/>
                  </b:with>
                </b:if>
              </b:loop>
              <b:with value='data:availableSizes.last ?: 600' var='fallbackSize'>
                <b:with value='resizeImage(data:baseImage, data:fallbackSize, data:data:ratio)' var='fallbackUrl'>
                  <b:tag name='img'>
                    <b:attr name='b:whitespace' value='remove'/>
                    <b:class cond='data:imgClass' expr:name='data:imgClass'/>
                    <b:loop values='["id","sizes","loading","fetchpriority","crossorigin","decoding","referrerpolicy","alt"]' var='attr'>
                      <b:with expr:value='+("data:",data:attr)' var='value'>
                        <b:attr expr:name='data:attr' expr:value='data:value'/>
                      </b:with>
                    </b:loop>
                    <b:attr name='width' expr:value='data:width ?: data:fallbackUrl.width'/>
                    <b:attr name='height' expr:value='data:height ?: data:fallbackUrl.height'/>
                    <b:attr name='src' expr:value='data:fallbackUrl + data:params'/>
                  </b:tag>
                </b:with>
              </b:with>
            </b:with>
          </b:with>
        </b:with>
      </b:with>
    </picture>
  <b:else/>
    <b:comment render='true'>Parameter [src] is required.</b:comment>
  </b:if>
</b:includable>

Especificación de Parámetros

Parámetro Tipo Descripción
src image URL u objeto de imagen. Obligatorio.
sourceSet number[] Anchos para generar las etiquetas <source>. Por defecto [700,400].
width number Ancho del elemento <img>.
height number Alto del elemento <img>.
ratio string Relación de aspecto (Ej: "16:9", "1:1").
id string Valor del atributo id del <img>.
class string Clases CSS del elemento <picture>.
imgClass string Clases CSS del elemento <img>.
sizes string Valor del atributo sizes.
loading string Modo de carga (Ej: "lazy", "eager").
fetchpriority string Prioridad de descarga.
crossorigin string Modo CORS de la petición.
decoding string Método de decodificación.
referrerpolicy string Política de referencias.
alt string Texto alternativo.
params string Parámetros adicionales del proxy.

Modo de uso

Para implementar esta función, añade el fragmento en los marcados predeterminados (<b:defaultmarkups type='Common'>) de tu tema.

src

Determina la dirección o el objeto nativo multimedia. La función valida de manera automática si proviene de un flujo de YouTube para resolver la miniatura de alta resolución (maxresdefault).

<b:include data='{ src: data:view.featuredImage }' name='@picture'/>
<picture>
  <source media='(min-width: 700px)' srcset='/w700/demo.png'/>
  <img width='400' height='225' src='/w400/demo.png'/>
</picture>

sourceSet

Arreglo numérico para generar los quiebres de pantalla (breakpoints) del elemento. El último valor de la colección actuará como dimensión para la etiqueta de respaldo.

<b:include data='{ src: data:view.featuredImage, sourceSet: [600, 300] }' name='@picture'/>
<picture>
  <source media='(min-width: 600px)' srcset='/w600/demo.png'/>
  <img width='300' height='168' src='/w300/demo.png'/>
</picture>

width

Establece un ancho fijo numérico o porcentual para la etiqueta HTML final.

<b:include data='{ src: data:view.featuredImage, width: 500 }' name='@picture'/>
<picture>
  <source media='(min-width: 700px)' srcset='/w700/demo.png'/>
  <img width='500' src='/w400/demo.png'/>
</picture>

height

Establece una altura fija numérica o porcentual para la etiqueta HTML final.

<b:include data='{ src: data:view.featuredImage, height: 300 }' name='@picture'/>
<picture>
  <source media='(min-width: 700px)' srcset='/w700/demo.png'/>
  <img height='300' src='/w400/demo.png'/>
</picture>

ratio

Modifica estructuralmente las proporciones de las URLs generadas, aplicando relaciones fijas y calculando las alturas nativas en el árbol HTML final.

<b:include data='{ src: data:view.featuredImage, ratio: "1:1" }' name='@picture'/>
<picture>
  <source media='(min-width: 700px)' srcset='/w700-c/demo.png'/>
  <img width='400' height='400' src='/w400-c/demo.png'/>
</picture>

id

Inyecta un identificador único de control exclusivo para la etiqueta de imagen interna de la función.

<b:include data='{ src: data:view.featuredImage, id: "lead-image" }' name='@picture'/>
<picture><img id='lead-image' src='/w400/demo.png'/></picture>

class

Aplica nombres de estilo CSS directamente sobre la envoltura HTML principal (<picture>).

<b:include data='{ src: data:view.featuredImage, class: "responsive-wrapper" }' name='@picture'/>
<picture class='responsive-wrapper'><img src='/w400/demo.png'/></picture>

imgClass

Aplica selectores o clases útiles sobre la etiqueta de renderizado final de la imagen.

<b:include data='{ src: data:view.featuredImage, imgClass: "img-fluid object-cover" }' name='@picture'/>
<picture><img class='img-fluid object-cover' src='/w400/demo.png'/></picture>

sizes

Añade directrices explícitas para indicar al intérprete cómo responder frente a distribuciones y retículas complejas.

<b:include data='{ src: data:view.featuredImage, sizes: "(max-width: 768px) 100vw, 700px" }' name='@picture'/>
<picture><img sizes='(max-width: 768px) 100vw, 700px' src='/w400/demo.png'/></picture>

loading

Especifica el comportamiento y retraso de la descarga del elemento multimedia nativo en el navegador. Valores: "lazy" | "eager".

<b:include data='{ src: data:view.featuredImage, loading: "lazy" }' name='@picture'/>
<picture><img loading='lazy' src='/w400/demo.png'/></picture>

fetchpriority

Configura la importancia de descarga del nodo con respecto al resto de peticiones críticas de la página activa.

<b:include data='{ src: data:view.featuredImage, fetchpriority: "high" }' name='@picture'/>
<picture><img fetchpriority='high' src='/w400/demo.png'/></picture>

crossorigin

Establece directrices de seguridad CORS aplicadas al recurso multimedia en implementaciones avanzadas externas.

<b:include data='{ src: data:view.featuredImage, crossorigin: "anonymous" }' name='@picture'/>
<picture><img crossorigin='anonymous' src='/w400/demo.png'/></picture>

decoding

Le provee un indicio analítico al hilo del navegador para indicar si procesar el renderizado de forma asíncrona.

<b:include data='{ src: data:view.featuredImage, decoding: "async" }' name='@picture'/>
<picture><img decoding='async' src='/w400/demo.png'/></picture>

referrerpolicy

Define la configuración de las cabeceras de procedencia al invocar la dirección IP o dominio del servidor de almacenamiento remoto.

<b:include data='{ src: data:view.featuredImage, referrerpolicy: "no-referrer" }' name='@picture'/>
<picture><img referrerpolicy='no-referrer' src='/w400/demo.png'/></picture>

alt

Establece de manera explícita la cadena de texto destinada a describir la composición para lectores de pantalla y crawlers indexadores.

<b:include data='{ src: data:view.featuredImage, alt: "Imagen adaptable de muestra" }' name='@picture'/>
<picture><img alt='Imagen adaptable de muestra' src='/w400/demo.png'/></picture>

params

Añade flags específicos extras para las imágenes alojadas en los servidores nuevos de Blogger (WebP, compresión, etc.). Detalles completos en el artículo de parámetros adicionales.

<b:include data='{ src: data:view.featuredImage, params: "rw-e30" }' name='@picture'/>
<picture>
  <source media='(min-width: 700px)' srcset='/w700-rw-e30/demo.png'/>
  <img src='/w400-rw-e30/demo.png'/>
</picture>