-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Implement Mesopotamian date, editing component & date converter (WiP) * Improve * Extend (WiP) * Fix and update tests * Fix tsc * Improve & update tests * Fix tsc * Refactor * Adjust and unify * Update & fix * Implement date display in fragmentarium search * Date paleography * Fix tests * Make `date` optional in `CroppedAnnotation` * Update style * Refactor & update * Add tests & update
- Loading branch information
Showing
29 changed files
with
18,819 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
import { King } from 'common/BrinkmanKings' | ||
import { MesopotamianDateDto } from 'fragmentarium/domain/FragmentDtos' | ||
import { romanize } from 'romans' | ||
|
||
export interface DateField { | ||
value: string | ||
isBroken?: boolean | ||
isUncertain?: boolean | ||
} | ||
|
||
export interface MonthField extends DateField { | ||
isIntercalary?: boolean | ||
} | ||
|
||
export enum Ur3Calendar { | ||
ADAB = 'Adab', | ||
GIRSU = 'Girsu', | ||
IRISAGRIG = 'Irisagrig', | ||
NIPPUR = 'Nippur', | ||
PUZRISHDAGAN = 'Puzriš-Dagan', | ||
UMMA = 'Umma', | ||
UR = 'Ur', | ||
} | ||
|
||
export class MesopotamianDate { | ||
year: DateField | ||
month: MonthField | ||
day: DateField | ||
king?: King | ||
isSeleucidEra?: boolean | ||
ur3Calendar?: Ur3Calendar | ||
|
||
constructor( | ||
year: DateField, | ||
month: MonthField, | ||
day: DateField, | ||
king?: King, | ||
isSeleucidEra?: boolean, | ||
ur3Calendar?: Ur3Calendar | ||
) { | ||
this.year = year | ||
this.month = month | ||
this.day = day | ||
this.king = king | ||
this.isSeleucidEra = isSeleucidEra | ||
this.ur3Calendar = ur3Calendar | ||
} | ||
|
||
static fromJson(dateJSON: MesopotamianDateDto): MesopotamianDate { | ||
const { year, month, day, king, isSeleucidEra, ur3Calendar } = dateJSON | ||
return new MesopotamianDate( | ||
year, | ||
month, | ||
day, | ||
king, | ||
isSeleucidEra, | ||
ur3Calendar | ||
) | ||
} | ||
|
||
toString(): string { | ||
const dateParts = [ | ||
this.yearToString(), | ||
this.monthToString(), | ||
this.dayToString(), | ||
] | ||
return `${dateParts.join( | ||
'.' | ||
)}${this.kingOrEraToString()}${this.ur3CalendarToString()}` | ||
} | ||
|
||
yearToString(): string { | ||
return this.year.value | ||
? this.brokenAndUncertainToString('year', this.year.value) | ||
: '∅' | ||
} | ||
|
||
monthToString(): string { | ||
const intercalary = this.month.isIntercalary ? '²' : '' | ||
const month = Number(this.month.value) | ||
? romanize(Number(this.month.value)) | ||
: this.month.value | ||
return month | ||
? this.brokenAndUncertainToString('month', month + intercalary) | ||
: '∅' | ||
} | ||
|
||
dayToString(): string { | ||
return this.day.value | ||
? this.brokenAndUncertainToString('day', this.day.value) | ||
: '∅' | ||
} | ||
|
||
brokenAndUncertainToString( | ||
parameter: 'year' | 'day' | 'month', | ||
element: string | ||
): string { | ||
const { isBroken, isUncertain } = this[parameter] | ||
|
||
return `${isBroken ? '⸢' : ''}${element}${isBroken ? '⸣' : ''}${ | ||
isUncertain ? '?' : '' | ||
}` | ||
} | ||
|
||
kingOrEraToString(): string { | ||
const eraOrKing = this.isSeleucidEra ? 'SE' : this.king?.name ?? '' | ||
return eraOrKing ? ' ' + eraOrKing : eraOrKing | ||
} | ||
|
||
ur3CalendarToString(): string { | ||
return this.ur3Calendar ? `, ${this.ur3Calendar} calendar` : '' | ||
} | ||
|
||
toGregorian(): string { | ||
// ToDo: WiP, implement | ||
return '' | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import DateConverter from './DateConverter' | ||
|
||
describe('DateConverter', () => { | ||
let babylonDate: DateConverter | ||
|
||
beforeEach(() => { | ||
babylonDate = new DateConverter() | ||
}) | ||
|
||
test('Set modern date', () => { | ||
babylonDate.setToModernDate(-310, 3, 3) | ||
const expected = { | ||
year: -310, | ||
month: 3, | ||
day: 3, | ||
bcYear: '311', | ||
julianDay: 1607892, | ||
weekDay: 1, | ||
babylonianDay: 29, | ||
babylonianMonth: 11, | ||
babylonianRuler: '4 Alexander IV Aegus', | ||
seBabylonianYear: '0', | ||
seMacedonianYear: '1', | ||
arsacidYear: ' ', | ||
babylonianLunation: 5393, | ||
babylonianMonthLength: 29, | ||
} | ||
expect(babylonDate.calendar).toEqual(expected) | ||
}) | ||
|
||
test('Set Babylonian date', () => { | ||
// WiP. | ||
// ToDo: Update to properly test. | ||
babylonDate.setBabylonianDate(-200, 10, 1) | ||
const expected = { | ||
year: -625, | ||
month: 11, | ||
day: 27, | ||
bcYear: '626', | ||
julianDay: 1493107, | ||
weekDay: 2, | ||
babylonianDay: 1, | ||
babylonianMonth: 9, | ||
babylonianRuler: '1 Interregnum', | ||
seBabylonianYear: '-314', | ||
seMacedonianYear: ' ', | ||
arsacidYear: ' ', | ||
babylonianLunation: 1507, | ||
babylonianMonthLength: 30, | ||
} | ||
expect(babylonDate.calendar).toEqual(expected) | ||
}) | ||
|
||
test('Offset year', () => { | ||
babylonDate.offsetYear(100) | ||
expect(babylonDate.calendar.year).toBe(-210) | ||
}) | ||
|
||
test('Offset month', () => { | ||
babylonDate.offsetMonth(5) | ||
expect(babylonDate.calendar.month).toBe(8) | ||
expect(babylonDate.calendar.year).toBe(-310) | ||
}) | ||
|
||
test('Offset day', () => { | ||
babylonDate.offsetDay(10) | ||
expect(babylonDate.calendar.day).toBe(13) | ||
}) | ||
|
||
test('Get current day', () => { | ||
babylonDate.calendar.day = 25 | ||
expect(babylonDate.getCurrentDay()).toBe(25) | ||
}) | ||
}) |
Oops, something went wrong.