diff --git a/src/DateFormatter.ts b/src/DateFormatter.ts new file mode 100644 index 0000000..1a982db --- /dev/null +++ b/src/DateFormatter.ts @@ -0,0 +1,9 @@ +export interface DateFormatter { + formatDate(date: Date): string; +} + +export class TimeliveDateFormatter implements DateFormatter { + public formatDate(date: Date): string { + return date.toDateString(); + } +} diff --git a/src/DateParser.ts b/src/DateParser.ts new file mode 100644 index 0000000..65c9e35 --- /dev/null +++ b/src/DateParser.ts @@ -0,0 +1,14 @@ +export interface DateParser { + parseDate(dateString: string): Date; +} + +const REGEX_PRESENT = /now|today|present/; + +export class TimeliveDateParser implements DateParser { + public parseDate(dateString: string): Date { + if (REGEX_PRESENT.test(dateString)) { + return new Date(); + } + return new Date(dateString); + } +} diff --git a/src/DateTransformer.ts b/src/DateTransformer.ts new file mode 100644 index 0000000..69e9286 --- /dev/null +++ b/src/DateTransformer.ts @@ -0,0 +1,7 @@ +import { DateParser } from "./DateParser"; +import { DateFormatter } from "./DateFormatter"; + +export class DateTransformer { + constructor(public parser: DateParser, public formatter: DateFormatter) { + } +} diff --git a/src/Timelive.ts b/src/Timelive.ts index e6a5527..bba7de0 100644 --- a/src/Timelive.ts +++ b/src/Timelive.ts @@ -1,3 +1,5 @@ +import { DateTransformer } from "./DateTransformer"; + const DAYS_IN_YEAR = 365.2422; const MILLIS_IN_DAY = 1000 * 3600 * 24; const MILLIS_IN_YEAR = MILLIS_IN_DAY * DAYS_IN_YEAR; @@ -10,6 +12,7 @@ interface TimeEvent { export class Timelive { private root: HTMLElement; + private transformer: DateTransformer; private events: TimeEvent[] = []; // For timeline computation private minDate?: Date; @@ -17,12 +20,13 @@ export class Timelive { private startDateTime: number = 0; private totalDays: number = 0; - constructor(root: HTMLElement) { + constructor(root: HTMLElement, transformer: DateTransformer) { this.root = root; + this.transformer = transformer; } public addEvent(dateString: string, content: string) { - const date = this.parseDate(dateString.toLowerCase()); + const date = this.transformer.parser.parseDate(dateString.trim().toLowerCase()); this.events.push({ date, content, position: 0 }); // Recalculate min/max dates const time = date.getTime(); @@ -104,7 +108,7 @@ export class Timelive { } private formatEvent(event: TimeEvent, before: string = ""): string { - const date = event.date.toLocaleDateString(); + const date = this.transformer.formatter.formatDate(event.date); return before + `