Mostrar tiempo de lectura en tus publicaciones Blogger

En este artículo te enseño cómo mostrar el tiempo de lectura de tus publicaciones en Blogger usando su API con JavaScript.

Reloj colgado en la pared

Una buena experiencia de usuario garantiza que tu contenido sea leído y considerado. Por ello, ofrecer una estimación del tiempo necesario para leer un artículo podría ser una excelente idea.

Muchos servicios de blogs como medium implementan esta funcionalidad, pero en este articulo veremos cómo crearlo en Blogger, así que vamos a ello.

El Concepto

Lo primero que tenemos que analizar es ¿cómo se calcula el tiempo de lectura?. Bueno, es bastante simple: primero tenemos que calcular el total de palabras. Después de eso, sólo tenemos que dividir esa cantidad entre el ppm (palabras por minuto).

Hasta ahora, todo parece sencillo. El problema surge al calcular las palabras fuera del artículo. Aunque Blogger nos provee una etiqueta que contiene todo el post: <data:post.body/>, ésta se debe interpretar. Por lo tanto, debemos cargar todo el contenido para luego manipularlo con JavaScript.

let post = `<data:post.body/>`;

Blogger API

La segunda opción que exploré fue usar los feeds. Logré hacerlo funcionar, pero añadía complejidad extra debido a la necesidad de paginación para entradas antiguas. Además, el método era poco ortodoxo y complicado.

Finalmente, recordé que Blogger dispone de una alternativa para acceder a los datos de un blog: su API. Me dediqué a estudiarla y adaptar el código para utilizarla correctamente.

Antes de continuar, asegúrate de obtener tu clave API para usar el plugin de manera adecuada.

El Algoritmo

Como mencioné al principio, no es tarea complicada estimar el tiempo que tomaría leer cierta cantidad de palabras. Así que empecemos.

Primero, definamos la función con 2 parámetros: el ID de nuestro blog y el ID del post en sí. ¿Por qué? La API de Blogger permite hacer peticiones específicas a diferentes partes de un blog, pero para guiarse necesita varios identificadores. También agregaremos nuestra clave API a la función para realizar las peticiones correctamente.

Ver codigo
function readTime(blogId, postId) {

   const apiKey = 'PEGA TU KEY AQUÍ',
      apiUrl = 'https://www.googleapis.com/blogger/v3/blogs/';

   // Hacemos la petición al post mediante el ID
   fetch(`${apiUrl}${blogId}/posts/${postId}?key=${apiKey}`)
      .then(res => res.json())
      .then(post => {

         /**
          * Reemplazamos las etiquetas HTML y 
          * guardamos en un array las palabras
          */
         let p = post.content.replace(/<[^>]*>?/g, '').split(' ');

         /**
          * Dividimos las palabras entre 200
          * que es el ppm promedio y redondeamos
          * el resultado
          */
         p = Math.round(p.length / 200);

         /**
          * Finalmente al elemento con el mismo ID
          * del post, le agregamos el calculo
          */
         document.getElementById(postId)
            .textContent = p < 2 ? ' menos de 1 min' : ' ' + p + ' min';
      })
      .catch(err => console.log(err))
}

¡Ya está! Lo único que falta es llamar a la función. Para ello, debemos ubicarnos en la plantilla de nuestro blog.

Tenemos que situarnos justo en la parte donde se produce el bucle de las entradas de Blogger y llamar a nuestro código para que se ejecute por cada entrada que se vaya a mostrar.

Así que busca esta linea <b:loop values='data:posts' var='post'> y debajo de ella pega el siguiente código:

<span expr:id='data:post.id' class='read-time' title='Calculado con promedio de 200 palabras por minuto'>
   <script>
      readTime('<data:blog.blogId/>', '<data:post.id/>');
   </script>
</span>

En el caso de que quieras posicionarlo encima o debajo del titulo, primero tendrías que ubicar la etiqueta correspondiente: <data:post.title/>.

Estilos

Lo último que tenemos por hacer, es que se vea bien ¿cierto?, por ello usé el atributo class en el plugin. Así que sólo es cuestión de usar un poco de CSS.

.read-time {
   color: white;
   background: steelblue;
   padding: .2rem .5rem;
}

Puedes usar más estilos si lo prefieres o añadirle un icono personalizado. Todo queda a la creatividad.

← Soyez le premier →