/
readingtime.js
249 lines (192 loc) · 6.18 KB
/
readingtime.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*!
Name: Reading Time
Dependencies: jQuery
Author: Michael Lynch
Author URL: http://michaelynch.com
Date Created: August 14, 2013
Date Updated: February 28, 2018
Licensed under the MIT license
*/
;(function($) {
$.fn.readingTime = function(options) {
// define default parameters
const defaults = {
readingTimeTarget: '.eta',
readingTimeAsNumber: false,
wordCountTarget: null,
wordsPerMinute: 270,
round: true,
lang: 'en',
lessThanAMinuteString: '',
prependTimeString: '',
prependWordString: '',
remotePath: null,
remoteTarget: null,
success: function() {},
error: function() {}
};
const plugin = this;
const el = $(this);
let wordsPerSecond;
let lessThanAMinute;
let minShortForm;
let totalWords;
let totalReadingTimeSeconds;
let readingTimeMinutes;
let readingTimeSeconds;
let readingTime;
let readingTimeObj;
// merge defaults and options
plugin.settings = $.extend({}, defaults, options);
// define vars
const s = plugin.settings;
const setTime = function(o) {
if(o.text !== '') {
//split text by spaces to define total words
totalWords = o.text.trim().split(/\s+/g).length;
//define words per second based on words per minute (s.wordsPerMinute)
wordsPerSecond = s.wordsPerMinute / 60;
//define total reading time in seconds
totalReadingTimeSeconds = totalWords / wordsPerSecond;
// define reading time
readingTimeMinutes = Math.floor(totalReadingTimeSeconds / 60);
// define remaining reading time seconds
readingTimeSeconds = Math.round(totalReadingTimeSeconds - (readingTimeMinutes * 60));
// format reading time
readingTime = `${readingTimeMinutes}:${readingTimeSeconds}`;
// if s.round
if(s.round) {
// if minutes are greater than 0
if(readingTimeMinutes > 0) {
// set reading time by the minute
$(s.readingTimeTarget).text(s.prependTimeString + readingTimeMinutes + ((!s.readingTimeAsNumber) ? ' ' + minShortForm : ''));
} else {
// set reading time as less than a minute
$(s.readingTimeTarget).text((!s.readingTimeAsNumber) ? s.prependTimeString + lessThanAMinute : readingTimeMinutes);
}
} else {
// set reading time in minutes and seconds
$(s.readingTimeTarget).text(s.prependTimeString + readingTime);
}
// if word count container isn't blank or undefined
if(s.wordCountTarget !== '' && s.wordCountTarget !== undefined) {
// set word count
$(s.wordCountTarget).text(s.prependWordString + totalWords);
}
readingTimeObj = {
wpm: s.wordsPerMinute,
words: totalWords,
eta: {
time: readingTime,
minutes: readingTimeMinutes,
seconds: totalReadingTimeSeconds
}
};
// run success callback
s.success.call(this, readingTimeObj);
} else {
// run error callback
s.error.call(this, {
error: 'The element does not contain any text'
});
}
};
// if no element was bound
if(!this.length) {
// run error callback
s.error.call(this, {
error: 'The element could not be found'
});
// return so chained events can continue
return this;
}
// if s.lang is Arabic
if (s.lang == 'ar') {
lessThanAMinute = s.lessThanAMinuteString || "أقل من دقيقة";
minShortForm = 'دقيقة';
// if s.lang is Czech
} else if(s.lang == 'cz') {
lessThanAMinute = s.lessThanAMinuteString || "Méně než minutu";
minShortForm = 'min';
// if s.lang is Danish
} else if(s.lang == 'da') {
lessThanAMinute = s.lessThanAMinuteString || "Mindre end et minut";
minShortForm = 'min';
// if s.lang is German
} else if(s.lang == 'de') {
lessThanAMinute = s.lessThanAMinuteString || "Weniger als eine Minute";
minShortForm = 'min';
// if s.lang is Spanish
} else if(s.lang == 'es') {
lessThanAMinute = s.lessThanAMinuteString || "Menos de un minuto";
minShortForm = 'min';
// if s.lang is French
} else if(s.lang == 'fr') {
lessThanAMinute = s.lessThanAMinuteString || "Moins d'une minute";
minShortForm = 'min';
// if s.lang is Hungarian
} else if(s.lang == 'hu') {
lessThanAMinute = s.lessThanAMinuteString || "Kevesebb mint egy perc";
minShortForm = 'perc';
// if s.lang is Icelandic
} else if(s.lang == 'is') {
lessThanAMinute = s.lessThanAMinuteString || "Minna en eina mínútu";
minShortForm = 'min';
// if s.lang is Italian
} else if(s.lang == 'it') {
lessThanAMinute = s.lessThanAMinuteString || "Meno di un minuto";
minShortForm = 'min';
// if s.lang is Dutch
} else if(s.lang == 'nl') {
lessThanAMinute = s.lessThanAMinuteString || "Minder dan een minuut";
minShortForm = 'min';
// if s.lang is Norwegian
} else if(s.lang == 'no') {
lessThanAMinute = s.lessThanAMinuteString || "Mindre enn ett minutt";
minShortForm = 'min';
// if s.lang is Polish
} else if(s.lang == 'pl') {
lessThanAMinute = s.lessThanAMinuteString || "Mniej niż minutę";
minShortForm = 'min';
// if s.lang is Russian
} else if(s.lang == 'ru') {
lessThanAMinute = s.lessThanAMinuteString || "Меньше минуты";
minShortForm = 'мой';
// if s.lang is Slovak
} else if(s.lang == 'sk') {
lessThanAMinute = s.lessThanAMinuteString || "Menej než minútu";
minShortForm = 'min';
// if s.lang is Swedish
} else if(s.lang == 'sv') {
lessThanAMinute = s.lessThanAMinuteString || "Mindre än en minut";
minShortForm = 'min';
// if s.lang is Turkish
} else if(s.lang == 'tr') {
lessThanAMinute = s.lessThanAMinuteString || "Bir dakikadan az";
minShortForm = 'dk';
// default s.lang is english
} else {
lessThanAMinute = s.lessThanAMinuteString || 'Less than a minute';
minShortForm = 'min';
}
// for each element
el.each(function(index) {
// if s.remotePath and s.remoteTarget aren't null
if(s.remotePath != null && s.remoteTarget != null) {
// get contents of remote file
$.get(s.remotePath, function(data) {
// set time using the remote target found in the remote file
setTime({
text: $('<div>').html(data).find(s.remoteTarget).text()
});
});
} else {
// set time using the targeted element
setTime({
text: el.text()
});
}
});
return true;
}
})(jQuery);