chore: polish pubspec, add wiki docs and CHANGELOG

This commit is contained in:
Aric Camarata 2026-05-29 06:34:30 -04:00
parent d8eec86e9f
commit b7ca4e00bf
8 changed files with 232 additions and 6 deletions

View file

@ -1 +0,0 @@
CLAUDE.md

18
.github/wiki/Home.md vendored
View file

@ -1,8 +1,13 @@
# hijri_core
Hijri/Gregorian calendar conversion for Dart and Flutter. Supports Umm al-Qura (UAQ) and FCNA/ISNA calendars. Zero dependencies.
Hijri/Gregorian calendar conversion for Dart and Flutter. Pluggable engine system with built-in Umm al-Qura (UAQ) and FCNA calendar implementations. Zero dependencies.
## Quick Start
## Install
```yaml
dependencies:
hijri_core: ^1.0.0
```
```dart
import 'package:hijri_core/hijri_core.dart';
@ -14,7 +19,10 @@ final greg = toGregorian(1446, 9, 1);
print(greg!.toIso8601String().substring(0, 10)); // 2025-03-01
```
## Pages
## Contents
- [API Reference](API-Reference): Full function and type reference
- [Calendar Systems](Calendar-Systems): UAQ and FCNA algorithm details
- [Quickstart Guide](guides/quickstart) — install, first call, engine selection
- [Advanced Usage](guides/advanced) — pluggable engines, custom calendars
- [API Reference](API-Reference) — full function and type reference
- [Examples](examples/basic-usage) — real-world snippets
- [Contributing](CONTRIBUTING)

61
.github/wiki/examples/basic-usage.md vendored Normal file
View file

@ -0,0 +1,61 @@
# Basic Usage Examples
## Convert Today's Date
```dart
import 'package:hijri_core/hijri_core.dart';
void main() {
final today = DateTime.now().toUtc();
final hijri = toHijri(today);
if (hijri != null) {
final months = [
'', 'Muharram', 'Safar', "Rabi' al-Awwal", "Rabi' al-Thani",
'Jumada al-Awwal', 'Jumada al-Thani', 'Rajab', "Sha'ban",
'Ramadan', 'Shawwal', "Dhu al-Qi'dah", 'Dhu al-Hijjah',
];
print('Today in Hijri: ${hijri.hd} ${months[hijri.hm]} ${hijri.hy} AH');
}
}
```
## Ramadan Calendar for a Year
```dart
import 'package:hijri_core/hijri_core.dart';
void main() {
// Find Ramadan 1446 start and end in Gregorian
final ramadanStart = toGregorian(1446, 9, 1);
final ramadanEnd = toGregorian(1446, 9, daysInMonth(1446, 9));
print('Ramadan 1446: ${ramadanStart?.toIso8601String().substring(0, 10)} '
'to ${ramadanEnd?.toIso8601String().substring(0, 10)}');
}
```
## UAQ vs FCNA Comparison
```dart
import 'package:hijri_core/hijri_core.dart';
void main() {
final dates = [
DateTime.utc(2024, 4, 9), // Eid al-Fitr 2024
DateTime.utc(2024, 6, 16), // Eid al-Adha 2024
DateTime.utc(2025, 3, 30), // Eid al-Fitr 2025
];
print('Gregorian UAQ FCNA');
print('${'─' * 45}');
for (final d in dates) {
final uaq = toHijri(d, calendar: 'uaq');
final fcna = toHijri(d, calendar: 'fcna');
final greg = d.toIso8601String().substring(0, 10);
final uaqStr = uaq != null ? '${uaq.hy}/${uaq.hm}/${uaq.hd}' : 'n/a';
final fcnaStr = fcna != null ? '${fcna.hy}/${fcna.hm}/${fcna.hd}' : 'n/a';
print('$greg ${uaqStr.padRight(14)}$fcnaStr');
}
}
```

76
.github/wiki/guides/advanced.md vendored Normal file
View file

@ -0,0 +1,76 @@
# Advanced Usage
## Selecting a Calendar Engine
The default engine is Umm al-Qura (UAQ). Switch to FCNA for North American Islamic Society dates:
```dart
import 'package:hijri_core/hijri_core.dart';
void main() {
final date = DateTime.utc(2025, 3, 1);
final uaq = toHijri(date, calendar: 'uaq');
final fcna = toHijri(date, calendar: 'fcna');
print('UAQ: ${uaq?.hy}/${uaq?.hm}/${uaq?.hd}');
print('FCNA: ${fcna?.hy}/${fcna?.hm}/${fcna?.hd}');
}
```
## Listing Available Calendars
```dart
final calendars = listCalendars();
print(calendars); // ['uaq', 'fcna']
final engine = getCalendar('uaq');
print(engine.name); // 'Umm al-Qura'
```
## Custom Engine
Implement `CalendarEngine` to plug in your own calendar algorithm:
```dart
import 'package:hijri_core/hijri_core.dart';
class MyCalendarEngine implements CalendarEngine {
@override
String get id => 'my-calendar';
@override
String get name => 'My Custom Calendar';
@override
HijriDate? toHijri(DateTime gregorian) {
// Your conversion logic here
return null;
}
@override
DateTime? toGregorian(int hy, int hm, int hd) {
// Your reverse conversion logic here
return null;
}
@override
int daysInMonth(int hy, int hm) => 30; // simplified
@override
bool isValid(int hy, int hm, int hd) => hm >= 1 && hm <= 12 && hd >= 1 && hd <= 30;
}
// Register and use
registerCalendar(MyCalendarEngine());
final result = toHijri(DateTime.utc(2025, 3, 1), calendar: 'my-calendar');
```
## Ramadan Detection
```dart
bool isRamadan(DateTime date) {
final hijri = toHijri(date);
return hijri != null && hijri.hm == 9;
}
```

54
.github/wiki/guides/quickstart.md vendored Normal file
View file

@ -0,0 +1,54 @@
# Quickstart
## Install
Add to `pubspec.yaml`:
```yaml
dependencies:
hijri_core: ^1.0.0
```
Run `dart pub get`.
## Gregorian to Hijri
```dart
import 'package:hijri_core/hijri_core.dart';
void main() {
final hijri = toHijri(DateTime.utc(2025, 3, 1));
if (hijri != null) {
print('${hijri.hy}/${hijri.hm}/${hijri.hd}'); // 1446/9/1
}
}
```
## Hijri to Gregorian
```dart
final greg = toGregorian(1446, 9, 1);
if (greg != null) {
print(greg.toIso8601String().substring(0, 10)); // 2025-03-01
}
```
Both functions return `null` for dates outside the supported range.
## Days in a Hijri Month
```dart
final days = daysInMonth(1446, 9); // Ramadan 1446
print(days); // 29 or 30
```
## Validate a Hijri Date
```dart
final valid = isValid(1446, 9, 15); // true
final bad = isValid(1446, 13, 1); // false (month 13 does not exist)
```
## Supported Date Range
The Umm al-Qura engine covers 1318 AH (1900 CE) through 1500 AH (2077 CE). Dates outside this range return `null`. The FCNA engine uses a calculated formula with no hard date limit.

3
.gitignore vendored
View file

@ -25,3 +25,6 @@ Thumbs.db
.windsurf/
.gemini/
.codeium/
# Secrets
.env*

23
CHANGELOG.md Normal file
View file

@ -0,0 +1,23 @@
# Changelog
All notable changes to this project will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
This project adheres to [Semantic Versioning](https://semver.org/).
## [1.0.0] - 2026-05-25
### Added
- Initial public release.
- `toHijri` — converts a Gregorian `DateTime` to a Hijri date tuple.
- `fromHijri` — converts a Hijri date tuple to a Gregorian `DateTime`.
- `daysInMonth` — returns the number of days in a given Hijri month for a given engine.
- `isValid` — validates a Hijri date for a given engine.
- `listCalendars` / `getCalendar` — registry API for available calendar engines.
- Built-in Umm al-Qura (UAQ) engine with tabular data.
- Built-in FCNA (Fiqh Council of North America) calculated engine.
- Pluggable `CalendarEngine` abstract class for custom Hijri calendar implementations.
- Pure Dart implementation. Zero runtime dependencies.
- Dart SDK `^3.7.0` compatibility.
- 42 unit tests covering all 8 SPORT features across both UAQ and FCNA engines.

View file

@ -3,8 +3,10 @@ description: >
Hijri/Gregorian calendar conversion for Dart and Flutter. Pluggable engine
system with built-in Umm al-Qura and FCNA calendars. Zero dependencies.
version: 1.0.0
homepage: https://github.com/acamarata/hijri-core-dart
repository: https://github.com/acamarata/hijri-core-dart
issue_tracker: https://github.com/acamarata/hijri-core-dart/issues
publisher: ariccamarata.com
topics:
- hijri
- islamic