@beenotung/tslib
Version:
utils library in Typescript
240 lines (239 loc) • 6.91 kB
JavaScript
;
/**
* Created by beenotung on 2017 Mar 9th.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.setLang = setLang;
exports.format_byte = format_byte;
exports.format_datetime = format_datetime;
exports.round_time_diff = round_time_diff;
exports.format_long_short_time = format_long_short_time;
exports.format_time_duration = format_time_duration;
exports.format_relative_time = format_relative_time;
exports.format_2_digit = format_2_digit;
exports.format_time_code = format_time_code;
exports.format_timestamp_code = format_timestamp_code;
exports.format_n_digit = format_n_digit;
exports.format_percentage = format_percentage;
const timezone_date_ts_1 = require("timezone-date.ts");
const en_1 = require("./en");
const locale_1 = require("./locale");
const time_1 = require("./time");
const size_units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const time_units_short = [
[time_1.CENTURY, 'century'],
[time_1.DECADE, 'decade'],
[time_1.YEAR, 'yr'],
[time_1.MONTH, 'mo'],
[time_1.WEEK, 'wk'],
[time_1.DAY, 'd'],
[time_1.HOUR, 'hr'],
[time_1.MINUTE, 'min'],
[time_1.SECOND, 's'],
[time_1.MILLISECOND, 'ms'],
];
const time_units_en = [
[time_1.CENTURY, 'century'],
[time_1.DECADE, 'decade'],
[time_1.YEAR, 'year'],
[time_1.MONTH, 'month'],
[time_1.WEEK, 'week'],
[time_1.DAY, 'day'],
[time_1.HOUR, 'hour'],
[time_1.MINUTE, 'minute'],
[time_1.SECOND, 'second'],
[time_1.MILLISECOND, 'millisecond'],
];
const time_units_zh = [
[time_1.CENTURY, '世紀'],
[time_1.YEAR, '年'],
[time_1.MONTH, '個月'],
[time_1.WEEK, '週'],
[time_1.DAY, '日'],
[time_1.HOUR, '小時'],
[time_1.MINUTE, '分鐘'],
[time_1.SECOND, '秒'],
[time_1.MILLISECOND, '毫秒'],
];
const word_en = {
'instantly': 'instantly',
'just now': 'just now',
'hence': 'hence',
'ago': 'ago',
};
const word_zh = {
'instantly': '即時',
'just now': '剛剛',
'hence': '後',
'ago': '前',
};
let word = word_en;
let time_units = time_units_en;
let locale = (0, locale_1.getEnvLocale)() || 'en';
function setLang(lang, flag) {
locale = lang;
if (lang.includes('zh')) {
time_units = time_units_zh;
word = word_zh;
}
else {
time_units = flag == 'simple' ? time_units_short : time_units_en;
word = word_en;
}
}
setLang(locale);
function concatWords(a, b) {
if ((0, en_1.isEngChar)(a[a.length - 1]) || (0, en_1.isEngChar)(b[0])) {
return a + ' ' + b;
}
return a + b;
}
function format_byte(n_byte, n_decimal = 2) {
if (Number.isNaN(n_byte)) {
return '-';
}
let acc = n_byte;
for (const size_unit of size_units) {
if (acc < 1024) {
return acc.toFixed(n_decimal) + ' ' + size_unit;
}
acc /= 1024;
}
return ((acc * 1024).toFixed(n_decimal) + ' ' + size_units[size_units.length - 1]);
}
function format_datetime(time, options = {}) {
if (!time) {
return options.empty || '-';
}
const locales = options.locales || (0, locale_1.getEnvLocale)() || locale;
let date;
if (options.timezoneOffset !== undefined) {
const date_ = (date = new timezone_date_ts_1.TimezoneDate(time));
date_.setTimezoneOffset(options.timezoneOffset);
}
else {
date = new Date(time);
}
return date.toLocaleString(locales, {
weekday: 'short',
year: 'numeric',
month: 'short',
day: 'numeric',
hour: '2-digit',
hour12: true,
minute: '2-digit',
...options,
});
}
const roundUnits = time_units_en.map(([unit]) => unit).sort((a, b) => b - a);
function round_time_diff(timeDiff) {
const absDiff = Math.abs(timeDiff);
for (const unit of roundUnits) {
if (absDiff > unit) {
if (timeDiff > 0) {
return Math.floor(timeDiff / unit) * unit;
}
else {
return Math.ceil(timeDiff / unit) * unit;
}
}
}
return timeDiff;
}
function format_long_short_time(time, options) {
// if within 1-week, format relative time, else format absolute time
const diff = time - Date.now();
if (Math.abs(diff) < (options?.threshold || time_1.WEEK)) {
return format_relative_time(diff, options?.format_duration_digit);
}
return format_datetime(time, options);
}
function format_time_duration(delta, digit = 1) {
const diff = Math.abs(delta);
if (!Number.isFinite(diff) || Number.isNaN(diff)) {
return String(delta);
}
const res = (n, unit) => {
const p = Math.pow(10, digit);
n = Math.floor(n * p) / p;
if (n > 1) {
unit = (0, en_1.to_plural)(unit);
}
return n + ' ' + unit;
};
for (const [size, unit] of time_units) {
if (diff === size) {
return '1 ' + unit;
}
if (diff > size) {
return res(diff / size, unit);
}
}
return word.instantly;
}
function format_relative_time(delta, digit = 1) {
const s = format_time_duration(delta, digit);
if (s === word.instantly) {
return word['just now'];
}
if (delta > 0) {
return concatWords(s, word.hence);
}
else {
return concatWords(s, word.ago);
}
}
/**
* mainly for formatting month, date, hour, minute, and second
* @param x: [0..60]
* */
function format_2_digit(x) {
if (x < 10) {
return '0' + x;
}
return x.toString();
}
/**
* format: YYYYMMDD-HHMM
* less accurate, for human reading
* */
function format_time_code(time, separator = '-') {
const t = new Date(time);
const y = t.getFullYear();
const m = format_2_digit(t.getMonth() + 1);
const d = format_2_digit(t.getDate());
const H = format_2_digit(t.getHours());
const M = format_2_digit(t.getMinutes());
return y + m + d + separator + H + M;
}
/**
* format: YYYYMMDD-HHMM-SS-sss
* more accurate, for filename
* */
function format_timestamp_code(time, separator = '-') {
const t = new Date(time);
const y = t.getFullYear();
const m = format_2_digit(t.getMonth() + 1);
const d = format_2_digit(t.getDate());
const H = format_2_digit(t.getHours());
const M = format_2_digit(t.getMinutes());
const S = format_2_digit(t.getSeconds());
const s = format_n_digit(t.getMilliseconds(), 3);
return y + m + d + separator + H + M + separator + S + separator + s;
}
function format_n_digit(x, n, prefix = '0') {
let s = Math.abs(x).toString();
if (x < 0) {
n--;
}
if (s.length < n) {
s = prefix.repeat(n - s.length) + s;
}
if (x < 0) {
s = '-' + s;
}
return s;
}
function format_percentage(p, n_decimal = 2) {
return Math.round(p * Math.pow(10, 2 + n_decimal)) / 100 + '%';
}