hexo-generator-readtime
Version:
HEXO package that provides analytics on the read time to review a post. Generates word, character, image, video, and codeblock counts in the front-matter of the markdown file. Plus provides read-time estimates for given language profile. Supports 48 langu
228 lines (196 loc) • 9.55 kB
Markdown
[](https://www.npmjs.com/package/hexo)


[](https://github.com/AsemAlhaidary/hexo-generator-readtime)
[](https://www.npmjs.com/package/hexo-generator-readtime)
# hexo-generator-readtime
[HEXO](https://github.com/hexojs/hexo) package that provides analytics on the read time to review the post. *Supports 48 languages!* Can add or override langProfile defaults.
## Install
``` bash
$ npm install hexo-generator-readtime
```
📝 When `defaultTime` is set to "`auto`," it will calculate the fuzzy time based on the least "count" time for `fuzzyTime.time_unit`. Example: 578sec becomes "about 10 minutes".
If you define `defaultTime` as "seconds", "minutes", etc., the time returned is more precise whereas "auto" will provide a very rough estimation.
## How to use
After you have installed this plugin, it will run anytime you run `hexo server` or `hexo generate`.
readTime will read the `lang` value in your front-matter to select the correct language profile. If this value is missing, it will attempt to read the `_config.yml` setting. If both of these are missing, then it will default to `en` (English).
It updates the front-matter of your posts to include the analytics data. The following parameters are added:
| parameter | description |
| --- | --- |
| *readTime* | String that represents the estimated time to read the article. Printed in the detected language's native text. |
| *imgCount* | Count of images found in the file. |
| *vidCount* | Count of videos detected in the file. |
| *wordCount* | Count of words in the file. This works very well for non-Asian languages. Some languages don't employ the space character as a word boundary. For Asian languages such as Chinese, Korean, Japanese, and Vietnamese, another method is required to create word tokens. |
| *wsCount* | Count of white-space characters detected in the file. This is only useful for non-Asian languages. |
| *charCount* | Letters detected for the given language in the file. |
| *cbCount* | Count of code blocks in the file. |
👉🏻 Note: it only reads the posts from the `/source/_posts/` folder. You can reference these values in your EJS template files from the object `post`. For example: `<%= post.readTime %>`. This plugin updates both in-memory `post` object and the markdown file.
## Parameter definitions
Below are the definitions for each parameter and expected values.
```yml
readtime: ## plugin config. Only define this if you need to override the built-in settings.
defaultTime: auto ## Time unit used for calculating read time. Options: auto | seconds | minutes | days | months | years
imgReadTime: 12 ## Time user may spend watching an image in *seconds*.
vidReadTime: 60 ## Time user may spend watching a video in *seconds*.
langProfile: ## profile of the language
"{your lang}": ## ISO-639-1 string is expected here. However, you can specify your custom language code here.
name: "My Lang" ## name of your custom language as written in English
nativeName: "myLanguage" ## name of your custom language as written in the language's native text
family: "Earth-Moon" ## origins of the language.
region: ["Earth", "Moon"] ## regions where this language is used
unicodeRange: ["\u0021-\u007E"] ## array of unicode values that represent the language's native text. See https://www.unicode.org/charts/
charPerMin: 999 ## Number of characters user could read in one *minute*
wordsPerMin: 333 ## Number of **words** user could read in one *minute*
fuzzyTime: ## string object for representations of how time units are written
pattern: %(time_unit)s %(count)d%(approx)s ## sprintf() string pattern for how to write the text
approx: apx ## text to represent approximate time as a word. If no such word exist, use `""` a closed string as the value
time_unit: ## string object to define how each time unit is written in the language's native text
second: sec
seconds: secs
minute: min
minutes: mins
hour: h
hours: h
day: d
days: d
month: m
months: m
year: y
years: y
### some languages are recommended to encapsulate the values within double-quote (") marks.
```
## Options
*Note: this is completely **optional** as the plugin already has several languages predefined.*
You can configure plugin overrides in your root `_config.yml`. For example:
``` yaml
readtime:
defaultTime: seconds
imgReadTime: 12
langProfile:
ar:
name: "Arabic"
nativeName: "العربية"
family: "Afro-Asiatic"
region: ["Middle East", "North Africa"]
unicodeRange: ["\u0021-\u007E", "\u0600-\u06FF", "\u0750-\u077F", "\u0870-\u089F" "\u08A0-\u08FF", "\uFB50-\uFDFF", "\uFE70-\uFEFF"]
charPerMin: 612
wordsPerMin: 138
fuzzyTime:
pattern: %(time_unit)s %(count)d %(approx)s
approx: حوالي
time_unit:
second: ثانية
seconds: ثواني
minute: دقيقة
minutes: دقائق
hour: ساعة
hours: ساعات
day: يوم
days: أيام
month: شهر
months: شهور
year: سنة
years: سنوات
en:
name: "English"
unicodeRange: ["a-zA-Z0-9"]
charPerMin: 987
wordsPerMin: 228
fuzzyTime:
pattern: %(approx)s %(count)d %(time_unit)s
approx: "About"
time_unit:
second: "second"
seconds: "seconds"
minute: "minute"
minutes: "minutes"
hour: "hour"
hours: "hours"
day: "day"
days: "days"
month: "month"
months: "months"
year: "year"
years: "years"
jp:
charPerMin: 357
wordsPerMin: 193
zh:
charPerMin: 255
wordsPerMin: 158
```
## Custom Language
You can add a custom language in your root `_config.yml` file.
``` yaml
readtime:
langProfile:
"my-lang":
charPerMin: 1500
wordsPerMin: 300
fuzzyTime:
pattern: %(approx)s %(count)d%(time_unit)s
approx: "appx"
time_unit:
second: "sec"
minute: "min"
```
## List of supported languages
| Language | native text | [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) code |
| --- | --- | --- |
| Arabic | العربية | ar |
| Bengali | বাংলা | bn |
| German | Deutsch | de |
| **English** | English | en |
| Greek | Ελληνικά | el |
| Spanish | Español | es |
| Persian (Farsi) | فارسی | fa |
| Finnish | suomi | fi |
| French | Français | fr |
| Gujarati | ગુજરાતી | gu |
| Hebrew | עִבְרִית | he |
| Hindi | हिन्दी | hi |
| Armenian | հայերեն | hy |
| Italian | Italiano | it |
| Jin | 晋语 | jin |
| Japanese | 日本語 | ja |
| Javanese | Basa Jawa | jv |
| Georgian | ქართული | ka |
| Korean | 한국어 | ko |
| Latin | Latīna | la |
| Dutch | Nederlands | nl |
| Punjabi | ਪੰਜਾਬੀ | pa |
| Polish | polski | pl |
| Pashto | پښتو | ps |
| Portuguese | Português | pt |
| Southern Min (Hokkien, Teochew) | 閩南語 (福建話, 潮州話) | nan |
| Norwegian Norsk | Bokmål | nb |
| Norwegian Nynorsk | nynorsk | nn |
| Marathi | मराठी | mr |
| Russian | Русский | ru |
| Sinhala | සිංහල | si |
| Slovenian | slovenščina | sl |
| Swedish | Svenska | sv |
| Tamil | தமிழ் | ta |
| Telugu | తెలుగు | te |
| Thai | ไทย | th |
| Turkish | Türkçe | tr |
| Vietnamese | Tiếng Việt | vi |
| Urdu | اردو | ur |
| Yue Chinese | 粤语 | yue |
| Wu (including Shanghainese) | 吴语 (含上海话) | wuu |
| Chinese (Mandarin) | 中文 (普通话) | zh-CN |
| Chinese (Simplified) | 中文 (简体) | zh-Hans |
| Chinese (Traditional) | 中文 (繁體) | zh-Hant |
| Chinese (Hong Kong) | 中文 (香港) | zh-HK |
| Chinese (Cantonese, Macau) | 中文 (廣東話, 澳門) | zh-MO |
| Chinese (Singapore) | 中文 (普通话) | zh-SG |
| Chinese (Taiwan) | 中文 (繁體中文) | zh-TW |
| Chinese | 中文 (简体) | zh |
## Don't see your language here?
Please submit an issue to [request your language](https://github.com/AsemAlhaidary/hexo-generator-readtime/issues/new/choose) to be added. It helps if you can suggest the profile details too. Otherwise, I need to research it and that can take time.
You can also make feature requests and submit language corrections.
## Sponsor
This package is sponsored by [LoreZyra](https://blog.richiebartlett.com/), you can find him at his [Website](https://richiebartlett.com/), also [Github](https://github.com/lorezyra)

## Become a sponsor?
<a href="https://www.buymeacoffee.com/asemalhaidary" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>