UNPKG

cleave.js

Version:

JavaScript library for formatting input text content when you are typing

179 lines (144 loc) 5.38 kB
'use strict'; var TimeFormatter = function (timePattern, timeFormat) { var owner = this; owner.time = []; owner.blocks = []; owner.timePattern = timePattern; owner.timeFormat = timeFormat; owner.initBlocks(); }; TimeFormatter.prototype = { initBlocks: function () { var owner = this; owner.timePattern.forEach(function () { owner.blocks.push(2); }); }, getISOFormatTime: function () { var owner = this, time = owner.time; return time[2] ? ( owner.addLeadingZero(time[0]) + ':' + owner.addLeadingZero(time[1]) + ':' + owner.addLeadingZero(time[2]) ) : ''; }, getBlocks: function () { return this.blocks; }, getTimeFormatOptions: function () { var owner = this; if (String(owner.timeFormat) === '12') { return { maxHourFirstDigit: 1, maxHours: 12, maxMinutesFirstDigit: 5, maxMinutes: 60 }; } return { maxHourFirstDigit: 2, maxHours: 23, maxMinutesFirstDigit: 5, maxMinutes: 60 }; }, getValidatedTime: function (value) { var owner = this, result = ''; value = value.replace(/[^\d]/g, ''); var timeFormatOptions = owner.getTimeFormatOptions(); owner.blocks.forEach(function (length, index) { if (value.length > 0) { var sub = value.slice(0, length), sub0 = sub.slice(0, 1), rest = value.slice(length); switch (owner.timePattern[index]) { case 'h': if (parseInt(sub0, 10) > timeFormatOptions.maxHourFirstDigit) { sub = '0' + sub0; } else if (parseInt(sub, 10) > timeFormatOptions.maxHours) { sub = timeFormatOptions.maxHours + ''; } break; case 'm': case 's': if (parseInt(sub0, 10) > timeFormatOptions.maxMinutesFirstDigit) { sub = '0' + sub0; } else if (parseInt(sub, 10) > timeFormatOptions.maxMinutes) { sub = timeFormatOptions.maxMinutes + ''; } break; } result += sub; // update remaining string value = rest; } }); return this.getFixedTimeString(result); }, getFixedTimeString: function (value) { var owner = this, timePattern = owner.timePattern, time = [], secondIndex = 0, minuteIndex = 0, hourIndex = 0, secondStartIndex = 0, minuteStartIndex = 0, hourStartIndex = 0, second, minute, hour; if (value.length === 6) { timePattern.forEach(function (type, index) { switch (type) { case 's': secondIndex = index * 2; break; case 'm': minuteIndex = index * 2; break; case 'h': hourIndex = index * 2; break; } }); hourStartIndex = hourIndex; minuteStartIndex = minuteIndex; secondStartIndex = secondIndex; second = parseInt(value.slice(secondStartIndex, secondStartIndex + 2), 10); minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10); hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10); time = this.getFixedTime(hour, minute, second); } if (value.length === 4 && owner.timePattern.indexOf('s') < 0) { timePattern.forEach(function (type, index) { switch (type) { case 'm': minuteIndex = index * 2; break; case 'h': hourIndex = index * 2; break; } }); hourStartIndex = hourIndex; minuteStartIndex = minuteIndex; second = 0; minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10); hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10); time = this.getFixedTime(hour, minute, second); } owner.time = time; return time.length === 0 ? value : timePattern.reduce(function (previous, current) { switch (current) { case 's': return previous + owner.addLeadingZero(time[2]); case 'm': return previous + owner.addLeadingZero(time[1]); case 'h': return previous + owner.addLeadingZero(time[0]); } }, ''); }, getFixedTime: function (hour, minute, second) { second = Math.min(parseInt(second || 0, 10), 60); minute = Math.min(minute, 60); hour = Math.min(hour, 60); return [hour, minute, second]; }, addLeadingZero: function (number) { return (number < 10 ? '0' : '') + number; } }; module.exports = TimeFormatter;