diff --git a/app/db/src/app/common/bible-reference.spec.ts b/app/db/src/app/common/bible-reference.spec.ts index 85197baf..ccb9a77e 100644 --- a/app/db/src/app/common/bible-reference.spec.ts +++ b/app/db/src/app/common/bible-reference.spec.ts @@ -32,9 +32,7 @@ describe('Reference', () => { }); it('Should parse the reference: 2 Samuel 5:5-6:5', () => { - expect(new BibleReference('II sam 5:5-6:5').toString()).toBe( - '2 Samuel 5:5 - 6:5' - ); + expect(new BibleReference('II sam 5:5-6:5').toString()).toBe('2 Samuel 5:5 - 6:5'); }); const booknames = [ @@ -268,22 +266,14 @@ describe('Reference', () => { expect(book.name).toBe(bk.actual); for (let i = 1; i < book.lastChapter; i++) { - expect( - new BibleReference( - bk.abbr + ' ' + i + ':3-' + (i + 1) + ':6' - ).toString() - ).toBe(bk.actual + ' ' + i + ':3 - ' + (i + 1) + ':6'); + expect(new BibleReference(bk.abbr + ' ' + i + ':3-' + (i + 1) + ':6').toString()).toBe( + bk.actual + ' ' + i + ':3 - ' + (i + 1) + ':6' + ); } - expect(new BibleReference(bk.abbr + ' 1:4-2:5').toString()).toBe( - bk.actual + ' 1:4 - 2:5' - ); - expect(new BibleReference(bk.abbr + ' 1:1 - 5').toString()).toBe( - bk.actual + ' 1:1 - 5' - ); - expect(new BibleReference(bk.abbr + ' 1:4 - 5').toString()).toBe( - bk.actual + ' 1:4 - 5' - ); + expect(new BibleReference(bk.abbr + ' 1:4-2:5').toString()).toBe(bk.actual + ' 1:4 - 2:5'); + expect(new BibleReference(bk.abbr + ' 1:1 - 5').toString()).toBe(bk.actual + ' 1:1 - 5'); + expect(new BibleReference(bk.abbr + ' 1:4 - 5').toString()).toBe(bk.actual + ' 1:4 - 5'); }); } @@ -297,31 +287,70 @@ describe('Reference', () => { }); describe('Reference Overlap Detection', () => { - // it('Different books dont overlap', () => { - // const leftRf = new BibleReference('Gen 1:1-5'); - // const rightRef = new BibleReference('Exodus 1:3-7'); - // - // expect(BibleReference.overlap(leftRf, rightRef)).toBe(Overlap.None); - // }); - // - // it('Different chapters dont overlap', () => { - // const leftRef = new BibleReference('Gen 1:1-5'); - // const rightRef = new BibleReference('Gen 2:1-5'); - // - // expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.None); - // }); - // - // it('Detects Left intersects the front of Right', () => { - // const leftRef = new BibleReference('Gen 1:1-5'); - // const rightRef = new BibleReference('Gen 1:4-5'); - // - // expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); - // }); + it('Different books dont overlap', () => { + const leftRef = new BibleReference('Gen 1:1-5'); + const rightRef = new BibleReference('Exodus 1:3-7'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.None); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toBeNull(); + }); + + it('Different chapters dont overlap', () => { + const leftRef = new BibleReference('Gen 1:1-5'); + const rightRef = new BibleReference('Gen 2:1-5'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.None); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); + }); + + it('Detects Left intersects the front of Right', () => { + const leftRef = new BibleReference('Gen 1:1-5'); + const rightRef = new BibleReference('Gen 1:4-6'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-6')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); + }); it('Detects Right intersects the front of left', () => { const leftRef = new BibleReference('Gen 1:7-10'); - const rightRef = new BibleReference('Gen 1:5-8'); + const rightRef = new BibleReference('Gen 1:1-8'); expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Intersect); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toBeNull(); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); }); -}); \ No newline at end of file + + it('Detects Left embedded in Right', () => { + const leftRef = new BibleReference('Gen 1:2-8'); + const rightRef = new BibleReference('Gen 1:1-10'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); + }); + + it('Detects Both are Equal', () => { + const leftRef = new BibleReference('Gen 1:1-10'); + const rightRef = new BibleReference('Gen 1:1-10'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toEqual(new BibleReference('Gen 1:1-10')); + }); + + it('Detects Right embedded in Left', () => { + const leftRef = new BibleReference('Gen 1:1-10'); + const rightRef = new BibleReference('Gen 1:2-8'); + + expect(BibleReference.overlap(leftRef, rightRef)).toBe(Overlap.Subset); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Intersect)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.Subset)).toEqual(new BibleReference('Gen 1:1-10')); + expect(BibleReference.mergeReference(leftRef, rightRef, Overlap.None)).toBeNull(); + }); +}); diff --git a/app/db/src/app/common/bible-reference.ts b/app/db/src/app/common/bible-reference.ts index 9ff4161b..599d058c 100644 --- a/app/db/src/app/common/bible-reference.ts +++ b/app/db/src/app/common/bible-reference.ts @@ -19,7 +19,59 @@ export class BibleReference { longName: 'Book of Genesis', bookNumber: 1, lastChapter: 66, - chapters: [0, 31, 25, 24, 26, 32, 22, 24, 22, 29, 32, 32, 20, 18, 24, 21, 16, 27, 33, 38, 18, 34, 24, 20, 67, 34, 35, 46, 22, 35, 43, 55, 32, 20, 31, 29, 43, 36, 30, 23, 23, 57, 38, 34, 34, 28, 34, 31, 22, 33, 26], + chapters: [ + 0, + 31, + 25, + 24, + 26, + 32, + 22, + 24, + 22, + 29, + 32, + 32, + 20, + 18, + 24, + 21, + 16, + 27, + 33, + 38, + 18, + 34, + 24, + 20, + 67, + 34, + 35, + 46, + 22, + 35, + 43, + 55, + 32, + 20, + 31, + 29, + 43, + 36, + 30, + 23, + 23, + 57, + 38, + 34, + 34, + 28, + 34, + 31, + 22, + 33, + 26, + ], }, { bookNumber: 2, @@ -27,7 +79,49 @@ export class BibleReference { name: 'Exodus', longName: 'Book of Exodus', lastChapter: 40, - chapters: [0, 22, 25, 22, 31, 23, 30, 25, 32, 35, 29, 10, 51, 22, 31, 27, 36, 16, 27, 25, 26, 36, 31, 33, 18, 40, 37, 21, 43, 46, 38, 18, 35, 23, 35, 35, 38, 29, 31, 43, 38], + chapters: [ + 0, + 22, + 25, + 22, + 31, + 23, + 30, + 25, + 32, + 35, + 29, + 10, + 51, + 22, + 31, + 27, + 36, + 16, + 27, + 25, + 26, + 36, + 31, + 33, + 18, + 40, + 37, + 21, + 43, + 46, + 38, + 18, + 35, + 23, + 35, + 35, + 38, + 29, + 31, + 43, + 38, + ], }, { bookNumber: 3, @@ -35,7 +129,36 @@ export class BibleReference { abbreviation: 'Lev', longName: 'Leviticus', lastChapter: 27, - chapters: [0, 17, 16, 17, 35, 19, 30, 38, 36, 24, 20, 47, 8, 59, 57, 33, 34, 16, 30, 37, 27, 24, 33, 44, 23, 55, 46, 34], + chapters: [ + 0, + 17, + 16, + 17, + 35, + 19, + 30, + 38, + 36, + 24, + 20, + 47, + 8, + 59, + 57, + 33, + 34, + 16, + 30, + 37, + 27, + 24, + 33, + 44, + 23, + 55, + 46, + 34, + ], }, { bookNumber: 4, @@ -43,7 +166,45 @@ export class BibleReference { abbreviation: 'Num', longName: 'Book of Numbers', lastChapter: 36, - chapters: [0, 54, 34, 51, 49, 31, 27, 89, 26, 23, 36, 35, 16, 33, 45, 41, 50, 13, 32, 22, 29, 35, 41, 30, 25, 18, 65, 23, 31, 40, 16, 54, 42, 56, 29, 34, 13], + chapters: [ + 0, + 54, + 34, + 51, + 49, + 31, + 27, + 89, + 26, + 23, + 36, + 35, + 16, + 33, + 45, + 41, + 50, + 13, + 32, + 22, + 29, + 35, + 41, + 30, + 25, + 18, + 65, + 23, + 31, + 40, + 16, + 54, + 42, + 56, + 29, + 34, + 13, + ], }, { bookNumber: 5, @@ -51,7 +212,43 @@ export class BibleReference { abbreviation: 'Deut', longName: 'Book of Deuteronomy', lastChapter: 34, - chapters: [0, 46, 37, 29, 49, 33, 25, 26, 20, 29, 22, 32, 32, 18, 29, 23, 22, 20, 22, 21, 20, 23, 30, 25, 22, 19, 19, 26, 68, 29, 20, 30, 52, 29, 12], + chapters: [ + 0, + 46, + 37, + 29, + 49, + 33, + 25, + 26, + 20, + 29, + 22, + 32, + 32, + 18, + 29, + 23, + 22, + 20, + 22, + 21, + 20, + 23, + 30, + 25, + 22, + 19, + 19, + 26, + 68, + 29, + 20, + 30, + 52, + 29, + 12, + ], }, { bookNumber: 6, @@ -59,7 +256,33 @@ export class BibleReference { abbreviation: 'Josh', longName: 'Book of Joshua', lastChapter: 24, - chapters: [0, 18, 24, 17, 24, 15, 27, 26, 35, 27, 43, 23, 24, 33, 15, 63, 10, 18, 28, 51, 9, 45, 34, 16, 33], + chapters: [ + 0, + 18, + 24, + 17, + 24, + 15, + 27, + 26, + 35, + 27, + 43, + 23, + 24, + 33, + 15, + 63, + 10, + 18, + 28, + 51, + 9, + 45, + 34, + 16, + 33, + ], }, { bookNumber: 7, @@ -67,7 +290,30 @@ export class BibleReference { abbreviation: 'Jud', longName: 'Book of Judges', lastChapter: 21, - chapters: [0, 36, 23, 31, 24, 31, 40, 25, 35, 57, 18, 40, 15, 25, 20, 20, 31, 13, 31, 30, 48, 25], + chapters: [ + 0, + 36, + 23, + 31, + 24, + 31, + 40, + 25, + 35, + 57, + 18, + 40, + 15, + 25, + 20, + 20, + 31, + 13, + 31, + 30, + 48, + 25, + ], }, { bookNumber: 8, @@ -83,7 +329,40 @@ export class BibleReference { abbreviation: '1 Sam', longName: 'First Book of Samuel', lastChapter: 31, - chapters: [0, 28, 36, 21, 22, 12, 21, 17, 22, 27, 27, 15, 25, 23, 52, 35, 23, 58, 30, 24, 42, 15, 23, 29, 22, 44, 25, 12, 25, 11, 31, 13], + chapters: [ + 0, + 28, + 36, + 21, + 22, + 12, + 21, + 17, + 22, + 27, + 27, + 15, + 25, + 23, + 52, + 35, + 23, + 58, + 30, + 24, + 42, + 15, + 23, + 29, + 22, + 44, + 25, + 12, + 25, + 11, + 31, + 13, + ], }, { bookNumber: 10, @@ -91,7 +370,33 @@ export class BibleReference { abbreviation: '2 Sam', longName: 'Second Book of Samuel', lastChapter: 24, - chapters: [0, 27, 32, 39, 12, 25, 23, 29, 18, 13, 19, 27, 31, 39, 33, 37, 23, 29, 33, 43, 26, 22, 51, 39, 25], + chapters: [ + 0, + 27, + 32, + 39, + 12, + 25, + 23, + 29, + 18, + 13, + 19, + 27, + 31, + 39, + 33, + 37, + 23, + 29, + 33, + 43, + 26, + 22, + 51, + 39, + 25, + ], }, { bookNumber: 11, @@ -99,7 +404,31 @@ export class BibleReference { abbreviation: '1 Kng', longName: 'First Book of Kings', lastChapter: 22, - chapters: [0, 53, 46, 28, 34, 18, 38, 51, 66, 28, 29, 43, 33, 34, 31, 34, 34, 24, 46, 21, 43, 29, 53], + chapters: [ + 0, + 53, + 46, + 28, + 34, + 18, + 38, + 51, + 66, + 28, + 29, + 43, + 33, + 34, + 31, + 34, + 34, + 24, + 46, + 21, + 43, + 29, + 53, + ], }, { bookNumber: 12, @@ -107,7 +436,34 @@ export class BibleReference { abbreviation: '2 Kng', longName: 'Second Book of Kings', lastChapter: 25, - chapters: [0, 18, 25, 27, 44, 27, 33, 20, 29, 37, 36, 21, 21, 25, 29, 38, 20, 41, 37, 37, 21, 26, 20, 37, 20, 30], + chapters: [ + 0, + 18, + 25, + 27, + 44, + 27, + 33, + 20, + 29, + 37, + 36, + 21, + 21, + 25, + 29, + 38, + 20, + 41, + 37, + 37, + 21, + 26, + 20, + 37, + 20, + 30, + ], }, { bookNumber: 13, @@ -115,7 +471,38 @@ export class BibleReference { abbreviation: '1 Chr', longName: 'First Book of Chronicles', lastChapter: 29, - chapters: [0, 54, 55, 24, 43, 26, 81, 40, 40, 44, 14, 47, 40, 14, 17, 29, 43, 27, 17, 19, 8, 30, 19, 32, 31, 31, 32, 34, 21, 30], + chapters: [ + 0, + 54, + 55, + 24, + 43, + 26, + 81, + 40, + 40, + 44, + 14, + 47, + 40, + 14, + 17, + 29, + 43, + 27, + 17, + 19, + 8, + 30, + 19, + 32, + 31, + 31, + 32, + 34, + 21, + 30, + ], }, { bookNumber: 14, @@ -123,7 +510,45 @@ export class BibleReference { abbreviation: '2 Chr', longName: 'Second Book of Chronicles', lastChapter: 36, - chapters: [0, 17, 18, 17, 22, 14, 42, 22, 18, 31, 19, 23, 16, 22, 15, 19, 14, 19, 34, 11, 37, 20, 12, 21, 27, 28, 23, 9, 27, 36, 27, 21, 33, 25, 33, 27, 23], + chapters: [ + 0, + 17, + 18, + 17, + 22, + 14, + 42, + 22, + 18, + 31, + 19, + 23, + 16, + 22, + 15, + 19, + 14, + 19, + 34, + 11, + 37, + 20, + 12, + 21, + 27, + 28, + 23, + 9, + 27, + 36, + 27, + 21, + 33, + 25, + 33, + 27, + 23, + ], }, { bookNumber: 15, @@ -155,7 +580,51 @@ export class BibleReference { abbreviation: 'Job', longName: 'Book of Job', lastChapter: 42, - chapters: [0, 22, 13, 26, 21, 27, 30, 21, 22, 35, 22, 20, 25, 28, 22, 35, 22, 16, 21, 29, 29, 34, 30, 17, 25, 6, 14, 23, 28, 25, 31, 40, 22, 33, 37, 16, 33, 24, 41, 30, 24, 34, 17], + chapters: [ + 0, + 22, + 13, + 26, + 21, + 27, + 30, + 21, + 22, + 35, + 22, + 20, + 25, + 28, + 22, + 35, + 22, + 16, + 21, + 29, + 29, + 34, + 30, + 17, + 25, + 6, + 14, + 23, + 28, + 25, + 31, + 40, + 22, + 33, + 37, + 16, + 33, + 24, + 41, + 30, + 24, + 34, + 17, + ], }, { bookNumber: 19, @@ -163,7 +632,159 @@ export class BibleReference { abbreviation: 'Psalm', longName: 'Book of Psalms', lastChapter: 150, - chapters: [0, 6, 12, 8, 8, 12, 10, 17, 9, 20, 18, 7, 8, 6, 7, 5, 11, 15, 50, 14, 9, 13, 31, 6, 10, 22, 12, 14, 9, 11, 12, 24, 11, 22, 22, 28, 12, 40, 22, 13, 17, 13, 11, 5, 26, 17, 11, 9, 14, 20, 23, 19, 9, 6, 7, 23, 13, 11, 11, 17, 12, 8, 12, 11, 10, 13, 20, 7, 35, 36, 5, 24, 20, 28, 23, 10, 12, 20, 72, 13, 19, 16, 8, 18, 12, 13, 17, 7, 18, 52, 17, 16, 15, 5, 23, 11, 13, 12, 9, 9, 5, 8, 28, 22, 35, 45, 48, 43, 13, 31, 7, 10, 10, 9, 8, 18, 19, 2, 29, 176, 7, 8, 9, 4, 8, 5, 6, 5, 6, 8, 8, 3, 18, 3, 3, 21, 26, 9, 8, 24, 13, 10, 7, 12, 15, 21, 10, 20, 14, 9, 6], + chapters: [ + 0, + 6, + 12, + 8, + 8, + 12, + 10, + 17, + 9, + 20, + 18, + 7, + 8, + 6, + 7, + 5, + 11, + 15, + 50, + 14, + 9, + 13, + 31, + 6, + 10, + 22, + 12, + 14, + 9, + 11, + 12, + 24, + 11, + 22, + 22, + 28, + 12, + 40, + 22, + 13, + 17, + 13, + 11, + 5, + 26, + 17, + 11, + 9, + 14, + 20, + 23, + 19, + 9, + 6, + 7, + 23, + 13, + 11, + 11, + 17, + 12, + 8, + 12, + 11, + 10, + 13, + 20, + 7, + 35, + 36, + 5, + 24, + 20, + 28, + 23, + 10, + 12, + 20, + 72, + 13, + 19, + 16, + 8, + 18, + 12, + 13, + 17, + 7, + 18, + 52, + 17, + 16, + 15, + 5, + 23, + 11, + 13, + 12, + 9, + 9, + 5, + 8, + 28, + 22, + 35, + 45, + 48, + 43, + 13, + 31, + 7, + 10, + 10, + 9, + 8, + 18, + 19, + 2, + 29, + 176, + 7, + 8, + 9, + 4, + 8, + 5, + 6, + 5, + 6, + 8, + 8, + 3, + 18, + 3, + 3, + 21, + 26, + 9, + 8, + 24, + 13, + 10, + 7, + 12, + 15, + 21, + 10, + 20, + 14, + 9, + 6, + ], }, { bookNumber: 20, @@ -171,7 +792,40 @@ export class BibleReference { abbreviation: 'Prov', longName: 'Book of Proverbs', lastChapter: 31, - chapters: [0, 33, 22, 35, 27, 23, 35, 27, 36, 18, 32, 31, 28, 25, 35, 33, 33, 28, 24, 29, 30, 31, 29, 35, 34, 28, 28, 27, 28, 27, 33, 31], + chapters: [ + 0, + 33, + 22, + 35, + 27, + 23, + 35, + 27, + 36, + 18, + 32, + 31, + 28, + 25, + 35, + 33, + 33, + 28, + 24, + 29, + 30, + 31, + 29, + 35, + 34, + 28, + 28, + 27, + 28, + 27, + 33, + 31, + ], }, { bookNumber: 21, @@ -195,7 +849,75 @@ export class BibleReference { abbreviation: 'Isa', longName: 'Book of Isaiah', lastChapter: 66, - chapters: [0, 31, 22, 26, 6, 30, 13, 25, 22, 21, 34, 16, 6, 22, 32, 9, 14, 14, 7, 25, 6, 17, 25, 18, 23, 12, 21, 13, 29, 24, 33, 9, 20, 24, 17, 10, 22, 38, 22, 8, 31, 29, 25, 28, 28, 25, 13, 15, 22, 26, 11, 23, 15, 12, 17, 13, 12, 21, 14, 21, 22, 11, 12, 19, 12, 25, 24], + chapters: [ + 0, + 31, + 22, + 26, + 6, + 30, + 13, + 25, + 22, + 21, + 34, + 16, + 6, + 22, + 32, + 9, + 14, + 14, + 7, + 25, + 6, + 17, + 25, + 18, + 23, + 12, + 21, + 13, + 29, + 24, + 33, + 9, + 20, + 24, + 17, + 10, + 22, + 38, + 22, + 8, + 31, + 29, + 25, + 28, + 28, + 25, + 13, + 15, + 22, + 26, + 11, + 23, + 15, + 12, + 17, + 13, + 12, + 21, + 14, + 21, + 22, + 11, + 12, + 19, + 12, + 25, + 24, + ], }, { bookNumber: 24, @@ -203,7 +925,61 @@ export class BibleReference { abbreviation: 'Jer', longName: 'Book of Jeremiah', lastChapter: 52, - chapters: [0, 19, 37, 25, 31, 31, 30, 34, 22, 26, 25, 23, 17, 27, 22, 21, 21, 27, 23, 15, 18, 14, 30, 40, 10, 38, 24, 22, 17, 32, 24, 40, 44, 26, 22, 19, 32, 21, 28, 18, 16, 18, 22, 13, 30, 5, 28, 7, 47, 39, 46, 64, 34], + chapters: [ + 0, + 19, + 37, + 25, + 31, + 31, + 30, + 34, + 22, + 26, + 25, + 23, + 17, + 27, + 22, + 21, + 21, + 27, + 23, + 15, + 18, + 14, + 30, + 40, + 10, + 38, + 24, + 22, + 17, + 32, + 24, + 40, + 44, + 26, + 22, + 19, + 32, + 21, + 28, + 18, + 16, + 18, + 22, + 13, + 30, + 5, + 28, + 7, + 47, + 39, + 46, + 64, + 34, + ], }, { bookNumber: 25, @@ -219,7 +995,57 @@ export class BibleReference { abbreviation: 'Eze', longName: 'Book of Ezekiel', lastChapter: 48, - chapters: [0, 28, 10, 27, 17, 17, 14, 27, 18, 11, 22, 25, 28, 23, 23, 8, 63, 24, 32, 14, 49, 32, 31, 49, 27, 17, 21, 36, 26, 21, 26, 18, 32, 33, 31, 15, 38, 28, 23, 29, 49, 26, 20, 27, 31, 25, 24, 23, 35], + chapters: [ + 0, + 28, + 10, + 27, + 17, + 17, + 14, + 27, + 18, + 11, + 22, + 25, + 28, + 23, + 23, + 8, + 63, + 24, + 32, + 14, + 49, + 32, + 31, + 49, + 27, + 17, + 21, + 36, + 26, + 21, + 26, + 18, + 32, + 33, + 31, + 15, + 38, + 28, + 23, + 29, + 49, + 26, + 20, + 27, + 31, + 25, + 24, + 23, + 35, + ], }, { bookNumber: 27, @@ -331,7 +1157,37 @@ export class BibleReference { abbreviation: 'Matt', longName: 'Gospel of Matthew', lastChapter: 28, - chapters: [0, 25, 23, 17, 25, 48, 34, 29, 34, 38, 42, 30, 50, 58, 36, 39, 28, 27, 35, 30, 34, 46, 46, 39, 51, 46, 75, 66, 20], + chapters: [ + 0, + 25, + 23, + 17, + 25, + 48, + 34, + 29, + 34, + 38, + 42, + 30, + 50, + 58, + 36, + 39, + 28, + 27, + 35, + 30, + 34, + 46, + 46, + 39, + 51, + 46, + 75, + 66, + 20, + ], }, { bookNumber: 41, @@ -339,7 +1195,25 @@ export class BibleReference { abbreviation: 'Mark', longName: 'Gospel of Mark', lastChapter: 16, - chapters: [0, 45, 28, 35, 41, 43, 56, 37, 38, 50, 52, 33, 44, 37, 72, 47, 20], + chapters: [ + 0, + 45, + 28, + 35, + 41, + 43, + 56, + 37, + 38, + 50, + 52, + 33, + 44, + 37, + 72, + 47, + 20, + ], }, { bookNumber: 42, @@ -347,7 +1221,33 @@ export class BibleReference { abbreviation: 'Luke', longName: 'Gospel of Luke', lastChapter: 24, - chapters: [0, 80, 52, 38, 44, 39, 49, 50, 56, 62, 42, 54, 59, 35, 35, 32, 31, 37, 43, 48, 47, 38, 71, 56, 53], + chapters: [ + 0, + 80, + 52, + 38, + 44, + 39, + 49, + 50, + 56, + 62, + 42, + 54, + 59, + 35, + 35, + 32, + 31, + 37, + 43, + 48, + 47, + 38, + 71, + 56, + 53, + ], }, { bookNumber: 43, @@ -355,7 +1255,30 @@ export class BibleReference { abbreviation: 'John', longName: 'Gospel of John', lastChapter: 21, - chapters: [0, 51, 25, 36, 54, 47, 71, 53, 59, 41, 42, 57, 50, 38, 31, 27, 33, 26, 40, 42, 31, 25], + chapters: [ + 0, + 51, + 25, + 36, + 54, + 47, + 71, + 53, + 59, + 41, + 42, + 57, + 50, + 38, + 31, + 27, + 33, + 26, + 40, + 42, + 31, + 25, + ], }, { bookNumber: 44, @@ -363,7 +1286,37 @@ export class BibleReference { abbreviation: 'Acts', longName: 'Acts of the Apostles', lastChapter: 28, - chapters: [0, 26, 47, 26, 37, 42, 15, 60, 40, 43, 48, 30, 25, 52, 28, 41, 40, 34, 28, 41, 38, 40, 30, 35, 27, 27, 32, 44, 31], + chapters: [ + 0, + 26, + 47, + 26, + 37, + 42, + 15, + 60, + 40, + 43, + 48, + 30, + 25, + 52, + 28, + 41, + 40, + 34, + 28, + 41, + 38, + 40, + 30, + 35, + 27, + 27, + 32, + 44, + 31, + ], }, { bookNumber: 45, @@ -371,7 +1324,25 @@ export class BibleReference { abbreviation: 'Rom', longName: 'Epistle to the Romans', lastChapter: 16, - chapters: [0, 32, 29, 31, 25, 21, 23, 25, 39, 33, 21, 36, 21, 14, 23, 33, 27], + chapters: [ + 0, + 32, + 29, + 31, + 25, + 21, + 23, + 25, + 39, + 33, + 21, + 36, + 21, + 14, + 23, + 33, + 27, + ], }, { bookNumber: 46, @@ -379,7 +1350,25 @@ export class BibleReference { abbreviation: '1 Cor', longName: 'First Epistle to the Corinthians', lastChapter: 16, - chapters: [0, 31, 16, 23, 21, 13, 20, 40, 13, 27, 33, 34, 31, 13, 40, 58, 24], + chapters: [ + 0, + 31, + 16, + 23, + 21, + 13, + 20, + 40, + 13, + 27, + 33, + 34, + 31, + 13, + 40, + 58, + 24, + ], }, { bookNumber: 47, @@ -539,7 +1528,31 @@ export class BibleReference { abbreviation: 'Rev', longName: 'Book of Revelations', lastChapter: 22, - chapters: [0, 20, 29, 22, 11, 14, 17, 17, 13, 21, 11, 19, 17, 18, 20, 8, 21, 18, 24, 21, 15, 27, 21], + chapters: [ + 0, + 20, + 29, + 22, + 11, + 14, + 17, + 17, + 13, + 21, + 11, + 19, + 17, + 18, + 20, + 8, + 21, + 18, + 24, + 21, + 15, + 27, + 21, + ], }, ]; @@ -565,14 +1578,19 @@ export class BibleReference { if (this.section.end.chapter === 0) { this.section.end.chapter = this.section.start.chapter; } - if (Number(this.section.start.verse) > Number(this.section.end.verse) && this.section.start.chapter === this.section.end.chapter) { + if ( + Number(this.section.start.verse) > Number(this.section.end.verse) && + this.section.start.chapter === this.section.end.chapter + ) { this.section.end.verse = this.section.start.verse; } if (this.section.start.verse === 0) { this.section.start.verse = 1; } if (this.section.end.verse === 0) { - this.section.end.verse = this.section.book.chapters[this.section.end.chapter]; + this.section.end.verse = this.section.book.chapters[ + this.section.end.chapter + ]; } } @@ -606,19 +1624,31 @@ export class BibleReference { if (fbook.search(/\b(1|i|1st|first)\s*(samuel|sa|sam|sml)\b/i) !== -1) { return this.bookName(9); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(samuel|sa|sam|sml)\b/i) !== -1) { + if ( + fbook.search(/\b(2|ii|2nd|second|sec)\s*(samuel|sa|sam|sml)\b/i) !== -1 + ) { return this.bookName(10); } - if (fbook.search(/\b(1|i|1st|first)\s*(kings|king|kgs|kn|k|ki)\b/i) !== -1) { + if ( + fbook.search(/\b(1|i|1st|first)\s*(kings|king|kgs|kn|k|ki)\b/i) !== -1 + ) { return this.bookName(11); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(kings|king|kgs|kn|k|ki)\b/i) !== -1) { + if ( + fbook.search(/\b(2|ii|2nd|second|sec)\s*(kings|king|kgs|kn|k|ki)\b/i) !== + -1 + ) { return this.bookName(12); } - if (fbook.search(/\b(1|i|1st|first)\s*(chronicles|chron|ch|chr)\b/i) !== -1) { + if ( + fbook.search(/\b(1|i|1st|first)\s*(chronicles|chron|ch|chr)\b/i) !== -1 + ) { return this.bookName(13); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(chronicles|chron|ch|chr)\b/i) !== -1) { + if ( + fbook.search(/\b(2|ii|2nd|second|sec)\s*(chronicles|chron|ch|chr)\b/i) !== + -1 + ) { return this.bookName(14); } if (fbook.search(/\b(ezra|ezr)\b/i) !== -1) { @@ -639,10 +1669,17 @@ export class BibleReference { if (fbook.search(/\b(proverbs|prov|pr|pro|proverb|prv|prvbs)\b/i) !== -1) { return this.bookName(20); } - if (fbook.search(/\b(ecclesiastes|eccl|ecc|eccles|ec|ecl|ecclesiaste)\b/i) !== -1) { + if ( + fbook.search(/\b(ecclesiastes|eccl|ecc|eccles|ec|ecl|ecclesiaste)\b/i) !== + -1 + ) { return this.bookName(21); } - if (fbook.search(/\b(song\sof\ssolomon|song\sof\ssongs|sos|ss|son|so|song|songs)\b/i) !== -1) { + if ( + fbook.search( + /\b(song\sof\ssolomon|song\sof\ssongs|sos|ss|son|so|song|songs)\b/i + ) !== -1 + ) { return this.bookName(22); } if (fbook.search(/\b(isaiah|is|isah|isai|ia)\b/i) !== -1) { @@ -725,13 +1762,25 @@ export class BibleReference { if (fbook.search(/\b(romans|rom|ro|rm|roman)\b/i) !== -1) { return this.bookName(45); } - if (fbook.search(/\b(1|i|1st|first)\s*(corinthian|cor|corinthians|corinth|corin|corth|corint)\b/i) !== -1) { + if ( + fbook.search( + /\b(1|i|1st|first)\s*(corinthian|cor|corinthians|corinth|corin|corth|corint)\b/i + ) !== -1 + ) { return this.bookName(46); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(corinthian|cor|corinthians|corinth|corin|corth|corint)\b/i) !== -1) { + if ( + fbook.search( + /\b(2|ii|2nd|second|sec)\s*(corinthian|cor|corinthians|corinth|corin|corth|corint)\b/i + ) !== -1 + ) { return this.bookName(47); } - if (fbook.search(/\b(galatians|galatian|galations|gal|ga|gala|galation|galat)\b/i) !== -1) { + if ( + fbook.search( + /\b(galatians|galatian|galations|gal|ga|gala|galation|galat)\b/i + ) !== -1 + ) { return this.bookName(48); } if (fbook.search(/\b(ephesians|eph|ep|ephes|ephe|ephs)\b/i) !== -1) { @@ -740,19 +1789,34 @@ export class BibleReference { if (fbook.search(/\b(philippians|phi|phil|ph|philip)\b/i) !== -1) { return this.bookName(50); } - if (fbook.search(/\b(colossians|col|co|colossian|colos|coloss)\b/i) !== -1) { + if ( + fbook.search(/\b(colossians|col|co|colossian|colos|coloss)\b/i) !== -1 + ) { return this.bookName(51); } - if (fbook.search(/\b(1|i|1st|first)\s*(thessalonians|the|thessa|thessalonian|thes|thess|th)\b/i) !== -1) { + if ( + fbook.search( + /\b(1|i|1st|first)\s*(thessalonians|the|thessa|thessalonian|thes|thess|th)\b/i + ) !== -1 + ) { return this.bookName(52); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(thessalonians|the|thessa|thessalonian|thes|thess|th)\b/i) !== -1) { + if ( + fbook.search( + /\b(2|ii|2nd|second|sec)\s*(thessalonians|the|thessa|thessalonian|thes|thess|th)\b/i + ) !== -1 + ) { return this.bookName(53); } - if (fbook.search(/\b(1|i|1st|first)\s*(timothy|tim|ti|timoth|tm)\b/i) !== -1) { + if ( + fbook.search(/\b(1|i|1st|first)\s*(timothy|tim|ti|timoth|tm)\b/i) !== -1 + ) { return this.bookName(54); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(timothy|tim|timoth|tm)\b/i) !== -1) { + if ( + fbook.search(/\b(2|ii|2nd|second|sec)\s*(timothy|tim|timoth|tm)\b/i) !== + -1 + ) { return this.bookName(55); } if (fbook.search(/\b(titus|tit)\b/i) !== -1) { @@ -767,10 +1831,15 @@ export class BibleReference { if (fbook.search(/\b(james|jam|ja|jas|jms|jame|jm)\b/i) !== -1) { return this.bookName(59); } - if (fbook.search(/\b(1|i|1st|first)\s*(peter|pe|pet|pete|pt|p)\b/i) !== -1) { + if ( + fbook.search(/\b(1|i|1st|first)\s*(peter|pe|pet|pete|pt|p)\b/i) !== -1 + ) { return this.bookName(60); } - if (fbook.search(/\b(2|ii|2nd|second|sec)\s*(peter|pe|pet|pete|pt|p)\b/i) !== -1) { + if ( + fbook.search(/\b(2|ii|2nd|second|sec)\s*(peter|pe|pet|pete|pt|p)\b/i) !== + -1 + ) { return this.bookName(61); } if (fbook.search(/\b(jude|ju)\b/i) !== -1) { @@ -785,13 +1854,23 @@ export class BibleReference { static toString(section: Section) { // get the starting book, chapter, verse - let ref = section.book.name.concat(' ').concat(section.start.chapter.toString()).concat(':').concat(section.start.verse.toString()); + let ref = section.book.name + .concat(' ') + .concat(section.start.chapter.toString()) + .concat(':') + .concat(section.start.verse.toString()); - if (section.start.chapter === section.end.chapter && section.start.verse === section.end.verse) { + if ( + section.start.chapter === section.end.chapter && + section.start.verse === section.end.verse + ) { return ref; } - if (section.start.chapter === section.end.chapter && section.start.verse !== section.end.verse) { + if ( + section.start.chapter === section.end.chapter && + section.start.verse !== section.end.verse + ) { return ref.concat(' - ').concat(section.end.verse.toString()); } @@ -806,7 +1885,11 @@ export class BibleReference { return this.Books[booknum]; } - static formatReferenceKey(book: number | string, chapter: number | string, vs: number | string) { + static formatReferenceKey( + book: number | string, + chapter: number | string, + vs: number | string + ) { return `${book}:${chapter}:${vs}`; } @@ -822,23 +1905,64 @@ export class BibleReference { return Overlap.None; } - if (leftRef.section.end.chapter === rightRef.section.start.chapter) { - if (leftRef.section.end.verse > rightRef.section.start.verse || rightRef.section.end.verse > leftRef.section.start.verse) { + if (leftRef.section.start.chapter === rightRef.section.end.chapter) { + if (leftRef.section.start.verse >= rightRef.section.start.verse) { + if (leftRef.section.end.verse <= rightRef.section.end.verse) { + return Overlap.Subset; + } + return Overlap.Intersect; + } else if (rightRef.section.start.verse > leftRef.section.start.verse) { + if (rightRef.section.end.verse < leftRef.section.end.verse) { + return Overlap.Subset; + } return Overlap.Intersect; } } return Overlap.None; } - static mergeReference(ref1: BibleReference, ref2: BibleReference) { - // eliminate based on book first. - if (ref1.section.book !== ref2.section.book) { - // either of the above mean we are not overlapping - return null; + static mergeReference( + ref1: BibleReference, + ref2: BibleReference, + strategy: Overlap + ): BibleReference | null { + if (ref1.toString() === ref2.toString()) { + return ref1; } - // detect overlaps from end - // detect embedded - return null; + let overlapType = BibleReference.overlap(ref1, ref2); + switch (overlapType) { + case Overlap.Subset: + if (strategy !== Overlap.Subset && strategy !== Overlap.Intersect) { + return null; + } + break; + case Overlap.Intersect: + if (strategy !== Overlap.Intersect) { + return null; + } + break; + case Overlap.None: + return null; + } + // Now it's safe to merge + let mergedRef = new BibleReference(ref1.toString()); + mergedRef.section.start.chapter = + ref1.section.start.chapter <= ref2.section.start.chapter + ? ref1.section.start.chapter + : ref2.section.start.chapter; + mergedRef.section.start.verse = + ref1.section.start.verse <= ref2.section.start.verse + ? ref1.section.start.verse + : ref2.section.start.verse; + mergedRef.section.end.chapter = + ref1.section.end.chapter >= ref2.section.end.chapter + ? ref1.section.end.chapter + : ref2.section.end.chapter; + mergedRef.section.end.verse = + ref1.section.end.verse >= ref2.section.end.verse + ? ref1.section.end.verse + : ref2.section.end.verse; + return mergedRef; } //#endregion @@ -975,7 +2099,11 @@ export class BibleReference { }); } - private maybeParseChapterOrVerse(foundSecondBook: boolean, foundFirstVerse: boolean, isEnd: boolean) { + private maybeParseChapterOrVerse( + foundSecondBook: boolean, + foundFirstVerse: boolean, + isEnd: boolean + ) { const self = this; return this.maybeDo(() => { if (self.ref.search(/:/) !== -1 || foundSecondBook || !foundFirstVerse) {