import { Component, EventEmitter, Output, Input, OnInit, ElementRef } from '@angular/core'; import { OpenData, CardItem } from '../../pages/search/search'; import { BiblePassageResult, BibleService, BiblePassage, BibleVerse, HashTable, Paragraph } from '../../services/bible-service'; import { Reference } from '../../libs/Reference'; import { ProfileService } from '../../services/profile-service'; @Component({ selector: 'passage', templateUrl: 'passage.html', providers: [BibleService] }) export class Passage implements OnInit { @Output() onItemClicked = new EventEmitter(); @Output() onClose = new EventEmitter(); @Input() cardItem: CardItem; @Input() versesOnNewLine: boolean; @Input() showVerseNumbers: boolean; data: BiblePassageResult; ref: Reference; constructor(private bibleService: BibleService, private elementRef: ElementRef, private profileService: ProfileService) { } ngOnInit(): void { this.ref = new Reference(this.cardItem.qry); this.bibleService.getResultAsPromise(this.ref.Section).then(data => this.data = data); } close() { let d = 250; this.elementRef.nativeElement.parentElement.animate({ transform: ['none', 'translate3d(110%, 0, 0)'] }, { fill: 'forwards', duration: d, iterations: 1, easing: 'ease-in-out' }); setTimeout(() => { this.onClose.emit(this.cardItem); }, d); } next() { const last_verse_for_end = this.ref.Section.end.book.chapters[parseInt(this.ref.Section.end.chapter)].toString(); if (this.ref.Section.end.verse !== '*' && this.ref.Section.end.verse !== last_verse_for_end) this.ref.Section.end.chapter = this.ref.Section.end.chapter; else this.ref.Section.end.chapter = (parseInt(this.ref.Section.end.chapter) + 1).toString(); this.ref.Section.start.chapter = this.ref.Section.end.chapter; this.ref.Section.start.verse = '1'; this.ref.Section.end.verse = '*'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.data = data; this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } prev() { if (this.ref.Section.start.verse !== '1') this.ref.Section.start.chapter = this.ref.Section.start.chapter; else this.ref.Section.start.chapter = (parseInt(this.ref.Section.start.chapter) - 1).toString(); this.ref.Section.end.chapter = this.ref.Section.start.chapter; this.ref.Section.start.verse = '1'; this.ref.Section.end.verse = '*'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.data = data; this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } expand() { const last_verse_for_end = this.ref.Section.end.book.chapters[parseInt(this.ref.Section.end.chapter)]; // if your verse is at the beginning, to go the prev chapter and add 3 verses from that if (parseInt(this.ref.Section.start.verse) < 4) { this.ref.Section.start.chapter = (parseInt(this.ref.Section.start.chapter) - 1).toString(); this.ref.Section.start.verse = '*-' + (3 - parseInt(this.ref.Section.start.verse)); if (this.ref.Section.start.chapter === '0') { this.ref.Section.start.chapter = '1'; this.ref.Section.start.verse = '1'; } } else // or go back 3 verses this.ref.Section.start.verse = (parseInt(this.ref.Section.start.verse) - 3).toString(); // if your verse is at the end, go to the next chapter if (this.ref.Section.end.verse === '*' || parseInt(this.ref.Section.end.verse) + 3 > last_verse_for_end) { this.ref.Section.end.chapter = (parseInt(this.ref.Section.end.chapter) + 1).toString(); if (this.ref.Section.end.verse === '*') this.ref.Section.end.verse = '3'; else this.ref.Section.end.verse = (parseInt(this.ref.Section.end.verse) + 3 - last_verse_for_end).toString(); if (this.ref.Section.end.chapter === (this.ref.Section.end.book.last_chapter + 1).toString()) { this.ref.Section.end.chapter = this.ref.Section.end.book.last_chapter.toString(); this.ref.Section.end.verse = last_verse_for_end.toString(); } } else // or add 3 verses this.ref.Section.end.verse = (parseInt(this.ref.Section.end.verse) + 3).toString(); if (this.ref.Section.start.verse === '0') this.ref.Section.start.verse = '1'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.data = data; this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } openStrongs(strongs: string) { this.onItemClicked.emit({ card: this.cardItem, qry: this.cardItem.dict + strongs, from_search_bar: false }); } openMenu(strongs: string) { } isPunct(c: string) { return new RegExp('^[\.\,\;\:\?\!]$').test(c); } hasHeader(p: Paragraph) { if (p === undefined) return false; return p.h.length > 0; } isPara(vs: BibleVerse) { return this.getRefKey(vs) in BibleService.paragraphs; } getRefKey(vs: BibleVerse) { return this.ref.Section.start.book.book_number + ';' + this.ref.Section.start.chapter + ';' + vs.v; } getParas(ch: BiblePassage) { // group the verses into paragraphs. // create an initial paragraph to hold verses that might come before a paragraph. let para: BiblePara = { p: { h: '', p: 0 }, vss: [] }; let paras: BiblePara[] = []; // if you aren't showing paragraphs, stick em all in the same paragraph. if (!this.profileService.profile().show_paragraphs) { para.vss = ch.vss; paras.push(para); return paras; } // for each verse in the chapter, break them into paragraphs. for (let v of ch.vss) { if (this.isPara(v)) { paras.push(para); para = { p: BibleService.paragraphs[this.getRefKey(v)], vss: [v] }; if (para.p === undefined) para.p = { h: '', p: 0 }; // just in case you can't find a paragraph. } else { para.vss.push(v); } } // add the final paragraph if it has verses. if (para.vss.length > 0) paras.push(para); return paras; } } type BiblePara = { p: Paragraph, vss: BibleVerse[], }