nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
99 lines (98 loc) • 4.51 kB
JavaScript
import { digitToBangla } from '../../number/convert.js';
import { BN_DAYS, BN_MONTHS, INTERNALS } from '../constants.js';
import { _bnDaysMonthIdx, _formatDateCore, _getBnSeason, _getBnYear, _isBnLeapYear, _padShunno, } from '../helpers.js';
export const banglaPlugin = ($Chronos) => {
const { internalDate: $Date } = $Chronos[INTERNALS];
const DEFAULT_CONFIG = new Map();
function $bnDaysMonthIdx(date, variant) {
return _bnDaysMonthIdx(date, variant ?? DEFAULT_CONFIG.get('config')?.variant);
}
$Chronos.prototype.configureBanglaCalendar = (configs) => {
DEFAULT_CONFIG.set('config', configs);
};
$Chronos.prototype.getBanglaYear = function (locale = 'bn') {
const bnYear = _getBnYear($Date(this));
return (locale === 'en' ? bnYear : digitToBangla(bnYear));
};
$Chronos.prototype.getBanglaMonth = function (options) {
const { locale = 'bn', variant } = options ?? {};
const isoMonth = $bnDaysMonthIdx($Date(this), variant).monthIdx + 1;
return (locale === 'en' ? isoMonth : digitToBangla(isoMonth));
};
$Chronos.prototype.getBanglaDay = function (options) {
const { locale = 'bn', variant } = options ?? {};
const date = $bnDaysMonthIdx($Date(this), variant).days + 1;
return (locale === 'en' ? date : digitToBangla(date));
};
$Chronos.prototype.getBanglaDayName = function (locale = 'bn') {
const DAY = BN_DAYS[this.weekDay];
return (locale === 'en' ? DAY.en : DAY.bn);
};
$Chronos.prototype.getBanglaMonthName = function (options) {
const { locale = 'bn', variant } = options ?? {};
const { monthIdx } = $bnDaysMonthIdx($Date(this), variant);
const MONTH = BN_MONTHS[monthIdx];
return (locale === 'en' ? MONTH.en : MONTH.bn);
};
$Chronos.prototype.getBanglaSeasonName = function (options) {
const { locale, variant } = options ?? {};
const { monthIdx } = $bnDaysMonthIdx($Date(this), variant);
return _getBnSeason(monthIdx, locale);
};
$Chronos.prototype.toBangla = function (opts) {
return {
year: this.getBanglaYear(opts?.locale),
month: this.getBanglaMonth(opts),
date: this.getBanglaDay(opts),
monthName: this.getBanglaMonthName(opts),
dayName: this.getBanglaDayName(opts?.locale),
seasonName: this.getBanglaSeasonName(opts),
isLeapYear: _isBnLeapYear(_getBnYear($Date(this)), this.year, opts?.variant),
};
};
$Chronos.prototype.formatBangla = function (fmt, opts) {
const { variant } = opts ?? {};
const { hour, minute, second, millisecond } = this;
const D_NAME = BN_DAYS[this.weekDay];
const { monthIdx } = $bnDaysMonthIdx($Date(this), variant);
const M_NAME = BN_MONTHS[monthIdx];
const month = this.getBanglaMonth({ variant });
const year = _padShunno(this.getBanglaYear(), 4);
const date = this.getBanglaDay({ variant });
const seasonName = this.getBanglaSeasonName({ variant });
const offset = digitToBangla(this.getTimeZoneOffset());
const dateComponents = {
YYYY: year,
YY: year.slice(-2),
yyyy: year,
yy: year.slice(-2),
M: month,
MM: _padShunno(month),
mmm: M_NAME.short,
mmmm: M_NAME.bn,
d: D_NAME.short,
dd: D_NAME.bn.replace('বার', ''),
ddd: D_NAME.bn,
D: date,
DD: _padShunno(date),
Do: date,
H: digitToBangla(hour),
HH: _padShunno(digitToBangla(hour)),
h: digitToBangla(hour % 12 || 12),
hh: _padShunno(digitToBangla(hour % 12 || 12)),
m: digitToBangla(minute),
mm: _padShunno(digitToBangla(minute)),
s: digitToBangla(second),
ss: _padShunno(digitToBangla(second)),
ms: digitToBangla(millisecond),
mss: _padShunno(digitToBangla(millisecond), 3),
a: hour < 12 ? 'পূর্বাহ্ণ' : 'অপরাহ্ণ',
A: hour < 12 ? 'পূর্বাহ্ণ' : 'অপরাহ্ণ',
Z: offset,
ZZ: offset,
S: seasonName,
SS: `${seasonName}কাল`,
};
return _formatDateCore(fmt || 'ddd, DD mmmm (SS), YYYY বঙ্গাব্দ - hh:mm:ss (A)', dateComponents);
};
};