@thyrith/momentkh 3.0.1 โ†’ 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  **MomentKH** is a lightweight, zero-dependency JavaScript/TypeScript library for accurate Khmer (Cambodian) Lunar Calendar conversions. It provides a modern, standalone implementation with full TypeScript support.
4
4
 
5
- [![Version](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://github.com/ThyrithSor/momentkh)
5
+ [๐ŸŽฎ **Live Demo Playground**](https://thyrithsor.github.io/momentkh/)
6
+
7
+ [![Version](https://img.shields.io/badge/version-3.0.3-blue.svg)](https://github.com/ThyrithSor/momentkh)
6
8
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
9
  [![No Dependencies](https://img.shields.io/badge/dependencies-none-success.svg)](https://github.com/ThyrithSor/momentkh)
8
10
 
@@ -19,12 +21,19 @@ const khmer = momentkh.fromDate(new Date());
19
21
  console.log(momentkh.format(khmer));
20
22
  // Output: แžแŸ’แž„แŸƒแž–แžปแž’ แŸกแŸขแžšแŸ„แž… แžแŸ‚แž˜แžทแž‚แžŸแžทแžš แž†แŸ’แž“แžถแŸ†แž˜แŸ’แžŸแžถแž‰แŸ‹ แžŸแž”แŸ’แžแžŸแŸแž€ แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ แŸขแŸฅแŸฆแŸฉ
21
23
 
24
+ // Convert from gregorian data (แžแŸ’แž„แŸƒแžŸแžปแžšแžทแž™แž‚แžแžท) to Khmer format
25
+ const date = momentkh.fromGregorian(2025, 12, 10); // แžแŸ’แž„แŸƒแž‘แžธแŸกแŸ  แžแŸ‚แž’แŸ’แž“แžผ แž†แŸ’แž“แžถแŸ†แŸขแŸ แŸขแŸฅ
26
+ // or
27
+ // const khmer = momentkh.fromGregorian(2025, 12, 10, 0, 0, 0); // (year, month, day, hour = 0, minute = 0, second = 0)
28
+ console.log(momentkh.format(date));
29
+ // Output: แžแŸ’แž„แŸƒแž–แžปแž’ แŸฅแžšแŸ„แž… แžแŸ‚แž˜แžทแž‚แžŸแžทแžš แž†แŸ’แž“แžถแŸ†แž˜แŸ’แžŸแžถแž‰แŸ‹ แžŸแž”แŸ’แžแžŸแŸแž€ แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ แŸขแŸฅแŸฆแŸฉ
30
+
22
31
  // Convert date to Khmer format (custom)
23
- console.log(momentkh.format(khmer, "dN แžแŸ‚m แž†แŸ’แž“แžถแŸ†a"));
24
- // Output: แŸกแŸขแžšแŸ„แž… แžแŸ‚แž˜แžทแž‚แžŸแžทแžš แž†แŸ’แž“แžถแŸ†แž˜แŸ’แžŸแžถแž‰แŸ‹
32
+ console.log(momentkh.format(date, "แž”แŸ’แžšแžถแžŸแžถแž‘แžแžถแž€แŸ’แžšแž”แžธแžแŸ’แžšแžผแžœแž”แžถแž“แž…แŸ„แžšแžŸแŸ€แž˜แž”แžถแž‰แŸ‹แž”แŸ†แž•แŸ’แž›แžถแž‰แž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„ แž“แŸ…แžแŸ’แž„แŸƒW แž‘แžธdsr แžแŸ‚M แž†แŸ’แž“แžถแŸ†cr แžแŸ’แžšแžผแžœแž“แžนแž„ แžแŸ’แž„แŸƒแž‘แžธDN แžแŸ‚m แž†แŸ’แž“แžถแŸ†a e แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ bแŸ”"));
33
+ // Output: แž”แŸ’แžšแžถแžŸแžถแž‘แžแžถแž€แŸ’แžšแž”แžธแžแŸ’แžšแžผแžœแž”แžถแž“แž…แŸ„แžšแžŸแŸ€แž˜แž”แžถแž‰แŸ‹แž”แŸ†แž•แŸ’แž›แžถแž‰แž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„ แž“แŸ…แžแŸ’แž„แŸƒแž–แžปแž’ แž‘แžธ10 แžแŸ‚แž’แŸ’แž“แžผ แž†แŸ’แž“แžถแŸ†2025 แžแŸ’แžšแžผแžœแž“แžนแž„ แžแŸ’แž„แŸƒแž‘แžธแŸ แŸฅแžšแŸ„แž… แžแŸ‚แž˜แžทแž‚แžŸแžทแžš แž†แŸ’แž“แžถแŸ†แž˜แŸ’แžŸแžถแž‰แŸ‹ แžŸแž”แŸ’แžแžŸแŸแž€ แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ แŸขแŸฅแŸฆแŸฉแŸ”
25
34
 
26
35
  // Convert Khmer date to Gregorian
27
- const gregorian = momentkh.fromKhmer(15, 0, 5, 2568); // 15แž€แžพแž แžแŸ‚แž–แžทแžŸแžถแž แž–.แžŸ.แŸขแŸฅแŸฆแŸจ
36
+ const gregorian = momentkh.fromKhmer(15, momentkh.MoonPhase.Waxing, momentkh.MonthIndex.Pisakh, 2568); // 15แž€แžพแž แžแŸ‚แž–แžทแžŸแžถแž แž–.แžŸ.แŸขแŸฅแŸฆแŸจ
28
37
  console.log(gregorian);
29
38
  // Output: { year: 2025, month: 5, day: 11 }
30
39
 
@@ -52,7 +61,7 @@ console.log(newYear);
52
61
  - [Understanding Khmer Calendar](#-understanding-khmer-calendar)
53
62
  - [Buddhist Era (BE) Year](#buddhist-era-be-year)
54
63
  - [Animal Year](#animal-year)
55
- - [Era Year (Sak)](#era-year-sak)
64
+ - [Sak](#sak-year-sak)
56
65
  - [When Each Year Type Increases](#when-each-year-type-increases)
57
66
  - [Format Codes](#-format-codes)
58
67
  - [Constants](#-constants)
@@ -66,7 +75,7 @@ console.log(newYear);
66
75
 
67
76
  - โœ… **Zero Dependencies** - Pure JavaScript, no external libraries required
68
77
  - โœ… **TypeScript Support** - Full type definitions included for excellent IDE experience
69
- - โœ… **Type-Safe Enums** - NEW in v3.0! Use enums for moonPhase, monthIndex, animalYear, eraYear, and dayOfWeek
78
+ - โœ… **Type-Safe Enums** - NEW in v3.0! Use enums for moonPhase, monthIndex, animalYear, sak, and dayOfWeek
70
79
  - โœ… **Bidirectional Conversion** - Convert between Gregorian โ†” Khmer Lunar dates
71
80
  - โœ… **Accurate Calculations** - Based on traditional Khmer astronomical algorithms
72
81
  - โœ… **Khmer New Year** - Precise calculation of Moha Songkran timing
@@ -85,14 +94,6 @@ console.log(newYear);
85
94
  npm install @thyrith/momentkh
86
95
  ```
87
96
 
88
- ### Direct Download
89
-
90
- Download `momentkh.js` from the repository and include it in your project.
91
-
92
- ```bash
93
- cp momentkh.js /path/to/your/project/
94
- ```
95
-
96
97
  ### TypeScript
97
98
 
98
99
  Type definitions are included automatically when you install via NPM. For direct downloads, you can also use `momentkh.ts` or the compiled `.d.ts` files from the `dist/` folder.
@@ -105,7 +106,7 @@ Type definitions are included automatically when you install via NPM. For direct
105
106
 
106
107
  ```html
107
108
  <!-- Include the browser-compatible UMD bundle -->
108
- <script src="momentkh.js"></script>
109
+ <script src="https://cdn.jsdelivr.net/gh/ThyrithSor/momentkh@3.0.3/momentkh.js"></script>
109
110
  <script>
110
111
  // Convert today to Khmer
111
112
  const today = new Date();
@@ -153,7 +154,7 @@ import momentkh, {
153
154
  MoonPhase,
154
155
  MonthIndex,
155
156
  AnimalYear,
156
- EraYear,
157
+ Sak,
157
158
  DayOfWeek,
158
159
  } from "@thyrith/momentkh";
159
160
 
@@ -209,7 +210,7 @@ const monthName = momentkh.constants.LunarMonthNames[4]; // "แž…แŸแžแŸ’แžš"
209
210
  - ๐ŸŒ™ `MoonPhase` - Waxing (แž€แžพแž) and Waning (แžšแŸ„แž…)
210
211
  - ๐Ÿ“… `MonthIndex` - All 14 Khmer lunar months
211
212
  - ๐Ÿ‰ `AnimalYear` - All 12 animal years
212
- - โญ `EraYear` - All 10 era years
213
+ - โญ `Sak` - All 10 Saks
213
214
  - ๐Ÿ“† `DayOfWeek` - Sunday through Saturday
214
215
 
215
216
  ---
@@ -253,8 +254,8 @@ Converts a Gregorian (Western) date to a Khmer Lunar date.
253
254
  jsYear: 1386, // Number: Jolak Sakaraj (Chula Sakaraj) year
254
255
  animalYear: 4, // AnimalYear enum: 0-11 (NEW in v3.0)
255
256
  animalYearName: 'แžšแŸ„แž„', // String: Animal year name
256
- eraYear: 6, // EraYear enum: 0-9 (NEW in v3.0)
257
- eraYearName: 'แž†แžŸแŸแž€', // String: Era/Sak name
257
+ sak: 6, // Sak enum: 0-9 (NEW in v3.0)
258
+ sakName: 'แž†แžŸแŸแž€', // String: Sak name
258
259
  dayOfWeek: 0, // DayOfWeek enum: 0=Sunday, 6=Saturday (NEW in v3.0)
259
260
  dayOfWeekName: 'แžขแžถแž‘แžทแžแŸ’แž™' // String: Khmer weekday name
260
261
  },
@@ -448,9 +449,14 @@ Formats a Khmer date object into a string with optional custom formatting.
448
449
  **Default Format:**
449
450
 
450
451
  ```
451
- แžแŸ’แž„แŸƒ{weekday} {day}{moonPhase} แžแŸ‚{month} แž†แŸ’แž“แžถแŸ†{animalYear} {eraYear} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ {beYear}
452
+ แžแŸ’แž„แŸƒ{weekday} {day}{moonPhase} แžแŸ‚{month} แž†แŸ’แž“แžถแŸ†{animalYear} {sak} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ {beYear}
452
453
  ```
453
454
 
455
+ **Escaping Characters:**
456
+ To escape characters in the format string (so they are not interpreted as format codes), wrap them in square brackets `[]`.
457
+
458
+ Example: `[Week] w` -> "Week แžขแžถ"
459
+
454
460
  **Returns:** String (formatted Khmer date)
455
461
 
456
462
  **Example:**
@@ -471,6 +477,10 @@ console.log(momentkh.format(khmer, "c/M/D"));
471
477
 
472
478
  console.log(momentkh.format(khmer, "แžแŸ’แž„แŸƒw dN m แž†แŸ’แž“แžถแŸ†a e แž–.แžŸ.b"));
473
479
  // แžแŸ’แž„แŸƒแžขแžถ แŸฆแž€แžพแž แž…แŸแžแŸ’แžš แž†แŸ’แž“แžถแŸ†แžšแŸ„แž„ แž†แžŸแŸแž€ แž–.แžŸ.แŸขแŸฅแŸฆแŸจ
480
+
481
+ // Escaping characters (use brackets [])
482
+ console.log(momentkh.format(khmer, "[Day:] d [Month:] m"));
483
+ // Day: แŸฆ Month: แž…แŸแžแŸ’แžš
474
484
  ```
475
485
 
476
486
  ---
@@ -500,7 +510,7 @@ All 14 Khmer lunar months (including leap months).
500
510
  const { MonthIndex } = momentkh;
501
511
 
502
512
  MonthIndex.Migasir; // 0 - แž˜แžทแž‚แžŸแžทแžš
503
- MonthIndex.Bos; // 1 - แž”แžปแžŸแŸ’แžŸ
513
+ MonthIndex.Boss; // 1 - แž”แžปแžŸแŸ’แžŸ
504
514
  MonthIndex.Meak; // 2 - แž˜แžถแžƒ
505
515
  MonthIndex.Phalkun; // 3 - แž•แž›แŸ’แž‚แžปแž“
506
516
  MonthIndex.Cheit; // 4 - แž…แŸแžแŸ’แžš
@@ -536,23 +546,23 @@ AnimalYear.Cho; // 10 - ๐Ÿ• แž… (Dog)
536
546
  AnimalYear.Kor; // 11 - ๐Ÿ– แž€แžปแžš (Pig)
537
547
  ```
538
548
 
539
- #### โญ EraYear
549
+ #### โญ Sak
540
550
 
541
- The 10 era years (แžŸแŸแž€) cycle.
551
+ The 10 Saks (แžŸแŸแž€) cycle.
542
552
 
543
553
  ```javascript
544
- const { EraYear } = momentkh;
545
-
546
- EraYear.SamridhiSak; // 0 - ๐Ÿ”Ÿ แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€
547
- EraYear.AekSak; // 1 - 1๏ธโƒฃ แžฏแž€แžŸแŸแž€
548
- EraYear.ToSak; // 2 - 2๏ธโƒฃ แž‘แŸ„แžŸแŸแž€
549
- EraYear.TreiSak; // 3 - 3๏ธโƒฃ แžแŸ’แžšแžธแžŸแŸแž€
550
- EraYear.ChattvaSak; // 4 - 4๏ธโƒฃ แž…แžแŸ’แžœแžถแžŸแŸแž€
551
- EraYear.PanchaSak; // 5 - 5๏ธโƒฃ แž”แž‰แŸ’แž…แžŸแŸแž€
552
- EraYear.ChhaSak; // 6 - 6๏ธโƒฃ แž†แžŸแŸแž€
553
- EraYear.SappaSak; // 7 - 7๏ธโƒฃ แžŸแž”แŸ’แžแžŸแŸแž€
554
- EraYear.AtthaSak; // 8 - 8๏ธโƒฃ แžขแžŠแŸ’แž‹แžŸแŸแž€
555
- EraYear.NappaSak; // 9 - 9๏ธโƒฃ แž“แž–แŸ’แžœแžŸแŸแž€
554
+ const { Sak } = momentkh;
555
+
556
+ Sak.SamridhiSak; // 0 - ๐Ÿ”Ÿ แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€
557
+ Sak.AekSak; // 1 - 1๏ธโƒฃ แžฏแž€แžŸแŸแž€
558
+ Sak.ToSak; // 2 - 2๏ธโƒฃ แž‘แŸ„แžŸแŸแž€
559
+ Sak.TreiSak; // 3 - 3๏ธโƒฃ แžแŸ’แžšแžธแžŸแŸแž€
560
+ Sak.ChattvaSak; // 4 - 4๏ธโƒฃ แž…แžแŸ’แžœแžถแžŸแŸแž€
561
+ Sak.PanchaSak; // 5 - 5๏ธโƒฃ แž”แž‰แŸ’แž…แžŸแŸแž€
562
+ Sak.ChhaSak; // 6 - 6๏ธโƒฃ แž†แžŸแŸแž€
563
+ Sak.SappaSak; // 7 - 7๏ธโƒฃ แžŸแž”แŸ’แžแžŸแŸแž€
564
+ Sak.AtthaSak; // 8 - 8๏ธโƒฃ แžขแžŠแŸ’แž‹แžŸแŸแž€
565
+ Sak.NappaSak; // 9 - 9๏ธโƒฃ แž“แž–แŸ’แžœแžŸแŸแž€
556
566
  ```
557
567
 
558
568
  #### ๐Ÿ“† DayOfWeek
@@ -627,7 +637,7 @@ const khmer = momentkh.fromGregorian(2024, 12, 16);
627
637
  // Switch on month
628
638
  switch (khmer.khmer.monthIndex) {
629
639
  case MonthIndex.Migasir:
630
- case MonthIndex.Bos:
640
+ case MonthIndex.Boss:
631
641
  case MonthIndex.Meak:
632
642
  console.log("Winter months");
633
643
  break;
@@ -670,7 +680,7 @@ const month: MonthIndex = result.khmer.monthIndex;
670
680
  const date = momentkh.fromKhmer(
671
681
  15,
672
682
  MoonPhase. // โ† IDE shows: Waxing, Waning
673
- MonthIndex. // โ† IDE shows: Migasir, Bos, Meak, etc.
683
+ MonthIndex. // โ† IDE shows: Migasir, Boss, Meak, etc.
674
684
  2568
675
685
  );
676
686
  ```
@@ -785,13 +795,13 @@ console.log(at.khmer.animalYear); // 'แžšแž€แžถ' (Rooster) - Changed!
785
795
 
786
796
  ---
787
797
 
788
- ### Era Year (Sak)
798
+ ### Sak
789
799
 
790
800
  **Full Name:** แžŸแŸแž€ (Sak, Era)
791
801
  **Cycle:** 10 years
792
802
  **When it increases:** At **midnight (00:00) of the last day** of Khmer New Year celebration (Lerng Sak - แžแŸ’แž„แŸƒแžกแžพแž„แžŸแŸแž€)
793
803
 
794
- **The 10 Eras (in order):**
804
+ **The 10 Saks (in order):**
795
805
  | Index | Khmer | Romanization |
796
806
  |-------|-------|--------------|
797
807
  | 0 | แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€ | Samridhi Sak |
@@ -809,19 +819,19 @@ console.log(at.khmer.animalYear); // 'แžšแž€แžถ' (Rooster) - Changed!
809
819
 
810
820
  - ๐ŸŽ‰ **Day 1:** Moha Songkran (แž˜แž แžถแžŸแž„แŸ’แžšแŸ’แž€แžถแž“แŸ’แž) - New Year's Day
811
821
  - ๐ŸŽŠ **Day 2:** Virak Wanabat (แžœแžธแžšแŸˆแžœแŸแž“แž”แž) - Second day
812
- - โญ **Day 3 or 4:** Lerng Sak (แžแŸ’แž„แŸƒแžกแžพแž„แžŸแŸแž€) - Last day & Era change day
822
+ - โญ **Day 3 or 4:** Lerng Sak (แžแŸ’แž„แŸƒแžกแžพแž„แžŸแŸแž€) - Last day & Sak change day
813
823
 
814
824
  **Example:**
815
825
 
816
826
  ```javascript
817
827
  // 2024 New Year is on April 13, 22:24
818
- // Lerng Sak (Era change) is typically 3-4 days later at midnight
828
+ // Lerng Sak (Sak change) is typically 3-4 days later at midnight
819
829
 
820
830
  const newYearDay = momentkh.fromGregorian(2024, 4, 13, 23, 0);
821
- console.log(newYearDay.khmer.eraYear); // 'แž†แžŸแŸแž€' (still old era)
831
+ console.log(newYearDay.khmer.sak); // 'แž†แžŸแŸแž€' (still old sak)
822
832
 
823
833
  const lerngSakDay = momentkh.fromGregorian(2024, 4, 17, 0, 0); // Midnight of Lerng Sak
824
- console.log(lerngSakDay.khmer.eraYear); // 'แžŸแž”แŸ’แžแžŸแŸแž€' (new era!)
834
+ console.log(lerngSakDay.khmer.sak); // 'แžŸแž”แŸ’แžแžŸแŸแž€' (new sak!)
825
835
  ```
826
836
 
827
837
  ---
@@ -834,16 +844,16 @@ console.log(lerngSakDay.khmer.eraYear); // 'แžŸแž”แŸ’แžแžŸแŸแž€' (new era!)
834
844
  | --------------- | ------------------------ | -------------------- |
835
845
  | **BE Year** | 00:00 แž“แŸ…แžแŸ’แž„แŸƒแŸกแžšแŸ„แž… แžแŸ‚แž–แžทแžŸแžถแž | May 23, 2024 00:00 |
836
846
  | **Animal Year** | แž˜แŸ‰แŸ„แž„ แž“แžทแž„ แž“แžถแž‘แžธแž‘แŸแžœแžแžถแž…แžปแŸ‡ | April 13, 2024 22:17 |
837
- | **Era Year** | 00:00 แž“แŸ…แžแŸ’แž„แŸƒแžกแžพแž„แžŸแŸแž€ | April 16, 2024 00:00 |
847
+ | **Sak** | 00:00 แž“แŸ…แžแŸ’แž„แŸƒแžกแžพแž„แžŸแŸแž€ | April 16, 2024 00:00 |
838
848
 
839
849
  **Visual Timeline for 2024:**
840
850
 
841
851
  ```
842
- April 13, 22:23 โ†’ BE 2567, Monkey (แžœแž€), Old Era (แž†แžŸแŸแž€)
843
- April 13, 22:24 โ†’ BE 2567, Rooster (แžšแž€แžถ), Old Era (แž†แžŸแŸแž€) โ† Animal Year changes
844
- April 17, 00:00 โ†’ BE 2567, Rooster (แžšแž€แžถ), New Era (แžŸแž”แŸ’แžแžŸแŸแž€) โ† Era changes
845
- May 22, 23:59 โ†’ BE 2567, Rooster (แžšแž€แžถ), New Era (แžŸแž”แŸ’แžแžŸแŸแž€)
846
- May 23, 00:00 โ†’ BE 2568, Rooster (แžšแž€แžถ), New Era (แžŸแž”แŸ’แžแžŸแŸแž€) โ† BE Year changes
852
+ April 13, 22:16 โ†’ BE 2567, Monkey (แžœแž€), Old Sak (แž†แžŸแŸแž€)
853
+ April 13, 22:17 โ†’ BE 2567, Rooster (แžšแž€แžถ), Old Sak (แž†แžŸแŸแž€) โ† Animal Year changes
854
+ April 17, 00:00 โ†’ BE 2567, Rooster (แžšแž€แžถ), New Sak (แžŸแž”แŸ’แžแžŸแŸแž€) โ† Sak changes
855
+ May 22, 23:59 โ†’ BE 2567, Rooster (แžšแž€แžถ), New Sak (แžŸแž”แŸ’แžแžŸแŸแž€)
856
+ May 23, 00:00 โ†’ BE 2568, Rooster (แžšแž€แžถ), New Sak (แžŸแž”แŸ’แžแžŸแŸแž€) โ† BE Year changes
847
857
  ```
848
858
 
849
859
  ---
@@ -852,43 +862,67 @@ May 23, 00:00 โ†’ BE 2568, Rooster (แžšแž€แžถ), New Era (แžŸแž”แŸ’แžแžŸแŸแž€
852
862
 
853
863
  Complete list of format tokens for the `format()` function:
854
864
 
855
- | Token | Output | Description | Example |
856
- | ---------------------- | ----------------- | --------------------------- | --------------------- |
857
- | **๐Ÿ“… Date Components** |
858
- | `W` | แžแŸ’แž„แŸƒแž“แŸƒแžŸแž”แŸ’แžแžถแž แŸแž–แŸแž‰ | Weekday name (full) | แžขแžถแž‘แžทแžแŸ’แž™, แž…แž“แŸ’แž‘, แžขแž„แŸ’แž‚แžถแžš |
859
- | `w` | แžแŸ’แž„แŸƒแž“แŸƒแžŸแž”แŸ’แžแžถแž แŸแžแŸ’แž›แžธ | Weekday name (short) | แžขแžถ, แž…, แžข |
860
- | `d` | แžแŸ’แž„แŸƒแž‘แžธ | Lunar day number | แŸก, แŸฅ, แŸกแŸฅ |
861
- | `D` | แžแŸ’แž„แŸƒแž‘แžธ (แŸขแžแŸ’แž‘แž„แŸ‹) | Lunar day (zero-padded) | แŸ แŸก, แŸ แŸฅ, แŸกแŸฅ |
862
- | **๐ŸŒ™ Moon Phase** |
863
- | `n` | แž€แžพแž/แžšแŸ„แž… (แžแŸ’แž›แžธ) | Moon phase (short) | แž€, แžš |
864
- | `N` | แž€แžพแž/แžšแŸ„แž… (แž–แŸแž‰) | Moon phase (full) | แž€แžพแž, แžšแŸ„แž… |
865
- | `o` | แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถ | Moon day symbol | แงก, แงข, แงฃ ... แงฟ |
866
- | **๐Ÿ“† Month Names** |
867
- | `m` | แžแŸ‚แž…แž“แŸ’แž‘แž‚แžแžท | Lunar month name | แž˜แžทแž‚แžŸแžทแžš, แž”แžปแžŸแŸ’แžŸ, แž…แŸแžแŸ’แžš |
868
- | `M` | แžแŸ‚แžŸแžปแžšแžทแž™แž‚แžแžท | Solar month name | แž˜แž€แžšแžถ, แž€แžปแž˜แŸ’แž—แŸˆ, แž˜แŸแžŸแžถ |
869
- | **โฐ Year Components** |
870
- | `a` | แž†แŸ’แž“แžถแŸ†แžŸแžแŸ’แžœ | Animal year | แž‡แžผแž, แž†แŸ’แž›แžผแžœ, แžšแŸ„แž„ |
871
- | `e` | แžŸแŸแž€ | Era year | แžฏแž€แžŸแŸแž€, แž‘แŸ„แžŸแŸแž€ |
872
- | `b` | แž–.แžŸ. | Buddhist Era year | แŸขแŸฅแŸฆแŸจ |
873
- | `c` | แž‚.แžŸ. | Common Era (Gregorian) year | แŸขแŸ แŸขแŸค |
874
- | `j` | แž….แžŸ. | Jolak Sakaraj year | แŸกแŸฃแŸจแŸฆ |
865
+ | Token | Output | Description | Example |
866
+ | -------------------------- | ----------------- | ----------------------------------- | --------------------- |
867
+ | **๐Ÿ“… Weekday** |
868
+ | `W` | แžแŸ’แž„แŸƒแž“แŸƒแžŸแž”แŸ’แžแžถแž แŸแž–แŸแž‰ | Weekday name (full) | แžขแžถแž‘แžทแžแŸ’แž™, แž…แž“แŸ’แž‘, แžขแž„แŸ’แž‚แžถแžš |
869
+ | `w` | แžแŸ’แž„แŸƒแž“แŸƒแžŸแž”แŸ’แžแžถแž แŸแžแŸ’แž›แžธ | Weekday name (short) | แžขแžถ, แž…, แžข |
870
+ | **๐ŸŒ™ Lunar Day** |
871
+ | `d` | แžแŸ’แž„แŸƒแž‘แžธ | Lunar day number | แŸก, แŸฅ, แŸกแŸฅ |
872
+ | `D` | แžแŸ’แž„แŸƒแž‘แžธ (แŸขแžแŸ’แž‘แž„แŸ‹) | Lunar day (zero-padded) | แŸ แŸก, แŸ แŸฅ, แŸกแŸฅ |
873
+ | `dr` | Day | Lunar day (Latin) | 1, 5, 15 |
874
+ | `Dr` | Day (0) | Lunar day (padded Latin) | 01, 05, 15 |
875
+ | **๐Ÿ“† Gregorian Day** |
876
+ | `ds` | แžแŸ’แž„แŸƒแž‘แžธ | Gregorian day number | แŸก, แŸฅ, แŸกแŸค |
877
+ | `Ds` | แžแŸ’แž„แŸƒแž‘แžธ (แŸขแžแŸ’แž‘แž„แŸ‹) | Gregorian day (zero-padded) | แŸ แŸก, แŸ แŸฅ, แŸกแŸค |
878
+ | `dsr` | Day | Gregorian day (Latin) | 1, 5, 14 |
879
+ | `Dsr` | Day (0) | Gregorian day (padded Latin) | 01, 05, 14 |
880
+ | **๐ŸŒ™ Moon Phase** |
881
+ | `n` | แž€แžพแž/แžšแŸ„แž… (แžแŸ’แž›แžธ) | Moon phase (short) | แž€, แžš |
882
+ | `N` | แž€แžพแž/แžšแŸ„แž… (แž–แŸแž‰) | Moon phase (full) | แž€แžพแž, แžšแŸ„แž… |
883
+ | `o` | แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถ | Moon day symbol | แงก, แงข, แงฃ ... แงฟ |
884
+ | **๐Ÿ“† Month Names** |
885
+ | `m` | แžแŸ‚แž…แž“แŸ’แž‘แž‚แžแžท | Lunar month name | แž˜แžทแž‚แžŸแžทแžš, แž”แžปแžŸแŸ’แžŸ, แž…แŸแžแŸ’แžš |
886
+ | `ms` | แžแŸ‚ (แžŸแž„แŸ’แžแŸแž”) | Lunar month name (abbreviated) | แž˜แžท, แž”แžป |
887
+ | `M` | แžแŸ‚แžŸแžปแžšแžทแž™แž‚แžแžท | Solar (Gregorian) month name | แž˜แž€แžšแžถ, แž€แžปแž˜แŸ’แž—แŸˆ, แž˜แŸแžŸแžถ |
888
+ | `Ms` | แžแŸ‚ (แžŸแž„แŸ’แžแŸแž”) | Solar month name (abbreviated) | แž˜แž€, แž€แž˜ |
889
+ | **โฐ Year Components** |
890
+ | `a` | แž†แŸ’แž“แžถแŸ†แžŸแžแŸ’แžœ | Animal year | แž‡แžผแž, แž†แŸ’แž›แžผแžœ, แžšแŸ„แž„ |
891
+ | `as` | แž†แŸ’แž“แžถแŸ† (แžšแžผแž”) | Animal year emoji | ๐Ÿ€, ๐Ÿ‚, ๐Ÿ‰ |
892
+ | `e` | แžŸแŸแž€ | Sak | แžฏแž€แžŸแŸแž€, แž‘แŸ„แžŸแŸแž€ |
893
+ | `b` | แž–.แžŸ. | Buddhist Era year | แŸขแŸฅแŸฆแŸจ |
894
+ | `br` | BE | Buddhist Era year (Latin) | 2568 |
895
+ | `c` | แž‚.แžŸ. | Common Era (Gregorian) year | แŸขแŸ แŸขแŸค |
896
+ | `cr` | CE | Common Era year (Latin) | 2024 |
897
+ | `j` | แž….แžŸ. | Jolak Sakaraj year | แŸกแŸฃแŸจแŸฆ |
898
+ | `jr` | JS | Jolak Sakaraj year (Latin) | 1386 |
875
899
 
876
900
  **Format Examples:**
877
901
 
878
902
  ```javascript
879
- const khmer = momentkh.fromGregorian(2024, 4, 14);
903
+ const khmer = momentkh.fromGregorian(2025, 5, 3);
880
904
 
881
905
  console.log(momentkh.format(khmer, "W, dN แžแŸ‚m แž–.แžŸ.b"));
882
- // แžขแžถแž‘แžทแžแŸ’แž™, แŸฆแž€แžพแž แžแŸ‚แž…แŸแžแŸ’แžš แž–.แžŸ.แŸขแŸฅแŸฆแŸจ
906
+ // แžŸแŸ…แžšแŸ, แŸงแž€แžพแž แžแŸ‚แž–แžทแžŸแžถแž แž–.แžŸ.แŸขแŸฅแŸฆแŸจ
883
907
 
884
- console.log(momentkh.format(khmer, "c/M/D แžแŸ’แž„แŸƒw"));
885
- // แŸขแŸ แŸขแŸค/แž˜แŸแžŸแžถ/แŸกแŸค แžแŸ’แž„แŸƒแžขแžถ
908
+ console.log(momentkh.format(khmer, "c/M/Ds แžแŸ’แž„แŸƒw"));
909
+ // แŸขแŸ แŸขแŸฅ/แžงแžŸแž—แžถ/แŸ แŸฃ แžแŸ’แž„แŸƒแžŸ
886
910
 
887
- console.log(momentkh.format(khmer, "แž†แŸ’แž“แžถแŸ†a e แžแŸ‚m แžแŸ’แž„แŸƒแž‘แžธd แž˜แžถแž“แž–แŸ’แžšแŸ‡แž…แž“แŸ’แž‘N"));
888
- // แž†แŸ’แž“แžถแŸ†แžšแŸ„แž„ แž†แžŸแŸแž€ แžแŸ‚แž…แŸแžแŸ’แžš แžแŸ’แž„แŸƒแž‘แžธแŸฆ แž˜แžถแž“แž–แŸ’แžšแŸ‡แž…แž“แŸ’แž‘แž€แžพแž
911
+ console.log(momentkh.format(khmer, "แž†แŸ’แž“แžถแŸ†a e แžแŸ‚m แžแŸ’แž„แŸƒแž‘แžธDN"));
912
+ // แž†แŸ’แž“แžถแŸ†แž˜แŸ’แžŸแžถแž‰แŸ‹ แžŸแž”แŸ’แžแžŸแŸแž€ แžแŸ‚แž–แžทแžŸแžถแž แžแŸ’แž„แŸƒแž‘แžธแŸ แŸงแž€แžพแž
889
913
 
890
914
  console.log(momentkh.format(khmer, "แžแŸ’แž„แŸƒแž‘แžธ o"));
891
- // แžแŸ’แž„แŸƒแž‘แžธ แงฆ (moon symbol for day 6 waxing)
915
+ // แžแŸ’แž„แŸƒแž‘แžธ แงง
916
+
917
+ // Using new Gregorian day format codes
918
+ console.log(momentkh.format(khmer, "แžแŸ’แž„แŸƒแž‘แžธds แžแŸ‚M แž†แŸ’แž“แžถแŸ†c"));
919
+ // แžแŸ’แž„แŸƒแž‘แžธแŸฃ แžแŸ‚แžงแžŸแž—แžถ แž†แŸ’แž“แžถแŸ†แŸขแŸ แŸขแŸฅ
920
+
921
+ console.log(momentkh.format(khmer, "dsr/M/cr"));
922
+ // 3/แžงแžŸแž—แžถ/2025
923
+
924
+ console.log(momentkh.format(khmer, "Dsr-M-cr"));
925
+ // 03-แžงแžŸแž—แžถ-2025
892
926
  ```
893
927
 
894
928
  ---
@@ -915,8 +949,13 @@ momentkh.constants.AnimalYearNames;
915
949
  // ['แž‡แžผแž', 'แž†แŸ’แž›แžผแžœ', 'แžแžถแž›', 'แžแŸ„แŸ‡', 'แžšแŸ„แž„', 'แž˜แŸ’แžŸแžถแž‰แŸ‹',
916
950
  // 'แž˜แž˜แžธ', 'แž˜แž˜แŸ‚', 'แžœแž€', 'แžšแž€แžถ', 'แž…', 'แž€แžปแžš']
917
951
 
918
- // Era year names array (indices 0-9)
919
- momentkh.constants.EraYearNames;
952
+ // Animal year emojis array (indices 0-11)
953
+ momentkh.constants.AnimalYearEmojis;
954
+ // ['๐Ÿ€', '๐Ÿ‚', '๐Ÿ…', '๐Ÿ‡', '๐Ÿ‰', '๐Ÿ',
955
+ // '๐ŸŽ', '๐Ÿ', '๐Ÿ’', '๐Ÿ“', '๐Ÿ•', '๐Ÿ–']
956
+
957
+ // Sak names array (indices 0-9)
958
+ momentkh.constants.SakNames;
920
959
  // ['แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€', 'แžฏแž€แžŸแŸแž€', 'แž‘แŸ„แžŸแŸแž€', 'แžแŸ’แžšแžธแžŸแŸแž€', 'แž…แžแŸ’แžœแžถแžŸแŸแž€',
921
960
  // 'แž”แž‰แŸ’แž…แžŸแŸแž€', 'แž†แžŸแŸแž€', 'แžŸแž”แŸ’แžแžŸแŸแž€', 'แžขแžŠแŸ’แž‹แžŸแŸแž€', 'แž“แž–แŸ’แžœแžŸแŸแž€']
922
961
 
@@ -925,7 +964,7 @@ momentkh.constants.WeekdayNames;
925
964
  // ['แžขแžถแž‘แžทแžแŸ’แž™', 'แž…แž“แŸ’แž‘', 'แžขแž„แŸ’แž‚แžถแžš', 'แž–แžปแž’', 'แž–แŸ’แžšแž แžŸแŸ’แž”แžแžทแŸ', 'แžŸแžปแž€แŸ’แžš', 'แžŸแŸ…แžšแŸ']
926
965
 
927
966
  // Moon phase names array (indices 0-1)
928
- momentkh.constants.MoonStatusNames;
967
+ momentkh.constants.MoonPhaseNames;
929
968
  // ['แž€แžพแž', 'แžšแŸ„แž…']
930
969
  ```
931
970
 
@@ -960,7 +999,7 @@ npm install @thyrith/momentkh --save
960
999
  **After (v2):**
961
1000
 
962
1001
  ```bash
963
- # Just download momentkh.js - no npm dependencies!
1002
+ npm install @thyrith/momentkh
964
1003
  ```
965
1004
 
966
1005
  ### Import Changes
@@ -1126,7 +1165,7 @@ console.log(
1126
1165
  );
1127
1166
  console.log("BE Year:", khmer.khmer.beYear);
1128
1167
  console.log("Animal Year:", khmer.khmer.animalYear);
1129
- console.log("Era:", khmer.khmer.eraYear);
1168
+ console.log("Sak:", khmer.khmer.sak);
1130
1169
  console.log("Month:", khmer.khmer.monthName);
1131
1170
  console.log(
1132
1171
  "Day:",
@@ -1137,7 +1176,7 @@ console.log(
1137
1176
  // Gregorian: 14/4/2024
1138
1177
  // BE Year: 2568
1139
1178
  // Animal Year: แžšแŸ„แž„
1140
- // Era: แž†แžŸแŸแž€
1179
+ // Sak: แž†แžŸแŸแž€
1141
1180
  // Month: แž…แŸแžแŸ’แžš
1142
1181
  // Day: 6แž€แžพแž
1143
1182
  ```
@@ -1274,7 +1313,7 @@ for (let day = 20; day <= 25; day++) {
1274
1313
 
1275
1314
  MIT License - Same as original momentkh
1276
1315
 
1277
- Copyright (c) 2024
1316
+ Copyright (c) 2025
1278
1317
 
1279
1318
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
1280
1319
 
@@ -1322,12 +1361,11 @@ node test_specific_dates.js
1322
1361
 
1323
1362
  ## ๐Ÿ“ž Support
1324
1363
 
1325
- - **Documentation:** See examples folder (`newYearMoment.js`, `index.html`)
1326
1364
  - **Issues:** [GitHub Issues](https://github.com/ThyrithSor/momentkh/issues)
1327
1365
  - **Comparison:** Check behavior against original momentkh for compatibility
1366
+ - **Contact:** [E-mail](mailto:me@thyrith.com)
1328
1367
 
1329
1368
  ---
1330
1369
 
1331
- **Version:** 3.0.0
1332
- **Last Updated:** December 2024
1333
- **Status:** Production Ready โœ…
1370
+ **Version:** 3.0.3
1371
+ **Last Updated:** December 2025
@@ -45,7 +45,7 @@ export declare enum AnimalYear {
45
45
  Cho = 10,// แž… - Dog
46
46
  Kor = 11
47
47
  }
48
- export declare enum EraYear {
48
+ export declare enum Sak {
49
49
  SamridhiSak = 0,// แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€
50
50
  AekSak = 1,// แžฏแž€แžŸแŸแž€
51
51
  ToSak = 2,// แž‘แŸ„แžŸแŸแž€
@@ -85,8 +85,8 @@ export interface KhmerDateInfo {
85
85
  jsYear: number;
86
86
  animalYear: AnimalYear;
87
87
  animalYearName: string;
88
- eraYear: EraYear;
89
- eraYearName: string;
88
+ sak: Sak;
89
+ sakName: string;
90
90
  dayOfWeek: DayOfWeek;
91
91
  dayOfWeekName: string;
92
92
  }
@@ -138,10 +138,18 @@ export interface Constants {
138
138
  LunarMonths: Record<string, number>;
139
139
  LunarMonthNames: string[];
140
140
  SolarMonthNames: string[];
141
+ SolarMonthAbbreviationNames: string[];
142
+ LunarMonthAbbreviationNames: string[];
141
143
  AnimalYearNames: string[];
142
- EraYearNames: string[];
144
+ AnimalYearEmojis: string[];
145
+ SakNames: string[];
143
146
  WeekdayNames: string[];
144
- MoonStatusNames: string[];
147
+ WeekdayNamesShort: string[];
148
+ MoonPhaseNames: string[];
149
+ MoonPhaseShort: string[];
150
+ MoonDaySymbols: string[];
151
+ KhmerNumerals: Record<string, string>;
152
+ khNewYearMoments: Record<string, string>;
145
153
  }
146
154
  declare class KhmerDate {
147
155
  day: number;
@@ -165,10 +173,13 @@ export declare const constants: {
165
173
  LunarMonths: Record<string, number>;
166
174
  LunarMonthNames: string[];
167
175
  SolarMonthNames: string[];
176
+ SolarMonthAbbreviationNames: string[];
177
+ LunarMonthAbbreviationNames: string[];
168
178
  AnimalYearNames: string[];
169
- EraYearNames: string[];
179
+ AnimalYearEmojis: string[];
180
+ SakNames: string[];
170
181
  WeekdayNames: string[];
171
- MoonStatusNames: string[];
182
+ MoonPhaseNames: string[];
172
183
  };
173
184
  declare const _default: {
174
185
  fromGregorian: typeof fromGregorian;
@@ -181,15 +192,18 @@ declare const _default: {
181
192
  LunarMonths: Record<string, number>;
182
193
  LunarMonthNames: string[];
183
194
  SolarMonthNames: string[];
195
+ SolarMonthAbbreviationNames: string[];
196
+ LunarMonthAbbreviationNames: string[];
184
197
  AnimalYearNames: string[];
185
- EraYearNames: string[];
198
+ AnimalYearEmojis: string[];
199
+ SakNames: string[];
186
200
  WeekdayNames: string[];
187
- MoonStatusNames: string[];
201
+ MoonPhaseNames: string[];
188
202
  };
189
203
  MoonPhase: typeof MoonPhase;
190
204
  MonthIndex: typeof MonthIndex;
191
205
  AnimalYear: typeof AnimalYear;
192
- EraYear: typeof EraYear;
206
+ Sak: typeof Sak;
193
207
  DayOfWeek: typeof DayOfWeek;
194
208
  };
195
209
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"momentkh.d.ts","sourceRoot":"","sources":["../momentkh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"momentkh.d.ts","sourceRoot":"","sources":["../momentkh.ts"],"names":[],"mappings":"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"}
package/dist/momentkh.js CHANGED
@@ -13,7 +13,7 @@
13
13
  * @license MIT
14
14
  */
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.constants = exports.DayOfWeek = exports.EraYear = exports.AnimalYear = exports.MonthIndex = exports.MoonPhase = void 0;
16
+ exports.constants = exports.DayOfWeek = exports.Sak = exports.AnimalYear = exports.MonthIndex = exports.MoonPhase = void 0;
17
17
  exports.fromGregorian = fromGregorian;
18
18
  exports.fromKhmer = fromKhmer;
19
19
  exports.getNewYear = getNewYear;
@@ -61,19 +61,19 @@ var AnimalYear;
61
61
  AnimalYear[AnimalYear["Cho"] = 10] = "Cho";
62
62
  AnimalYear[AnimalYear["Kor"] = 11] = "Kor"; // แž€แžปแžš - Pig
63
63
  })(AnimalYear || (exports.AnimalYear = AnimalYear = {}));
64
- var EraYear;
65
- (function (EraYear) {
66
- EraYear[EraYear["SamridhiSak"] = 0] = "SamridhiSak";
67
- EraYear[EraYear["AekSak"] = 1] = "AekSak";
68
- EraYear[EraYear["ToSak"] = 2] = "ToSak";
69
- EraYear[EraYear["TreiSak"] = 3] = "TreiSak";
70
- EraYear[EraYear["ChattvaSak"] = 4] = "ChattvaSak";
71
- EraYear[EraYear["PanchaSak"] = 5] = "PanchaSak";
72
- EraYear[EraYear["ChhaSak"] = 6] = "ChhaSak";
73
- EraYear[EraYear["SappaSak"] = 7] = "SappaSak";
74
- EraYear[EraYear["AtthaSak"] = 8] = "AtthaSak";
75
- EraYear[EraYear["NappaSak"] = 9] = "NappaSak"; // แž“แž–แŸ’แžœแžŸแŸแž€
76
- })(EraYear || (exports.EraYear = EraYear = {}));
64
+ var Sak;
65
+ (function (Sak) {
66
+ Sak[Sak["SamridhiSak"] = 0] = "SamridhiSak";
67
+ Sak[Sak["AekSak"] = 1] = "AekSak";
68
+ Sak[Sak["ToSak"] = 2] = "ToSak";
69
+ Sak[Sak["TreiSak"] = 3] = "TreiSak";
70
+ Sak[Sak["ChattvaSak"] = 4] = "ChattvaSak";
71
+ Sak[Sak["PanchaSak"] = 5] = "PanchaSak";
72
+ Sak[Sak["ChhaSak"] = 6] = "ChhaSak";
73
+ Sak[Sak["SappaSak"] = 7] = "SappaSak";
74
+ Sak[Sak["AtthaSak"] = 8] = "AtthaSak";
75
+ Sak[Sak["NappaSak"] = 9] = "NappaSak"; // แž“แž–แŸ’แžœแžŸแŸแž€
76
+ })(Sak || (exports.Sak = Sak = {}));
77
77
  var DayOfWeek;
78
78
  (function (DayOfWeek) {
79
79
  DayOfWeek[DayOfWeek["Sunday"] = 0] = "Sunday";
@@ -102,11 +102,24 @@ const SolarMonthNames = [
102
102
  'แž˜แž€แžšแžถ', 'แž€แžปแž˜แŸ’แž—แŸˆ', 'แž˜แžธแž“แžถ', 'แž˜แŸแžŸแžถ', 'แžงแžŸแž—แžถ', 'แž˜แžทแžแžปแž“แžถ',
103
103
  'แž€แž€แŸ’แž€แžŠแžถ', 'แžŸแžธแž แžถ', 'แž€แž‰แŸ’แž‰แžถ', 'แžแžปแž›แžถ', 'แžœแžทแž…แŸ’แž†แžทแž€แžถ', 'แž’แŸ’แž“แžผ'
104
104
  ];
105
+ const SolarMonthAbbreviationNames = [
106
+ 'แž˜แž€', 'แž€แž˜', 'แž˜แž“', 'แž˜แžŸ', 'แžงแžŸ', 'แž˜แž',
107
+ 'แž€แžŠ', 'แžŸแž ', 'แž€แž‰', 'แžแž›', 'แžœแž€', 'แž’แž“'
108
+ ];
109
+ const LunarMonthAbbreviationNames = [
110
+ 'แž˜แžท', 'แž”แžป', 'แž˜แžถ', 'แž•แž›', 'แž…แŸ', 'แž–แžท',
111
+ 'แž‡แŸ', 'แžขแžถ', 'แžŸแŸ’แžš', 'แž—', 'แžข', 'แž€',
112
+ 'แž”แž‹', 'แž‘แžปแžแžท'
113
+ ];
105
114
  const AnimalYearNames = [
106
115
  'แž‡แžผแž', 'แž†แŸ’แž›แžผแžœ', 'แžแžถแž›', 'แžแŸ„แŸ‡', 'แžšแŸ„แž„', 'แž˜แŸ’แžŸแžถแž‰แŸ‹',
107
116
  'แž˜แž˜แžธ', 'แž˜แž˜แŸ‚', 'แžœแž€', 'แžšแž€แžถ', 'แž…', 'แž€แžปแžš'
108
117
  ];
109
- const EraYearNames = [
118
+ const AnimalYearEmojis = [
119
+ '๐Ÿ€', '๐Ÿ‚', '๐Ÿ…', '๐Ÿ‡', '๐Ÿ‰', '๐Ÿ',
120
+ '๐ŸŽ', '๐Ÿ', '๐Ÿ’', '๐Ÿ“', '๐Ÿ•', '๐Ÿ–'
121
+ ];
122
+ const SakNames = [
110
123
  'แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€', 'แžฏแž€แžŸแŸแž€', 'แž‘แŸ„แžŸแŸแž€', 'แžแŸ’แžšแžธแžŸแŸแž€', 'แž…แžแŸ’แžœแžถแžŸแŸแž€',
111
124
  'แž”แž‰แŸ’แž…แžŸแŸแž€', 'แž†แžŸแŸแž€', 'แžŸแž”แŸ’แžแžŸแŸแž€', 'แžขแžŠแŸ’แž‹แžŸแŸแž€', 'แž“แž–แŸ’แžœแžŸแŸแž€'
112
125
  ];
@@ -114,8 +127,8 @@ const WeekdayNames = [
114
127
  'แžขแžถแž‘แžทแžแŸ’แž™', 'แž…แž“แŸ’แž‘', 'แžขแž„แŸ’แž‚แžถแžš', 'แž–แžปแž’', 'แž–แŸ’แžšแž แžŸแŸ’แž”แžแžทแŸ', 'แžŸแžปแž€แŸ’แžš', 'แžŸแŸ…แžšแŸ'
115
128
  ];
116
129
  const WeekdayNamesShort = ['แžขแžถ', 'แž…', 'แžข', 'แž–', 'แž–แŸ’แžš', 'แžŸแžป', 'แžŸ'];
117
- const MoonStatusNames = ['แž€แžพแž', 'แžšแŸ„แž…'];
118
- const MoonStatusShort = ['แž€', 'แžš'];
130
+ const MoonPhaseNames = ['แž€แžพแž', 'แžšแŸ„แž…'];
131
+ const MoonPhaseShort = ['แž€', 'แžš'];
119
132
  const MoonDaySymbols = [
120
133
  'แงก', 'แงข', 'แงฃ', 'แงค', 'แงฅ', 'แงฆ', 'แงง', 'แงจ', 'แงฉ', 'แงช',
121
134
  'แงซ', 'แงฌ', 'แงญ', 'แงฎ', 'แงฏ', 'แงฑ', 'แงฒ', 'แงณ', 'แงด', 'แงต',
@@ -655,7 +668,7 @@ class KhmerDate {
655
668
  return result;
656
669
  }
657
670
  toString() {
658
- return `${this.day}${MoonStatusNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
671
+ return `${this.day}${MoonPhaseNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
659
672
  }
660
673
  }
661
674
  // ============================================================================
@@ -806,7 +819,7 @@ function gregorianToKhmerInternal(year, month, day, hour = 0, minute = 0, second
806
819
  jsYear++;
807
820
  }
808
821
  }
809
- const eraYearIndex = ((jsYear % 10) + 10) % 10;
822
+ const sakIndex = ((jsYear % 10) + 10) % 10;
810
823
  const dayOfWeek = getDayOfWeek(year, month, day);
811
824
  const khmerDate = new KhmerDate(khmerDayInfo.day, khmerDayInfo.moonPhase, khmerMonth, beYear);
812
825
  return {
@@ -814,15 +827,15 @@ function gregorianToKhmerInternal(year, month, day, hour = 0, minute = 0, second
814
827
  khmer: {
815
828
  day: khmerDayInfo.day,
816
829
  moonPhase: khmerDayInfo.moonPhase,
817
- moonPhaseName: MoonStatusNames[khmerDayInfo.moonPhase],
830
+ moonPhaseName: MoonPhaseNames[khmerDayInfo.moonPhase],
818
831
  monthIndex: khmerMonth,
819
832
  monthName: LunarMonthNames[khmerMonth],
820
833
  beYear: beYear,
821
834
  jsYear: jsYear,
822
835
  animalYear: animalYearIndex,
823
836
  animalYearName: AnimalYearNames[animalYearIndex],
824
- eraYear: eraYearIndex,
825
- eraYearName: EraYearNames[eraYearIndex],
837
+ sak: sakIndex,
838
+ sakName: SakNames[sakIndex],
826
839
  dayOfWeek: dayOfWeek,
827
840
  dayOfWeekName: WeekdayNames[dayOfWeek]
828
841
  },
@@ -974,29 +987,46 @@ function formatKhmer(khmerData, formatString) {
974
987
  // Default format
975
988
  const { khmer } = khmerData;
976
989
  const moonDay = `${khmer.day}${khmer.moonPhaseName}`;
977
- return toKhmerNumeral(`แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.eraYearName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`);
990
+ return toKhmerNumeral(`แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.sakName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`);
978
991
  }
979
992
  // Custom format
980
993
  const formatRules = {
981
994
  'W': () => khmerData.khmer.dayOfWeekName,
982
995
  'w': () => WeekdayNamesShort[khmerData.gregorian.dayOfWeek],
983
- 'd': () => khmerData.khmer.day,
984
- 'D': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
985
- 'n': () => MoonStatusShort[khmerData.khmer.moonPhase],
996
+ 'd': () => toKhmerNumeral(khmerData.khmer.day),
997
+ 'D': () => toKhmerNumeral((khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day),
998
+ 'dr': () => khmerData.khmer.day,
999
+ 'Dr': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
1000
+ 'ds': () => toKhmerNumeral(khmerData.gregorian.day),
1001
+ 'Ds': () => toKhmerNumeral((khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day),
1002
+ 'dsr': () => khmerData.gregorian.day,
1003
+ 'Dsr': () => (khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day,
1004
+ 'n': () => MoonPhaseShort[khmerData.khmer.moonPhase],
986
1005
  'N': () => khmerData.khmer.moonPhaseName,
987
1006
  'o': () => MoonDaySymbols[khmerData._khmerDateObj.getDayNumber()],
988
1007
  'm': () => khmerData.khmer.monthName,
989
1008
  'M': () => SolarMonthNames[khmerData.gregorian.month - 1],
990
1009
  'a': () => khmerData.khmer.animalYearName,
991
- 'e': () => khmerData.khmer.eraYearName,
992
- 'b': () => khmerData.khmer.beYear,
993
- 'c': () => khmerData.gregorian.year,
994
- 'j': () => khmerData.khmer.jsYear
1010
+ 'as': () => AnimalYearEmojis[khmerData.khmer.animalYear],
1011
+ 'e': () => khmerData.khmer.sakName,
1012
+ 'b': () => toKhmerNumeral(khmerData.khmer.beYear),
1013
+ 'br': () => khmerData.khmer.beYear,
1014
+ 'c': () => toKhmerNumeral(khmerData.gregorian.year),
1015
+ 'cr': () => khmerData.gregorian.year,
1016
+ 'j': () => toKhmerNumeral(khmerData.khmer.jsYear),
1017
+ 'jr': () => khmerData.khmer.jsYear,
1018
+ 'Ms': () => SolarMonthAbbreviationNames[khmerData.gregorian.month - 1],
1019
+ 'ms': () => LunarMonthAbbreviationNames[khmerData.khmer.monthIndex]
995
1020
  };
996
- const regex = new RegExp(Object.keys(formatRules).join('|'), 'g');
997
- const result = formatString.replace(regex, match => {
998
- const value = formatRules[match]();
999
- return toKhmerNumeral(String(value));
1021
+ // Sort keys by length descending to ensure longer tokens (like 'Ms', 'ms') are matched before shorter ones (like 'M', 'm')
1022
+ const sortedKeys = Object.keys(formatRules).sort((a, b) => b.length - a.length);
1023
+ const regex = new RegExp(`\\[([^\\]]+)\\]|(${sortedKeys.join('|')})`, 'g');
1024
+ const result = formatString.replace(regex, (match, escaped, token) => {
1025
+ if (escaped) {
1026
+ return escaped;
1027
+ }
1028
+ const value = formatRules[token]();
1029
+ return String(value);
1000
1030
  });
1001
1031
  return result;
1002
1032
  }
@@ -1041,10 +1071,13 @@ exports.constants = {
1041
1071
  LunarMonths,
1042
1072
  LunarMonthNames,
1043
1073
  SolarMonthNames,
1074
+ SolarMonthAbbreviationNames,
1075
+ LunarMonthAbbreviationNames,
1044
1076
  AnimalYearNames,
1045
- EraYearNames,
1077
+ AnimalYearEmojis,
1078
+ SakNames,
1046
1079
  WeekdayNames,
1047
- MoonStatusNames
1080
+ MoonPhaseNames
1048
1081
  };
1049
1082
  // Default export - aggregate all exports for convenience
1050
1083
  exports.default = {
@@ -1058,6 +1091,6 @@ exports.default = {
1058
1091
  MoonPhase,
1059
1092
  MonthIndex,
1060
1093
  AnimalYear,
1061
- EraYear,
1094
+ Sak,
1062
1095
  DayOfWeek
1063
1096
  };
package/momentkh.js CHANGED
@@ -12,7 +12,8 @@
12
12
  root.MoonPhase = exp.MoonPhase;
13
13
  root.MonthIndex = exp.MonthIndex;
14
14
  root.AnimalYear = exp.AnimalYear;
15
- root.EraYear = exp.EraYear;
15
+ root.AnimalYearEmojis = exp.AnimalYearEmojis;
16
+ root.Sak = exp.Sak;
16
17
  root.DayOfWeek = exp.DayOfWeek;
17
18
  }
18
19
  }(typeof self !== 'undefined' ? self : this, function () {
@@ -35,7 +36,7 @@
35
36
  * @license MIT
36
37
  */
37
38
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.constants = exports.DayOfWeek = exports.EraYear = exports.AnimalYear = exports.MonthIndex = exports.MoonPhase = void 0;
39
+ exports.constants = exports.DayOfWeek = exports.Sak = exports.AnimalYear = exports.MonthIndex = exports.MoonPhase = void 0;
39
40
  exports.fromGregorian = fromGregorian;
40
41
  exports.fromKhmer = fromKhmer;
41
42
  exports.getNewYear = getNewYear;
@@ -83,19 +84,19 @@ var AnimalYear;
83
84
  AnimalYear[AnimalYear["Cho"] = 10] = "Cho";
84
85
  AnimalYear[AnimalYear["Kor"] = 11] = "Kor"; // แž€แžปแžš - Pig
85
86
  })(AnimalYear || (exports.AnimalYear = AnimalYear = {}));
86
- var EraYear;
87
- (function (EraYear) {
88
- EraYear[EraYear["SamridhiSak"] = 0] = "SamridhiSak";
89
- EraYear[EraYear["AekSak"] = 1] = "AekSak";
90
- EraYear[EraYear["ToSak"] = 2] = "ToSak";
91
- EraYear[EraYear["TreiSak"] = 3] = "TreiSak";
92
- EraYear[EraYear["ChattvaSak"] = 4] = "ChattvaSak";
93
- EraYear[EraYear["PanchaSak"] = 5] = "PanchaSak";
94
- EraYear[EraYear["ChhaSak"] = 6] = "ChhaSak";
95
- EraYear[EraYear["SappaSak"] = 7] = "SappaSak";
96
- EraYear[EraYear["AtthaSak"] = 8] = "AtthaSak";
97
- EraYear[EraYear["NappaSak"] = 9] = "NappaSak"; // แž“แž–แŸ’แžœแžŸแŸแž€
98
- })(EraYear || (exports.EraYear = EraYear = {}));
87
+ var Sak;
88
+ (function (Sak) {
89
+ Sak[Sak["SamridhiSak"] = 0] = "SamridhiSak";
90
+ Sak[Sak["AekSak"] = 1] = "AekSak";
91
+ Sak[Sak["ToSak"] = 2] = "ToSak";
92
+ Sak[Sak["TreiSak"] = 3] = "TreiSak";
93
+ Sak[Sak["ChattvaSak"] = 4] = "ChattvaSak";
94
+ Sak[Sak["PanchaSak"] = 5] = "PanchaSak";
95
+ Sak[Sak["ChhaSak"] = 6] = "ChhaSak";
96
+ Sak[Sak["SappaSak"] = 7] = "SappaSak";
97
+ Sak[Sak["AtthaSak"] = 8] = "AtthaSak";
98
+ Sak[Sak["NappaSak"] = 9] = "NappaSak"; // แž“แž–แŸ’แžœแžŸแŸแž€
99
+ })(Sak || (exports.Sak = Sak = {}));
99
100
  var DayOfWeek;
100
101
  (function (DayOfWeek) {
101
102
  DayOfWeek[DayOfWeek["Sunday"] = 0] = "Sunday";
@@ -124,11 +125,24 @@ const SolarMonthNames = [
124
125
  'แž˜แž€แžšแžถ', 'แž€แžปแž˜แŸ’แž—แŸˆ', 'แž˜แžธแž“แžถ', 'แž˜แŸแžŸแžถ', 'แžงแžŸแž—แžถ', 'แž˜แžทแžแžปแž“แžถ',
125
126
  'แž€แž€แŸ’แž€แžŠแžถ', 'แžŸแžธแž แžถ', 'แž€แž‰แŸ’แž‰แžถ', 'แžแžปแž›แžถ', 'แžœแžทแž…แŸ’แž†แžทแž€แžถ', 'แž’แŸ’แž“แžผ'
126
127
  ];
128
+ const SolarMonthAbbreviationNames = [
129
+ 'แž˜แž€', 'แž€แž˜', 'แž˜แž“', 'แž˜แžŸ', 'แžงแžŸ', 'แž˜แž',
130
+ 'แž€แžŠ', 'แžŸแž ', 'แž€แž‰', 'แžแž›', 'แžœแž€', 'แž’แž“'
131
+ ];
132
+ const LunarMonthAbbreviationNames = [
133
+ 'แž˜แžท', 'แž”แžป', 'แž˜แžถ', 'แž•แž›', 'แž…แŸ', 'แž–แžท',
134
+ 'แž‡แŸ', 'แžขแžถ', 'แžŸแŸ’แžš', 'แž—', 'แžข', 'แž€',
135
+ 'แž”แž‹', 'แž‘แžปแžแžท'
136
+ ];
127
137
  const AnimalYearNames = [
128
138
  'แž‡แžผแž', 'แž†แŸ’แž›แžผแžœ', 'แžแžถแž›', 'แžแŸ„แŸ‡', 'แžšแŸ„แž„', 'แž˜แŸ’แžŸแžถแž‰แŸ‹',
129
139
  'แž˜แž˜แžธ', 'แž˜แž˜แŸ‚', 'แžœแž€', 'แžšแž€แžถ', 'แž…', 'แž€แžปแžš'
130
140
  ];
131
- const EraYearNames = [
141
+ const AnimalYearEmojis = [
142
+ '๐Ÿ€', '๐Ÿ‚', '๐Ÿ…', '๐Ÿ‡', '๐Ÿ‰', '๐Ÿ',
143
+ '๐ŸŽ', '๐Ÿ', '๐Ÿ’', '๐Ÿ“', '๐Ÿ•', '๐Ÿ–'
144
+ ];
145
+ const SakNames = [
132
146
  'แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€', 'แžฏแž€แžŸแŸแž€', 'แž‘แŸ„แžŸแŸแž€', 'แžแŸ’แžšแžธแžŸแŸแž€', 'แž…แžแŸ’แžœแžถแžŸแŸแž€',
133
147
  'แž”แž‰แŸ’แž…แžŸแŸแž€', 'แž†แžŸแŸแž€', 'แžŸแž”แŸ’แžแžŸแŸแž€', 'แžขแžŠแŸ’แž‹แžŸแŸแž€', 'แž“แž–แŸ’แžœแžŸแŸแž€'
134
148
  ];
@@ -136,8 +150,8 @@ const WeekdayNames = [
136
150
  'แžขแžถแž‘แžทแžแŸ’แž™', 'แž…แž“แŸ’แž‘', 'แžขแž„แŸ’แž‚แžถแžš', 'แž–แžปแž’', 'แž–แŸ’แžšแž แžŸแŸ’แž”แžแžทแŸ', 'แžŸแžปแž€แŸ’แžš', 'แžŸแŸ…แžšแŸ'
137
151
  ];
138
152
  const WeekdayNamesShort = ['แžขแžถ', 'แž…', 'แžข', 'แž–', 'แž–แŸ’แžš', 'แžŸแžป', 'แžŸ'];
139
- const MoonStatusNames = ['แž€แžพแž', 'แžšแŸ„แž…'];
140
- const MoonStatusShort = ['แž€', 'แžš'];
153
+ const MoonPhaseNames = ['แž€แžพแž', 'แžšแŸ„แž…'];
154
+ const MoonPhaseShort = ['แž€', 'แžš'];
141
155
  const MoonDaySymbols = [
142
156
  'แงก', 'แงข', 'แงฃ', 'แงค', 'แงฅ', 'แงฆ', 'แงง', 'แงจ', 'แงฉ', 'แงช',
143
157
  'แงซ', 'แงฌ', 'แงญ', 'แงฎ', 'แงฏ', 'แงฑ', 'แงฒ', 'แงณ', 'แงด', 'แงต',
@@ -677,7 +691,7 @@ class KhmerDate {
677
691
  return result;
678
692
  }
679
693
  toString() {
680
- return `${this.day}${MoonStatusNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
694
+ return `${this.day}${MoonPhaseNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
681
695
  }
682
696
  }
683
697
  // ============================================================================
@@ -828,7 +842,7 @@ function gregorianToKhmerInternal(year, month, day, hour = 0, minute = 0, second
828
842
  jsYear++;
829
843
  }
830
844
  }
831
- const eraYearIndex = ((jsYear % 10) + 10) % 10;
845
+ const sakIndex = ((jsYear % 10) + 10) % 10;
832
846
  const dayOfWeek = getDayOfWeek(year, month, day);
833
847
  const khmerDate = new KhmerDate(khmerDayInfo.day, khmerDayInfo.moonPhase, khmerMonth, beYear);
834
848
  return {
@@ -836,15 +850,15 @@ function gregorianToKhmerInternal(year, month, day, hour = 0, minute = 0, second
836
850
  khmer: {
837
851
  day: khmerDayInfo.day,
838
852
  moonPhase: khmerDayInfo.moonPhase,
839
- moonPhaseName: MoonStatusNames[khmerDayInfo.moonPhase],
853
+ moonPhaseName: MoonPhaseNames[khmerDayInfo.moonPhase],
840
854
  monthIndex: khmerMonth,
841
855
  monthName: LunarMonthNames[khmerMonth],
842
856
  beYear: beYear,
843
857
  jsYear: jsYear,
844
858
  animalYear: animalYearIndex,
845
859
  animalYearName: AnimalYearNames[animalYearIndex],
846
- eraYear: eraYearIndex,
847
- eraYearName: EraYearNames[eraYearIndex],
860
+ sak: sakIndex,
861
+ sakName: SakNames[sakIndex],
848
862
  dayOfWeek: dayOfWeek,
849
863
  dayOfWeekName: WeekdayNames[dayOfWeek]
850
864
  },
@@ -996,29 +1010,46 @@ function formatKhmer(khmerData, formatString) {
996
1010
  // Default format
997
1011
  const { khmer } = khmerData;
998
1012
  const moonDay = `${khmer.day}${khmer.moonPhaseName}`;
999
- return toKhmerNumeral(`แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.eraYearName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`);
1013
+ return toKhmerNumeral(`แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.sakName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`);
1000
1014
  }
1001
1015
  // Custom format
1002
1016
  const formatRules = {
1003
1017
  'W': () => khmerData.khmer.dayOfWeekName,
1004
1018
  'w': () => WeekdayNamesShort[khmerData.gregorian.dayOfWeek],
1005
- 'd': () => khmerData.khmer.day,
1006
- 'D': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
1007
- 'n': () => MoonStatusShort[khmerData.khmer.moonPhase],
1019
+ 'd': () => toKhmerNumeral(khmerData.khmer.day),
1020
+ 'D': () => toKhmerNumeral((khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day),
1021
+ 'dr': () => khmerData.khmer.day,
1022
+ 'Dr': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
1023
+ 'ds': () => toKhmerNumeral(khmerData.gregorian.day),
1024
+ 'Ds': () => toKhmerNumeral((khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day),
1025
+ 'dsr': () => khmerData.gregorian.day,
1026
+ 'Dsr': () => (khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day,
1027
+ 'n': () => MoonPhaseShort[khmerData.khmer.moonPhase],
1008
1028
  'N': () => khmerData.khmer.moonPhaseName,
1009
1029
  'o': () => MoonDaySymbols[khmerData._khmerDateObj.getDayNumber()],
1010
1030
  'm': () => khmerData.khmer.monthName,
1011
1031
  'M': () => SolarMonthNames[khmerData.gregorian.month - 1],
1012
1032
  'a': () => khmerData.khmer.animalYearName,
1013
- 'e': () => khmerData.khmer.eraYearName,
1014
- 'b': () => khmerData.khmer.beYear,
1015
- 'c': () => khmerData.gregorian.year,
1016
- 'j': () => khmerData.khmer.jsYear
1033
+ 'as': () => AnimalYearEmojis[khmerData.khmer.animalYear],
1034
+ 'e': () => khmerData.khmer.sakName,
1035
+ 'b': () => toKhmerNumeral(khmerData.khmer.beYear),
1036
+ 'br': () => khmerData.khmer.beYear,
1037
+ 'c': () => toKhmerNumeral(khmerData.gregorian.year),
1038
+ 'cr': () => khmerData.gregorian.year,
1039
+ 'j': () => toKhmerNumeral(khmerData.khmer.jsYear),
1040
+ 'jr': () => khmerData.khmer.jsYear,
1041
+ 'Ms': () => SolarMonthAbbreviationNames[khmerData.gregorian.month - 1],
1042
+ 'ms': () => LunarMonthAbbreviationNames[khmerData.khmer.monthIndex]
1017
1043
  };
1018
- const regex = new RegExp(Object.keys(formatRules).join('|'), 'g');
1019
- const result = formatString.replace(regex, match => {
1020
- const value = formatRules[match]();
1021
- return toKhmerNumeral(String(value));
1044
+ // Sort keys by length descending to ensure longer tokens (like 'Ms', 'ms') are matched before shorter ones (like 'M', 'm')
1045
+ const sortedKeys = Object.keys(formatRules).sort((a, b) => b.length - a.length);
1046
+ const regex = new RegExp(`\\[([^\\]]+)\\]|(${sortedKeys.join('|')})`, 'g');
1047
+ const result = formatString.replace(regex, (match, escaped, token) => {
1048
+ if (escaped) {
1049
+ return escaped;
1050
+ }
1051
+ const value = formatRules[token]();
1052
+ return String(value);
1022
1053
  });
1023
1054
  return result;
1024
1055
  }
@@ -1063,10 +1094,13 @@ exports.constants = {
1063
1094
  LunarMonths,
1064
1095
  LunarMonthNames,
1065
1096
  SolarMonthNames,
1097
+ SolarMonthAbbreviationNames,
1098
+ LunarMonthAbbreviationNames,
1066
1099
  AnimalYearNames,
1067
- EraYearNames,
1100
+ AnimalYearEmojis,
1101
+ SakNames,
1068
1102
  WeekdayNames,
1069
- MoonStatusNames
1103
+ MoonPhaseNames
1070
1104
  };
1071
1105
  // Default export - aggregate all exports for convenience
1072
1106
  exports.default = {
@@ -1080,7 +1114,7 @@ exports.default = {
1080
1114
  MoonPhase,
1081
1115
  MonthIndex,
1082
1116
  AnimalYear,
1083
- EraYear,
1117
+ Sak,
1084
1118
  DayOfWeek
1085
1119
  };
1086
1120
 
package/momentkh.ts CHANGED
@@ -55,7 +55,7 @@ export enum AnimalYear {
55
55
  Kor = 11 // แž€แžปแžš - Pig
56
56
  }
57
57
 
58
- export enum EraYear {
58
+ export enum Sak {
59
59
  SamridhiSak = 0, // แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€
60
60
  AekSak = 1, // แžฏแž€แžŸแŸแž€
61
61
  ToSak = 2, // แž‘แŸ„แžŸแŸแž€
@@ -94,12 +94,12 @@ export interface KhmerDateInfo {
94
94
  moonPhaseName: string; // String name: "แž€แžพแž" or "แžšแŸ„แž…"
95
95
  monthIndex: MonthIndex; // Enum: MonthIndex (0-13)
96
96
  monthName: string; // String name of the month
97
- beYear: number; // Buddhist Era year
97
+ beYear: number; // Buddhist Sak
98
98
  jsYear: number; // Jolak Sakaraj year
99
99
  animalYear: AnimalYear; // Enum: AnimalYear (0-11)
100
100
  animalYearName: string; // String name of animal year
101
- eraYear: EraYear; // Enum: EraYear (0-9)
102
- eraYearName: string; // String name of era year
101
+ sak: Sak; // Enum: Sak (0-9)
102
+ sakName: string; // String name of Sak
103
103
  dayOfWeek: DayOfWeek; // Enum: DayOfWeek (0-6)
104
104
  dayOfWeekName: string; // String name of day of week
105
105
  }
@@ -159,10 +159,18 @@ export interface Constants {
159
159
  LunarMonths: Record<string, number>;
160
160
  LunarMonthNames: string[];
161
161
  SolarMonthNames: string[];
162
+ SolarMonthAbbreviationNames: string[];
163
+ LunarMonthAbbreviationNames: string[];
162
164
  AnimalYearNames: string[];
163
- EraYearNames: string[];
165
+ AnimalYearEmojis: string[];
166
+ SakNames: string[];
164
167
  WeekdayNames: string[];
165
- MoonStatusNames: string[];
168
+ WeekdayNamesShort: string[];
169
+ MoonPhaseNames: string[];
170
+ MoonPhaseShort: string[];
171
+ MoonDaySymbols: string[];
172
+ KhmerNumerals: Record<string, string>;
173
+ khNewYearMoments: Record<string, string>;
166
174
  }
167
175
 
168
176
  // ============================================================================
@@ -187,12 +195,28 @@ const SolarMonthNames: string[] = [
187
195
  'แž€แž€แŸ’แž€แžŠแžถ', 'แžŸแžธแž แžถ', 'แž€แž‰แŸ’แž‰แžถ', 'แžแžปแž›แžถ', 'แžœแžทแž…แŸ’แž†แžทแž€แžถ', 'แž’แŸ’แž“แžผ'
188
196
  ];
189
197
 
198
+ const SolarMonthAbbreviationNames: string[] = [
199
+ 'แž˜แž€', 'แž€แž˜', 'แž˜แž“', 'แž˜แžŸ', 'แžงแžŸ', 'แž˜แž',
200
+ 'แž€แžŠ', 'แžŸแž ', 'แž€แž‰', 'แžแž›', 'แžœแž€', 'แž’แž“'
201
+ ];
202
+
203
+ const LunarMonthAbbreviationNames: string[] = [
204
+ 'แž˜แžท', 'แž”แžป', 'แž˜แžถ', 'แž•แž›', 'แž…แŸ', 'แž–แžท',
205
+ 'แž‡แŸ', 'แžขแžถ', 'แžŸแŸ’แžš', 'แž—', 'แžข', 'แž€',
206
+ 'แž”แž‹', 'แž‘แžปแžแžท'
207
+ ];
208
+
190
209
  const AnimalYearNames: string[] = [
191
210
  'แž‡แžผแž', 'แž†แŸ’แž›แžผแžœ', 'แžแžถแž›', 'แžแŸ„แŸ‡', 'แžšแŸ„แž„', 'แž˜แŸ’แžŸแžถแž‰แŸ‹',
192
211
  'แž˜แž˜แžธ', 'แž˜แž˜แŸ‚', 'แžœแž€', 'แžšแž€แžถ', 'แž…', 'แž€แžปแžš'
193
212
  ];
194
213
 
195
- const EraYearNames: string[] = [
214
+ const AnimalYearEmojis: string[] = [
215
+ '๐Ÿ€', '๐Ÿ‚', '๐Ÿ…', '๐Ÿ‡', '๐Ÿ‰', '๐Ÿ',
216
+ '๐ŸŽ', '๐Ÿ', '๐Ÿ’', '๐Ÿ“', '๐Ÿ•', '๐Ÿ–'
217
+ ];
218
+
219
+ const SakNames: string[] = [
196
220
  'แžŸแŸ†แžšแžนแž‘แŸ’แž’แžทแžŸแŸแž€', 'แžฏแž€แžŸแŸแž€', 'แž‘แŸ„แžŸแŸแž€', 'แžแŸ’แžšแžธแžŸแŸแž€', 'แž…แžแŸ’แžœแžถแžŸแŸแž€',
197
221
  'แž”แž‰แŸ’แž…แžŸแŸแž€', 'แž†แžŸแŸแž€', 'แžŸแž”แŸ’แžแžŸแŸแž€', 'แžขแžŠแŸ’แž‹แžŸแŸแž€', 'แž“แž–แŸ’แžœแžŸแŸแž€'
198
222
  ];
@@ -203,8 +227,8 @@ const WeekdayNames: string[] = [
203
227
 
204
228
  const WeekdayNamesShort: string[] = ['แžขแžถ', 'แž…', 'แžข', 'แž–', 'แž–แŸ’แžš', 'แžŸแžป', 'แžŸ'];
205
229
 
206
- const MoonStatusNames: string[] = ['แž€แžพแž', 'แžšแŸ„แž…'];
207
- const MoonStatusShort: string[] = ['แž€', 'แžš'];
230
+ const MoonPhaseNames: string[] = ['แž€แžพแž', 'แžšแŸ„แž…'];
231
+ const MoonPhaseShort: string[] = ['แž€', 'แžš'];
208
232
 
209
233
  const MoonDaySymbols: string[] = [
210
234
  'แงก', 'แงข', 'แงฃ', 'แงค', 'แงฅ', 'แงฆ', 'แงง', 'แงจ', 'แงฉ', 'แงช',
@@ -839,7 +863,7 @@ class KhmerDate {
839
863
  }
840
864
 
841
865
  toString(): string {
842
- return `${this.day}${MoonStatusNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
866
+ return `${this.day}${MoonPhaseNames[this.moonPhase]} แžแŸ‚${LunarMonthNames[this.monthIndex]} แž–.แžŸ.${this.beYear}`;
843
867
  }
844
868
  }
845
869
 
@@ -1017,7 +1041,7 @@ function gregorianToKhmerInternal(
1017
1041
  }
1018
1042
  }
1019
1043
 
1020
- const eraYearIndex = ((jsYear % 10) + 10) % 10;
1044
+ const sakIndex = ((jsYear % 10) + 10) % 10;
1021
1045
  const dayOfWeek = getDayOfWeek(year, month, day);
1022
1046
 
1023
1047
  const khmerDate = new KhmerDate(khmerDayInfo.day, khmerDayInfo.moonPhase, khmerMonth as MonthIndex, beYear);
@@ -1027,15 +1051,15 @@ function gregorianToKhmerInternal(
1027
1051
  khmer: {
1028
1052
  day: khmerDayInfo.day,
1029
1053
  moonPhase: khmerDayInfo.moonPhase,
1030
- moonPhaseName: MoonStatusNames[khmerDayInfo.moonPhase],
1054
+ moonPhaseName: MoonPhaseNames[khmerDayInfo.moonPhase],
1031
1055
  monthIndex: khmerMonth as MonthIndex,
1032
1056
  monthName: LunarMonthNames[khmerMonth],
1033
1057
  beYear: beYear,
1034
1058
  jsYear: jsYear,
1035
1059
  animalYear: animalYearIndex as AnimalYear,
1036
1060
  animalYearName: AnimalYearNames[animalYearIndex],
1037
- eraYear: eraYearIndex as EraYear,
1038
- eraYearName: EraYearNames[eraYearIndex],
1061
+ sak: sakIndex as Sak,
1062
+ sakName: SakNames[sakIndex],
1039
1063
  dayOfWeek: dayOfWeek as DayOfWeek,
1040
1064
  dayOfWeekName: WeekdayNames[dayOfWeek]
1041
1065
  },
@@ -1231,7 +1255,7 @@ function formatKhmer(khmerData: KhmerConversionResult, formatString?: string): s
1231
1255
  const { khmer } = khmerData;
1232
1256
  const moonDay = `${khmer.day}${khmer.moonPhaseName}`;
1233
1257
  return toKhmerNumeral(
1234
- `แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.eraYearName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`
1258
+ `แžแŸ’แž„แŸƒ${khmer.dayOfWeekName} ${moonDay} แžแŸ‚${khmer.monthName} แž†แŸ’แž“แžถแŸ†${khmer.animalYearName} ${khmer.sakName} แž–แžปแž‘แŸ’แž’แžŸแž€แžšแžถแž‡ ${khmer.beYear}`
1235
1259
  );
1236
1260
  }
1237
1261
 
@@ -1239,24 +1263,42 @@ function formatKhmer(khmerData: KhmerConversionResult, formatString?: string): s
1239
1263
  const formatRules: Record<string, () => string | number> = {
1240
1264
  'W': () => khmerData.khmer.dayOfWeekName,
1241
1265
  'w': () => WeekdayNamesShort[khmerData.gregorian.dayOfWeek],
1242
- 'd': () => khmerData.khmer.day,
1243
- 'D': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
1244
- 'n': () => MoonStatusShort[khmerData.khmer.moonPhase],
1266
+ 'd': () => toKhmerNumeral(khmerData.khmer.day),
1267
+ 'D': () => toKhmerNumeral((khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day),
1268
+ 'dr': () => khmerData.khmer.day,
1269
+ 'Dr': () => (khmerData.khmer.day < 10 ? '0' : '') + khmerData.khmer.day,
1270
+ 'ds': () => toKhmerNumeral(khmerData.gregorian.day),
1271
+ 'Ds': () => toKhmerNumeral((khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day),
1272
+ 'dsr': () => khmerData.gregorian.day,
1273
+ 'Dsr': () => (khmerData.gregorian.day < 10 ? '0' : '') + khmerData.gregorian.day,
1274
+ 'n': () => MoonPhaseShort[khmerData.khmer.moonPhase],
1245
1275
  'N': () => khmerData.khmer.moonPhaseName,
1246
1276
  'o': () => MoonDaySymbols[khmerData._khmerDateObj.getDayNumber()],
1247
1277
  'm': () => khmerData.khmer.monthName,
1248
1278
  'M': () => SolarMonthNames[khmerData.gregorian.month - 1],
1249
1279
  'a': () => khmerData.khmer.animalYearName,
1250
- 'e': () => khmerData.khmer.eraYearName,
1251
- 'b': () => khmerData.khmer.beYear,
1252
- 'c': () => khmerData.gregorian.year,
1253
- 'j': () => khmerData.khmer.jsYear
1280
+ 'as': () => AnimalYearEmojis[khmerData.khmer.animalYear],
1281
+ 'e': () => khmerData.khmer.sakName,
1282
+ 'b': () => toKhmerNumeral(khmerData.khmer.beYear),
1283
+ 'br': () => khmerData.khmer.beYear,
1284
+ 'c': () => toKhmerNumeral(khmerData.gregorian.year),
1285
+ 'cr': () => khmerData.gregorian.year,
1286
+ 'j': () => toKhmerNumeral(khmerData.khmer.jsYear),
1287
+ 'jr': () => khmerData.khmer.jsYear,
1288
+ 'Ms': () => SolarMonthAbbreviationNames[khmerData.gregorian.month - 1],
1289
+ 'ms': () => LunarMonthAbbreviationNames[khmerData.khmer.monthIndex]
1254
1290
  };
1255
1291
 
1256
- const regex = new RegExp(Object.keys(formatRules).join('|'), 'g');
1257
- const result = formatString.replace(regex, match => {
1258
- const value = formatRules[match]();
1259
- return toKhmerNumeral(String(value));
1292
+ // Sort keys by length descending to ensure longer tokens (like 'Ms', 'ms') are matched before shorter ones (like 'M', 'm')
1293
+ const sortedKeys = Object.keys(formatRules).sort((a, b) => b.length - a.length);
1294
+ const regex = new RegExp(`\\[([^\\]]+)\\]|(${sortedKeys.join('|')})`, 'g');
1295
+
1296
+ const result = formatString.replace(regex, (match, escaped, token) => {
1297
+ if (escaped) {
1298
+ return escaped;
1299
+ }
1300
+ const value = formatRules[token]();
1301
+ return String(value);
1260
1302
  });
1261
1303
 
1262
1304
  return result;
@@ -1292,7 +1334,6 @@ export function getNewYear(ceYear: number): NewYearInfo {
1292
1334
  export function format(khmerData: KhmerConversionResult, formatString?: string): string {
1293
1335
  return formatKhmer(khmerData, formatString);
1294
1336
  }
1295
-
1296
1337
  // Utility for creating date from Date object
1297
1338
  export function fromDate(date: Date): KhmerConversionResult {
1298
1339
  // Validate Date object
@@ -1318,10 +1359,13 @@ export const constants = {
1318
1359
  LunarMonths,
1319
1360
  LunarMonthNames,
1320
1361
  SolarMonthNames,
1362
+ SolarMonthAbbreviationNames,
1363
+ LunarMonthAbbreviationNames,
1321
1364
  AnimalYearNames,
1322
- EraYearNames,
1365
+ AnimalYearEmojis,
1366
+ SakNames,
1323
1367
  WeekdayNames,
1324
- MoonStatusNames
1368
+ MoonPhaseNames
1325
1369
  };
1326
1370
 
1327
1371
  // Default export - aggregate all exports for convenience
@@ -1336,6 +1380,6 @@ export default {
1336
1380
  MoonPhase,
1337
1381
  MonthIndex,
1338
1382
  AnimalYear,
1339
- EraYear,
1383
+ Sak,
1340
1384
  DayOfWeek
1341
1385
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thyrith/momentkh",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "Working on khmer calendar by implementting moment js",
5
5
  "license": "MIT",
6
6
  "type": "component",
@@ -52,8 +52,7 @@
52
52
  ]
53
53
  }
54
54
  },
55
- "dependencies": {
56
- },
55
+ "dependencies": {},
57
56
  "spm": {
58
57
  "main": "momentkh.js",
59
58
  "output": [
@@ -63,4 +62,4 @@
63
62
  "devDependencies": {
64
63
  "typescript": "^5.9.3"
65
64
  }
66
- }
65
+ }