btrz-formatter
Version:
A formatter library
634 lines (536 loc) • 19.9 kB
JavaScript
/*
* Date Format 1.2.3
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
* MIT license
*
* Includes enhancements by Scott Trenda <scott.trenda.net>
* and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
*/
var _dateFormat = function () {
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZW]|"[^"]*"|'[^']*'/g,
timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
timezoneClip = /[^-+\dA-Z]/g,
pad = function pad(val, len) {
val = String(val);
len = len || 2;
while (val.length < len) {
val = "0" + val;
}
return val;
},
/**
* Get the ISO 8601 week number
* Based on comments from
* http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html
*/
getWeek = function getWeek(date) {
// Remove time components of date
var targetThursday = new Date(date.getFullYear(), date.getMonth(), date.getDate()); // Change date to Thursday same week
targetThursday.setDate(targetThursday.getDate() - (targetThursday.getDay() + 6) % 7 + 3); // Take January 4th as it is always in week 1 (see ISO 8601)
var firstThursday = new Date(targetThursday.getFullYear(), 0, 4); // Change date to Thursday same week
firstThursday.setDate(firstThursday.getDate() - (firstThursday.getDay() + 6) % 7 + 3); // Check if daylight-saving-time-switch occured and correct for it
var ds = targetThursday.getTimezoneOffset() / firstThursday.getTimezoneOffset() - 1;
targetThursday.setHours(targetThursday.getHours() + ds); // Number of weeks between target Thursday and first Thursday
var weekDiff = (targetThursday - firstThursday) / (86400000 * 7);
return 1 + weekDiff;
}; // Regexes and supporting functions are cached through closure
return function (dateArg, mask, utc, lang) {
var dF = _dateFormat; // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
if (arguments.length === 1 && Object.prototype.toString.call(dateArg) === "[object String]" && !/\d/.test(dateArg)) {
mask = dateArg;
dateArg = undefined;
}
var date = dateArg || new Date();
if (!(date instanceof Date)) {
date = new Date(date);
}
if (isNaN(date)) {
throw TypeError("Invalid date: " + dateArg + ' : ' + mask + ' : ' + utc + ' : ');
}
mask = String(dF.masks[mask] || mask || dF.masks["default"]); // Allow setting the utc argument via the mask
if (mask.slice(0, 4) == "UTC:") {
mask = mask.slice(4);
utc = true;
}
var _ = utc ? "getUTC" : "get",
language = lang ? lang : "en",
d = date[_ + "Date"](),
D = date[_ + "Day"](),
m = date[_ + "Month"](),
y = date[_ + "FullYear"](),
H = date[_ + "Hours"](),
M = date[_ + "Minutes"](),
s = date[_ + "Seconds"](),
L = date[_ + "Milliseconds"](),
o = utc ? 0 : date.getTimezoneOffset(),
W = getWeek(date),
flags = {
d: d,
dd: pad(d),
ddd: dF.i18n[language].dayNames[D],
dddd: dF.i18n[language].longDayNames[D],
m: m + 1,
mm: pad(m + 1),
mmm: dF.i18n[language].monthNames[m],
mmmm: dF.i18n[language].longMonthNames[m],
yy: String(y).slice(2),
yyyy: y,
h: H % 12 || 12,
hh: pad(H % 12 || 12),
H: H,
HH: pad(H),
M: M,
MM: pad(M),
s: s,
ss: pad(s),
l: pad(L, 3),
L: pad(L > 99 ? Math.round(L / 10) : L),
t: H < 12 ? "a" : "p",
tt: H < 12 ? "am" : "pm",
T: H < 12 ? "A" : "P",
TT: H < 12 ? "AM" : "PM",
Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10],
W: W
};
return mask.replace(token, function ($0) {
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
});
};
}(); // Some common format strings
_dateFormat.masks = {
"default": "ddd mmm dd yyyy HH:MM:ss",
shortDate: "m/d/yy",
mediumDate: "mmm d, yyyy",
longDate: "mmmm d, yyyy",
fullDate: "dddd, mmmm d, yyyy",
shortTime: "h:MM TT",
mediumTime: "h:MM:ss TT",
longTime: "h:MM:ss TT Z",
isoDate: "yyyy-mm-dd",
isoTime: "HH:MM:ss",
isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
}; // Internationalization strings
_dateFormat.i18n = {
en: {
dayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
longDayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
longMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
},
es: {
dayNames: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
longDayNames: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
monthNames: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
longMonthNames: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
},
fr: {
dayNames: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"],
longDayNames: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
monthNames: ["Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aou", "Sep", "Oct", "Nov", "Dec"],
longMonthNames: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"]
},
de: {
dayNames: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
longDayNames: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
monthNames: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
longMonthNames: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
},
nl: {
dayNames: ["Zon", "Maandag", "Din", "Woe", "Don", "Vri", "Zat"],
longDayNames: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"],
monthNames: ["Jan", "Feb", "Maa", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
longMonthNames: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"]
}
};
const lodashy = require("./lodashy");
var Formatter = function () {
return {
merge: lodashy.merge,
cloneDeep: lodashy.cloneDeep,
clone: lodashy.clone,
asValueType: function asValueType(value, type, symbol) {
symbol = symbol || type;
if (type === '%' || type === 'percentage') {
return this.percentage(value) + ' %';
}
if (type === 'override') {
return 'abs ' + symbol + ' ' + this.money(value);
}
if (type === '$' || type === 'dollar' || type) {
return symbol + ' ' + this.money(value);
}
return this.money(value);
},
boolToString: function boolToString(bool) {
if (bool || bool === 'on') {
return 'yes';
} else {
return 'no';
}
},
capitalize: function capitalize(str, checkFirstLetter) {
if (str) {
str = str + '';
var capStr = str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
if (checkFirstLetter) {
return str.charAt(0) === str.charAt(0).toUpperCase() ? str : capStr;
} else {
return capStr;
}
}
return str;
},
bzDate: function bzDate(dateObj, dateFormat) {
var BzDate = require("bz-date").BzDate;
return new BzDate(dateObj, dateFormat).toString(dateFormat);
},
dateFormat: function dateFormat(date, format, utc, lang) {
return _dateFormat(date, format, utc, lang);
},
diffTimeSpan: function diffTimeSpan(later, sooner) {
var max = new Date('1/1/1970 ' + later);
var min = new Date('1/1/1970 ' + sooner);
return Formatter.timeSpan(new Date(max.getTime() - min.getTime()));
},
displayTime: function displayTime(date, minutesToOffset) {
if (!date.getDate) {
minutesToOffset = date;
date = new Date(Date.UTC(0, 0, 0, 0, 0, 0, 0));
}
if (!isNaN(minutesToOffset)) {
date.setUTCMinutes(date.getUTCMinutes() + minutesToOffset);
}
var hour = this.padLeftWith(date.getUTCHours() || '', 0, 2);
var min = this.padLeftWith(date.getUTCMinutes() || '', 0, 2);
return hour + ":" + min;
},
isValid24hTime: function isValid24hTime(value) {
var parts = value.split(':');
if (parts.length !== 2 || parts[0] === '' || parts[1] === '' || isNaN(parts[0]) || isNaN(parts[1]) || parts[0].length !== 2 || parts[1].length !== 2 || parts[0] * 1 > 23 || parts[0] * 1 < 0 || parts[1] * 1 > 59 || parts[1] * 1 < 0) {
return false;
}
return true;
},
moneyToNumber: function moneyToNumber(_money) {
var float = parseFloat(_money);
return float * 100 * 1000;
},
money: function money(_money) {
_money = Math.round(_money / 1000) / 100;
var parts = String(_money).split('.');
var whole = parts[0] || '0';
var dec = this.padRightWith(parts[1] || '', 0, 2);
return whole + '.' + dec;
},
moneyOrBlank: function moneyOrBlank(money) {
//removes the currency symbol if money is zero
var exp = "[0-9]{1,}([,.][0-9]{1,2})?$"; // extract only the money
var moneyValue = money.match(exp);
if (!moneyValue || moneyValue[0] === "0.00") {
moneyValue = "";
} else {
moneyValue = money;
}
return moneyValue;
},
msAsDaysHoursMinutes: function msAsDaysHoursMinutes(ms) {
var msInMin = 1000 * 60;
var msInHour = msInMin * 60;
var msInDay = msInHour * 24;
var remainder = ms;
var days = Math.floor(remainder / msInDay);
remainder %= msInDay;
var hours = Math.floor(remainder / msInHour);
remainder %= msInHour;
var minutes = Math.floor(remainder / msInMin);
if (minutes) {
var str = '';
if (days) {
str += days + 'd ';
}
if (hours) {
str += this.padLeftWith(hours, 0, 2) + 'h ';
}
str += this.padLeftWith(minutes, 0, 2) + 'm';
return str;
} else {
return '---';
}
},
minAsHoursMinutes: function minAsHoursMinutes(min) {
if (min) {
var minInHour = 60;
var remainder = min;
var hours = Math.floor(remainder / minInHour);
remainder %= minInHour;
var str = '';
if (hours) {
str += hours + 'h ';
}
str += this.padLeftWith(remainder, 0, 2) + 'm';
return str;
} else {
return '---';
}
},
padLeftWith: function padLeftWith(origStr, padStr, maxLength) {
return _padWith(origStr, padStr, maxLength, true);
},
padRightWith: function padRightWith(origStr, padStr, maxLength) {
return _padWith(origStr, padStr, maxLength, false);
},
percentage: function percentage(number) {
number = number / 1000;
return number.toString();
},
relativeTime: function relativeTime(date) {
var diff = new Date() - date;
var minutes = Math.floor(diff / 60000);
if (minutes === 0) {
return 'less than a minute ago';
}
if (minutes === 1) {
return 'one minute ago';
}
if (minutes < 15) {
return minutes + ' minutes ago';
}
if (minutes < 60) {
return 'less than an hour ago';
}
if (minutes < 75 && minutes > 60) {
return 'an hour ago';
}
if (minutes < 120 && minutes > 75) {
return 'less than two hours ago';
}
if (minutes < 60 * 24) {
return Math.floor(minutes / 60) + ' hours ago';
}
if (minutes > 60 * 24 && minutes < 60 * 48) {
return 'yesterday';
}
return Math.floor(minutes / (60 * 24)) + ' days ago';
},
replaceFrom: function replaceFrom(key, values, options) {
var i = 0,
result = '',
prop = null,
a = 0;
if (!values) {
return key;
}
var keyName = 'key';
var valueName = 'value';
if (options && options.key) {
keyName = options.key;
}
if (options && options.value) {
valueName = options.value;
}
if (options && options.property) {
prop = options.property;
}
if (Array.isArray(key)) {
for (a = 0; a < key.length; a += 1) {
result += getString(key[a], prop);
if (a < key.length - 1) {
result += ", ";
}
}
} else {
result = getString(key, prop);
}
return result || key;
function getString(k, prop) {
if (prop) {
k = k[prop];
}
for (i = 0; i < values.length; i += 1) {
var val = values[i];
if (String(val[keyName]) === String(k)) {
return val[valueName];
}
}
return "";
}
},
reportDate: function reportDate(date) {
if (!date) {
return '';
}
if (!date.toUTCString) {
date = _parseStrToDate(date);
}
if (!date.toUTCString) {
return date;
}
return date.getUTCFullYear() + '-' + this.padLeftWith(date.getUTCMonth() + 1, '0', 2) + "-" + this.padLeftWith(date.getUTCDate(), '0', 2);
},
timeFormat: function timeFormat(str, mask) {
var timeParts = str.split(':');
var d = new Date(Date.UTC(0, 0, 0, timeParts[0], timeParts[1]));
return _dateFormat(d, mask, true);
},
timeSpan: function timeSpan(val) {
if (!val) {
return '';
}
if (!val.toUTCString) {
//If not a date should convert to one.
val = _parseStrToDate(val);
}
if (val.toUTCString) {
//Make sure that I have a date now.
return this.timeSpanFromDate(val);
}
var parts = val.split(':');
var result = '';
var hr = this.padLeftWith(parts[0] || '', '0', 2);
var min = this.padLeftWith(parts[1] || '', '0', 2);
var sec = this.padLeftWith(parts[2] || '', '0', 2);
sec = ':' + sec;
return hr + ':' + min + sec;
},
timeSpanFromDate: function timeSpanFromDate(date) {
var val = this.padLeftWith(date.getUTCHours(), '0', 2) + ':' + this.padLeftWith(date.getUTCMinutes(), '0', 2) + ':' + this.padLeftWith(date.getUTCSeconds(), '0', 2);
return this.timeSpan(val);
},
titleCase: function titleCase(string) {
if (!string) {
return '';
}
var tokens = string.split(' ');
var phrase = this.capitalize(tokens[0]);
var t = 1;
function inException(tok) {
var exceptions = '||a||abaft||aboard||about||above||absent||across||afore||against||along||alongside||amid||amidst||among||amongst||an||and||apropos||around||as||aside||astride||at||athwart||atop||barring||before||behind||below||beneath||beside||besides||between||betwixt||beyond||but||by||circa||concerning||despite||down||during||except||excluding||failing||following||for||from||given||in||including||inside||into||lest||like||mid||midst||minus||modulo||near||next||not||notwithstanding||of||off||on||onto||opposite||or||out||outside||over||pace||past||per||plus||pro||qua||regarding||round||sans||save||since||so||than||the||through||thru||throughout||thruout||till||times||to||toward||towards||under||underneath||unlike||until||unto||up||upon||versus||vs||via||vice||with||within||without||worth||yet||';
return exceptions.indexOf('||' + tok + '||') !== -1;
}
for (; t < tokens.length; t += 1) {
var token = tokens[t];
if (inException(token)) {
phrase += ' ' + token;
} else {
phrase += ' ' + this.capitalize(token);
}
}
return phrase;
},
truncate: function truncate(str, limit, backtrack) {
if (str.length <= limit) {
return str;
}
if (backtrack) {
limit -= backtrack;
}
if (str.indexOf(' ') !== -1) {
var words = str.split(' ');
var newPhrase = '';
var curSize = 0;
for (var i = 0; i < words.length; i += 1) {
curSize += words[i].length + 1;
if (curSize <= limit) {
newPhrase += words[i] + ' ';
} else {
if (newPhrase === '') {
return str.substring(0, limit) + '...';
}
return newPhrase + '...';
}
}
} else {
return str.substring(0, limit) + '...';
}
},
getMinutes: function getMinutes(time) {
var minutes = 0;
if (time) {
var parts = time.split(':');
if (parts.length === 2) {
minutes = Number(parts[1]) + parts[0] * 60;
}
}
return minutes;
},
itemIdLink: function itemIdLink(itemId, showItemIdLink, type, _id) {
if (showItemIdLink == "true" && _id && _id.length === 24) {
if (type === "ticket" || type === "flexpass") {
return "<a href=\"/tickets/" + _id + "\">" + itemId + "</a>";
}
if (type === "refund") {
return "<a href=\"/tickets/refunds/" + _id + "\">" + itemId + "</a>";
}
if (type === "R-Item") {
return "<a href=\"/tickets/redeemableItems/" + _id + "\">" + itemId + "</a>";
}
if (type === "item") {
return "<a href=\"/tickets/solditem/" + _id + "\">" + itemId + "</a>";
}
if (type === "parcel") {
return "<a href=\"/parcels/" + _id + "\">" + itemId + "</a>";
}
if (type === "insurance") {
return "<a>" + itemId + "</a>";
}
}
return itemId;
},
parseHtml: function parseHtml(str) {
if (str && (typeof str == 'string' || str instanceof String)) {
return str.replace(/\&/g, '&').replace(/\</g, '<');
} else {
return '';
}
},
anonymizeEmail: function anonymizeEmail(anEmail) {
var splited = anEmail.split("@");
return "".concat(splited[0].substring(0, 3), "***@***").concat(splited[1].slice(-6));
}
};
function _padWith(origStr, padStr, maxLength, leftNotRight) {
// If numbers are passed in, convert them
origStr += '';
padStr += '';
var size = origStr.length;
var diff = maxLength - size;
var totalPad = '';
var i = 0;
for (i = 0; i < diff; i += 1) {
totalPad += padStr;
}
if (leftNotRight) {
return totalPad + origStr;
} else {
return origStr + totalPad;
}
}
function _parseStrToDate(str) {
var dateParts;
var ds;
var dh;
if (typeof str !== 'string') {
return '';
}
if (str.indexOf('T') > -1) {
dateParts = str.split('T');
ds = dateParts[0].split('-');
hs = dateParts[1].split(".")[0].split(':');
return new Date(Date.UTC(ds[0], ds[1] - 1, ds[2], hs[0], hs[1], hs[2]));
}
if (str.indexOf('-') > -1) {
dateParts = str.split('-');
return new Date(Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2]));
}
return str;
}
}();
module.exports = Formatter;