blob: 5e44b7ead29334c40350c55495c55e86aed31fc4 [file] [log] [blame]
/*!
Name: Reading Time
Dependencies: jQuery
Author: Michael Lynch
Author URL: http://michaelynch.com
Date Created: August 14, 2013
Date Updated: July 11, 2016
Licensed under the MIT license
*/
;(function($) {
var totalReadingTimeSeconds;
$.fn.readingTime = function(options) {
//define default parameters
var defaults = {
readingTimeTarget: '.eta',
readingTimeAsNumber: false,
wordCountTarget: null,
wordsPerMinute: 270,
round: true,
lang: 'en',
lessThanAMinuteString: '',
prependTimeString: '',
prependWordString: '',
remotePath: null,
remoteTarget: null,
success: function() {},
error: function() {}
},
plugin = this,
el = $(this);
//merge defaults and options
plugin.settings = $.extend({}, defaults, options);
//define vars
var s = plugin.settings;
//if no element was bound
if(!this.length) {
//run error callback
s.error.call(this);
//return so chained events can continue
return this;
}
//if s.lang is set to italian
if(s.lang == 'it') {
var lessThanAMinute = s.lessThanAMinuteString || "Meno di un minuto";
var minShortForm = 'min';
//if s.lang is set to french
} else if(s.lang == 'fr') {
var lessThanAMinute = s.lessThanAMinuteString || "Moins d'une minute";
var minShortForm = 'min';
//if s.lang is set to german
} else if(s.lang == 'de') {
var lessThanAMinute = s.lessThanAMinuteString || "Weniger als eine Minute";
var minShortForm = 'min';
//if s.lang is set to spanish
} else if(s.lang == 'es') {
var lessThanAMinute = s.lessThanAMinuteString || "Menos de un minuto";
var minShortForm = 'min';
//if s.lang is set to dutch
} else if(s.lang == 'nl') {
var lessThanAMinute = s.lessThanAMinuteString || "Minder dan een minuut";
var minShortForm = 'min';
//if s.lang is set to slovak
} else if(s.lang == 'sk') {
var lessThanAMinute = s.lessThanAMinuteString || "Menej než minútu";
var minShortForm = 'min';
//if s.lang is set to czech
} else if(s.lang == 'cz') {
var lessThanAMinute = s.lessThanAMinuteString || "Méně než minutu";
var minShortForm = 'min';
//if s.lang is set to Hungarian
} else if(s.lang == 'hu') {
var lessThanAMinute = s.lessThanAMinuteString || "Kevesebb mint egy perc";
var minShortForm = 'perc';
// if s.lang is set to Russian
} else if (s.lang == 'ru') {
var lessThanAMinute = s.lessThanAMinuteString || "Меньше минуты";
var minShortForm = 'мин';
//if s.lang is set to Arabic
} else if (s.lang == 'ar') {
var lessThanAMinute = s.lessThanAMinuteString || "أقل من دقيقة";
var minShortForm = 'دقيقة';
//if s.lang is set to Danish
} else if(s.lang == 'da') {
var lessThanAMinute = s.lessThanAMinuteString || "Mindre end et minut";
var minShortForm = 'min';
//if s.lang is set to Icelandic
} else if(s.lang == 'is') {
var lessThanAMinute = s.lessThanAMinuteString || "Minna en eina mínútu";
var minShortForm = 'min';
//if s.lang is set to Norwegian
} else if(s.lang == 'no') {
var lessThanAMinute = s.lessThanAMinuteString || "Mindre enn ett minutt";
var minShortForm = 'min';
//if s.lang is set to Polish
} else if(s.lang == 'pl') {
var lessThanAMinute = s.lessThanAMinuteString || "Mniej niż minutę";
var minShortForm = 'min';
//if s.lang is set to Russian
} else if(s.lang == 'ru') {
var lessThanAMinute = s.lessThanAMinuteString || "Меньше минуты";
var minShortForm = 'мой';
//if s.lang is set to Swedish
} else if(s.lang == 'sv') {
var lessThanAMinute = s.lessThanAMinuteString || "Mindre än en minut";
var minShortForm = 'min';
//if s.lang is set to Turkish
} else if(s.lang == 'tr') {
var lessThanAMinute = s.lessThanAMinuteString || "Bir dakikadan az";
var minShortForm = 'dk';
//default s.lang is english
} else {
var lessThanAMinute = s.lessThanAMinuteString || 'Less than a minute';
var minShortForm = 'min';
}
var setTime = function(text) {
if(text !== '') {
//split text by spaces to define total words
var totalWords = text.trim().split(/\s+/g).length;
//define words per second based on words per minute (s.wordsPerMinute)
var wordsPerSecond = s.wordsPerMinute / 60;
//define total reading time in seconds
totalReadingTimeSeconds = totalWords / wordsPerSecond;
//define reading time in minutes
//if s.round is set to true
if(s.round === true) {
var readingTimeMinutes = Math.round(totalReadingTimeSeconds / 60);
//if s.round is set to false
} else {
var readingTimeMinutes = Math.floor(totalReadingTimeSeconds / 60);
}
//define remaining reading time seconds
var readingTimeSeconds = Math.round(totalReadingTimeSeconds - readingTimeMinutes * 60);
//if s.round is set to true
if(s.round === true) {
//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);
}
//if s.round is set to false
} else {
//format reading time
var readingTime = readingTimeMinutes + ':' + readingTimeSeconds;
//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);
}
//run success callback
s.success.call(this);
} else {
//run error callback
s.error.call(this, 'The element is empty.');
}
};
//for each element
el.each(function() {
//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($('<div>').html(data).find(s.remoteTarget).text());
});
} else {
//set time using the targeted element
setTime(el.text());
}
});
return totalReadingTimeSeconds;
}
})(jQuery);