JSPM

eleventy-plugin-time-to-read

1.3.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 308
  • Score
    100M100P100Q94126F
  • License MPL-2.0

11ty plugin for estimating the time to read a given text. Supports multiple languages

Package Exports

  • eleventy-plugin-time-to-read
  • eleventy-plugin-time-to-read/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (eleventy-plugin-time-to-read) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Time To Read

An 11ty plugin that approximates how long it would take a user to read a given text and outputs the result in your choice of language and format.

1 minute
3 minutes
3 minutes, 10 seconds
3 minutes and 10 seconds
3 min & 10 sec
3m, 10s
3m 10s
3 minuty i 10 sekund
३ मिनट और १० सेकंड
三分钟和一〇秒钟
🕒🕒🕒 3 minutes to read

Installation

npm install eleventy-plugin-time-to-read

Usage

In your Eleventy config file (.eleventy.js by default):

const timeToRead = require('eleventy-plugin-time-to-read');

module.exports = function(eleventyConfig) {
  eleventyConfig.addPlugin(timeToRead);
}

Then, depending on your template engine (Liquid by default) insert the filter into your template:

// Liquid (.liquid) or Nunjucks (.njk):
It will take {{ 'text' | timeToRead }} to read this

// Handlebars (.hbs):
It will take {{ timeToRead 'text' }} to read this

// Javascript (.11ty.js):
It will take ${this.timeToRead('text')} to read this

// Output:
It will take 1 minute to read this

Configuration

const timeToRead = require('eleventy-plugin-time-to-read');

module.exports = function(eleventyConfig) {
  eleventyConfig.addPlugin(timeToRead, {
    speed: '1000 characters per minute',
    language: 'en',
    style: 'long',
    type: 'unit',
    hours: 'auto',
    minutes: true,
    seconds: false,
    digits: 1,
    output: function(data) {
      return data.timing;
    }
  });
}

Speed

  • Default: '1000 characters per minute'
  • Accepts: A String formatted as: Number 'characters'/'words' [optional preposition] 'hour'/'minute'/'second'

The speed to calculate the time to read with. E.g. '250 words a minute', '5 words per second'.

Can also be entered when using a filter:

{{ content | timeToRead: '220 words a minute' }} // Liquid

{{ content | timeToRead ('220 words a minute') }} // Nunjucks

{{ timeToRead content '220 words a minute' }} // Handlebars

${this.timeToRead(data.content, '220 words a minute')} // JavaScript

Language

The language to use when outputting reading times. For example:

  • fr = French
  • es = Spanish
  • ru = Russian
  • zh-hans = Simplified Chinese

Number scripts can be changed using '-u-nu-', for example:

  • en = 3 minutes
  • zh = 3分钟
  • zh-u-nu-hanidec = 三分钟
  • en-u-nu-hanidec = 三 minutes
  • hi-u-nu-deva = ३ मिनट

Can also be entered when using a filter:

{{ content | timeToRead: 'zh-hans' }} // Liquid

{{ content | timeToRead ('zh-hans') }} // Nunjucks

{{ timeToRead content 'zh-hans' }} // Handlebars

${this.timeToRead(data.content, 'zh-hans')} // JavaScript

Style

  • Default: 'long'
  • Accepts: 'narrow', 'short' or 'long'

The style of the text and conjunction, for example:

  • long = 3 minutes and 10 seconds
  • short = 3 min & 10 sec
  • narrow = 3m, 10s

The exact output depends on the language and type options.

Type

  • Default: 'unit'
  • Accepts: 'unit' or 'conjunction'

The type of connection between list items, for example:

  • unit = 3 minutes, 10 seconds
  • conjunction = 3 minutes and 10 seconds

The exact output depends on the language and style options.

Hours

  • Default: 'auto'
  • Accepts: Boolean or 'auto'

Whether to show (true) or hide (false) hours. 'auto' will only display hours when they are greater than zero.

Minutes

  • Default: 'true'
  • Accepts: Boolean or 'auto'

Whether to show (true) or hide (false) minutes. 'auto' will only display minutes when they are greater than zero.

Seconds

  • Default: 'false'
  • Accepts: Boolean or 'auto'

Whether to show (true) or hide (false) seconds. 'auto' will only display seconds when they are greater than zero.

Digits

  • Default: 1
  • Accepts: An integer between 1 and 21 inclusive

The minimum number of digits to display. Will pad with 0 if not met, for example:

  • 1 = 3 minutes, 10 seconds
  • 2 = 03 minutes, 10 seconds
  • 3 = 003 minutes, 010 seconds

Output

  • Default: function(data) { return data.timing; }
  • Accepts: Function

Controls the output of Time To Read via a callback function's return value. Will be passed an object with the following keys:

  • timing - [String] the computed reading time, for example: '3 minutes, 10 seconds'
  • hours - [Number|Null] the number of hours required to read the given text (if applicable)
  • minutes - [Number|Null] the number of minutes required to read the given text after hours have been deducted (if applicable)
  • seconds - [Number|Null] the number of seconds required to read the given text after hours and minutes have been deducted (if applicable)
  • totalCharacters - [Number] the amount of characters in the given text
  • totalWords - [Number] the amount of words in the given text
  • totalSeconds - [Number] the number of seconds required to read the given text
  • speed - [Object] The parsed data from the speed option. Has the following keys:
    • measure - [String] 'character' or 'word'
    • interval - [String] 'hour', 'minute' or 'second'
    • amount - [Number] the amount of measures per interval
  • language - [String] returns the string passed to the language option

Can be used to customise text, for example:

function (data) {
  const numberOfEmoji = Math.max(1, Math.round(data.totalSeconds / 60));
  const emojiString = '🕒'.repeat(numberOfEmoji);

  return `${emojiString} ${data.timing} to read`; // 🕒🕒🕒 3 minutes to read
}

Example

How to create a blog page listing all posts with their reading times as well as include the reading time within those posts.

File structure:

_includes
└─ post.liquid
blog
└─ post.md
blog.html
.eleventy.js

_includes/post.liquid

<header>
  <h1>{{ title }}</h1>
  <p>About {{ content | timeToRead }} to read</p>
</header>

<main>
{{ content }}
</main>

blog/post.md

---
layout: post.liquid
title: Lorem Ipsum
tags: blogPost
---
Lorem ipsum dolor sit…

blog.html

<h1>Blog</h1>

<ul>
  {%- for post in collections.blogPost %}
    <li>
      <h2><a href="{{ post.url }}">{{ post.data.title }}</a></h2>
      <p>{{ post.templateContent | timeToRead }}</p>
    </li>
  {%- endfor %}
</ul>

.eleventy.js

const timeToRead = require('eleventy-plugin-time-to-read');

module.exports = function(eleventyConfig) {
    eleventyConfig.addPlugin(timeToRead);
}

Licence

MPL-2.0