Skip to content

Commit 974152b

Browse files
committed
Expand and improve README documentation
The README now includes detailed explanations of the Kurdish calendar, expanded usage examples covering all features, error handling, and cultural notes. Sections have been reorganized and clarified to provide better guidance for users and developers.
1 parent 70a19c4 commit 974152b

1 file changed

Lines changed: 146 additions & 40 deletions

File tree

README.md

Lines changed: 146 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
# kurdical
22

3-
A Go module for Kurdish calendar utilities.
3+
## About the Kurdish Calendar
44

5-
This module provides conversion between Gregorian and Kurdish calendars, supporting two historical epochs and month names in five Kurdish dialects.
5+
The Kurdish calendar is an independent solar calendar system with historical offsets aligned to significant events in Kurdish history.
6+
7+
It supports two main historical epochs:
8+
9+
- **Median Kingdom (Diako) epoch**: Starting from the establishment of the Median kingdom by Diako
10+
- **Fall of Nineveh (Cyaxares) epoch**: Starting from the fall of Nineveh by Cyaxares
11+
12+
The Kurdish year is calculated by adding epoch-specific offsets to the base solar calendar year.
613

714
## Features
815

916
- Convert Gregorian dates to Kurdish calendar
1017
- Convert Kurdish calendar dates back to Gregorian
11-
- Support for two Kurdish historical epochs:
12-
- Median Kingdom (Diako)
13-
- Fall of Nineveh (Cyaxares)
18+
- Support for two historical epochs (Median Kingdom and Fall of Nineveh)
1419
- Month names in 5 Kurdish dialects: Laki, Hawrami, Sorani, Kalhuri, Kurmanji
20+
- Display weekdays in Kurdish
21+
- Format dates with Kurdish digits (٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩)
22+
- Error handling and date validation
23+
- 100% test coverage
24+
- Complete documentation with practical examples
1525

1626
## Installation
1727

@@ -21,7 +31,7 @@ go get github.com/rojcode/kurdical
2131

2232
## Usage
2333

24-
### Basic Conversion
34+
### 1. Basic Gregorian to Kurdish Conversion
2535

2636
```go
2737
package main
@@ -33,18 +43,16 @@ import (
3343
)
3444

3545
func main() {
36-
// Convert Gregorian to Kurdish
3746
t := time.Date(2023, 3, 21, 0, 0, 0, 0, time.UTC)
3847
k := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.MedianKingdom)
3948
fmt.Printf("Kurdish date: %d-%d-%d %s\n", k.Year, k.Month, k.Day, k.MonthName)
4049
// Output: Kurdish date: 2723-1-1 خاکه‌لێوه
4150
}
4251
```
4352

44-
### Round Trip Conversion
53+
### 2. Round Trip Conversion
4554

4655
```go
47-
// Convert Kurdish to Gregorian
4856
g, err := kurdical.KurdishToGregorian(k)
4957
if err != nil {
5058
fmt.Println(err)
@@ -54,7 +62,7 @@ if err != nil {
5462
}
5563
```
5664

57-
### Different Dialects
65+
### 3. Different Kurdish Dialects
5866

5967
```go
6068
// Sorani dialect
@@ -68,9 +76,17 @@ fmt.Printf("Kurmanji: %s\n", kKurmanji.MonthName) // نیسان
6876
// Laki dialect
6977
kLaki := kurdical.GregorianToKurdish(t, kurdical.Laki, kurdical.MedianKingdom)
7078
fmt.Printf("Laki: %s\n", kLaki.MonthName) // په‌نجه
79+
80+
// Hawrami dialect
81+
kHawrami := kurdical.GregorianToKurdish(t, kurdical.Hawrami, kurdical.MedianKingdom)
82+
fmt.Printf("Hawrami: %s\n", kHawrami.MonthName) // نه‌ورۆز
83+
84+
// Kalhuri dialect
85+
kKalhuri := kurdical.GregorianToKurdish(t, kurdical.Kalhuri, kurdical.MedianKingdom)
86+
fmt.Printf("Kalhuri: %s\n", kKalhuri.MonthName) // جه‌ژنان (جه‌شنان)
7187
```
7288

73-
### Different Epochs
89+
### 4. Different Historical Epochs
7490

7591
```go
7692
// Median Kingdom epoch
@@ -82,7 +98,14 @@ kNineveh := kurdical.GregorianToKurdish(t, kurdical.Sorani, kurdical.FallOfNinev
8298
fmt.Printf("Fall of Nineveh: %d\n", kNineveh.Year) // 2635
8399
```
84100

85-
### Formatting with Kurdish Digits
101+
### 5. Weekday Display
102+
103+
```go
104+
fmt.Printf("Weekday: %s\n", kurdical.WeekdayNames[k.Weekday])
105+
// Output: Weekday: سێ‌شەممە
106+
```
107+
108+
### 6. Formatting with Kurdish Digits
86109

87110
```go
88111
formatted, err := k.KFormat("2006-01-02 January")
@@ -94,62 +117,145 @@ if err != nil {
94117
}
95118
```
96119

97-
### Weekday Display
120+
### 7. Using Date-Only Functions
98121

99122
```go
100-
fmt.Printf("Weekday: %s\n", kurdical.WeekdayNames[k.Weekday])
101-
// Output: Weekday: سێشەممە (for Tuesday)
123+
k := kurdical.GregorianToKurdishDate(2023, 3, 21, kurdical.Sorani, kurdical.MedianKingdom)
124+
fmt.Printf("Kurdish: %d-%d-%d %s\n", k.Year, k.Month, k.Day, k.MonthName)
125+
```
126+
127+
### 8. Converting Kurdish to Gregorian
128+
129+
```go
130+
gy, gm, gd, err := kurdical.KurdishToGregorianDate(k.Year, k.Month, k.Day, k.Epoch)
131+
if err != nil {
132+
fmt.Println("Error:", err)
133+
} else {
134+
fmt.Printf("Gregorian: %d-%d-%d\n", gy, gm, gd)
135+
}
102136
```
103137

104-
### Creating Kurdish Date Manually
138+
### 9. Creating Kurdish Date Manually
105139

106140
```go
107-
// Create a specific Kurdish date and convert to Gregorian
108141
specificKurdish := kurdical.KurdishDate{
109142
Year: 2725,
110143
Month: 9,
111144
Day: 24,
112-
Dialect: kurdical.Sorani, // Optional
145+
Dialect: kurdical.Sorani,
113146
Epoch: kurdical.MedianKingdom,
114147
}
115148
gregorianSpecific, err := kurdical.KurdishToGregorian(specificKurdish)
116149
if err != nil {
117150
fmt.Println("Error:", err)
118151
} else {
119152
fmt.Printf("Kurdish 2725-09-24 to Gregorian: %s\n", gregorianSpecific.Format("2006-01-02"))
120-
// Output: Kurdish 2725-09-24 to Gregorian: 2025-12-15
121153
}
122154
```
123155

124-
### Date-Only Functions
156+
### 10. Invalid Month Error Handling
125157

126158
```go
127-
// Using date-only functions without time.Time
128-
k := kurdical.GregorianToKurdishDate(2023, 3, 21, kurdical.Sorani, kurdical.MedianKingdom)
129-
fmt.Printf("Kurdish: %d-%d-%d %s\n", k.Year, k.Month, k.Day, k.MonthName)
130-
131-
gy, gm, gd, err := kurdical.KurdishToGregorianDate(k.Year, k.Month, k.Day, k.Epoch)
159+
// Invalid month
160+
invalidKurdish := kurdical.KurdishDate{
161+
Year: 2725,
162+
Month: 13, // Invalid month
163+
Day: 24,
164+
Epoch: kurdical.MedianKingdom,
165+
}
166+
_, err := kurdical.KurdishToGregorian(invalidKurdish)
132167
if err != nil {
133-
fmt.Println("Error:", err)
134-
} else {
135-
fmt.Printf("Gregorian: %d-%d-%d\n", gy, gm, gd)
136-
// Output: Gregorian: 2023-3-21
168+
fmt.Printf("Error: %s\n", err) // Error: invalid month: 13
137169
}
138170
```
139171

140-
### Error Handling
172+
### 11. Invalid Day Error Handling
141173

142174
```go
143-
// Invalid date
144-
invalidKurdish := kurdical.KurdishDate{
175+
// Invalid day
176+
invalidDay := kurdical.KurdishDate{
145177
Year: 2725,
146-
Month: 13, // Invalid month
147-
Day: 24,
178+
Month: 1,
179+
Day: 32, // Invalid day
148180
Epoch: kurdical.MedianKingdom,
149181
}
150-
_, err := kurdical.KurdishToGregorian(invalidKurdish)
182+
_, err := kurdical.KurdishToGregorian(invalidDay)
151183
if err != nil {
152-
fmt.Printf("Error: %s\n", err) // Error: invalid month: 13
184+
fmt.Printf("Error: %s\n", err) // Error: invalid day: 32 for month 1 in year 2725
185+
}
186+
```
187+
188+
### 12. Different Dates of Year
189+
190+
```go
191+
// January date
192+
janDate := kurdical.GregorianToKurdishDate(2023, 1, 1, kurdical.Sorani, kurdical.MedianKingdom)
193+
fmt.Printf("January: %d-%d-%d %s\n", janDate.Year, janDate.Month, janDate.Day, janDate.MonthName)
194+
195+
// December date
196+
decDate := kurdical.GregorianToKurdishDate(2023, 12, 31, kurdical.Sorani, kurdical.MedianKingdom)
197+
fmt.Printf("December: %d-%d-%d %s\n", decDate.Year, decDate.Month, decDate.Day, decDate.MonthName)
198+
```
199+
200+
### 13. Comparing Epochs
201+
202+
```go
203+
date := time.Date(2023, 6, 15, 0, 0, 0, 0, time.UTC)
204+
205+
median := kurdical.GregorianToKurdish(date, kurdical.Sorani, kurdical.MedianKingdom)
206+
nineveh := kurdical.GregorianToKurdish(date, kurdical.Sorani, kurdical.FallOfNineveh)
207+
208+
fmt.Printf("Median Kingdom: %d-%d-%d\n", median.Year, median.Month, median.Day)
209+
fmt.Printf("Fall of Nineveh: %d-%d-%d\n", nineveh.Year, nineveh.Month, nineveh.Day)
210+
fmt.Printf("Year difference: %d\n", median.Year - nineveh.Year) // 88
211+
```
212+
213+
### 14. Different Format Layouts
214+
215+
```go
216+
layouts := []string{
217+
"2006-01-02",
218+
"2006/01/02 January",
219+
"02 Jan 2006",
220+
"Monday, 02 January 2006",
221+
}
222+
223+
for _, layout := range layouts {
224+
formatted, _ := k.KFormat(layout)
225+
fmt.Printf("Format %s: %s\n", layout, formatted)
226+
}
227+
```
228+
229+
### 15. Complete Program Example
230+
231+
```go
232+
package main
233+
234+
import (
235+
"fmt"
236+
"time"
237+
"github.com/rojcode/kurdical"
238+
)
239+
240+
func main() {
241+
// Current date
242+
now := time.Now()
243+
kurdishNow := kurdical.GregorianToKurdish(now, kurdical.Sorani, kurdical.MedianKingdom)
244+
245+
fmt.Printf("Current Gregorian: %s\n", now.Format("2006-01-02 15:04:05"))
246+
fmt.Printf("Current Kurdish: %d-%d-%d %s (%s)\n",
247+
kurdishNow.Year, kurdishNow.Month, kurdishNow.Day,
248+
kurdishNow.MonthName, kurdical.WeekdayNames[kurdishNow.Weekday])
249+
250+
// Convert to specific Kurdish date
251+
newYearKurdish := kurdical.KurdishDate{
252+
Year: 2726,
253+
Month: 1,
254+
Day: 1,
255+
Epoch: kurdical.MedianKingdom,
256+
}
257+
newYearGregorian, _ := kurdical.KurdishToGregorian(newYearKurdish)
258+
fmt.Printf("Kurdish New Year 2726: %s\n", newYearGregorian.Format("2006-01-02"))
153259
}
154260
```
155261

@@ -171,14 +277,14 @@ if err != nil {
171277

172278
## Kurdish Calendar Details
173279

174-
The Kurdish calendar is based on the Solar Hijri calendar with adjusted epochs.
280+
The Kurdish calendar uses epoch-specific historical adjustments:
175281

176-
- Median Kingdom epoch: Kurdish year = Solar Hijri year + 1321
177-
- Fall of Nineveh epoch: Kurdish year = Solar Hijri year + 1233
282+
- Median Kingdom epoch: Kurdish year = Base year + 1321
283+
- Fall of Nineveh epoch: Kurdish year = Base year + 1233
178284

179285
## Cultural Notes
180286

181-
This module respects Kurdish cultural heritage by providing accurate month names in authentic dialects. The UTF-8 encoding ensures proper display of Kurdish characters.
287+
This module respects Kurdish cultural heritage by providing accurate month names in authentic dialects. UTF-8 encoding ensures proper display of Kurdish characters.
182288

183289
## License
184290

0 commit comments

Comments
 (0)