@bible-api/bible-api
Version:
A simple API for the Bible
143 lines • 5.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/** A Bible version. */
class BibleVersion {
/** Synonyms for the version. */
synonyms;
/** The year the version was published. */
year;
/** The short name of the version. */
shortName;
/** The long name of the version. */
longName;
/** The books in the version. */
booksData;
/**
* Creates a new Bible version.
*
* @param options The options for creating the Bible version.
*/
constructor(options) {
this.synonyms = options.synonyms;
this.year = options.year;
this.shortName = options.shortName;
this.longName = options.longName;
this.booksData = options.booksData;
}
/**
* Gets a verse from the Bible.
*
* @param bookId The ID of the book.
* @param chapterNumber The number of the chapter.
* @param verseNumber The number of the verse.
* @returns The verse.
* @throws If the book, chapter, or verse is not found.
*/
getVerse(options) {
const { bookId, chapterNumber, verseNumber } = options;
const book = this.booksData[bookId];
if (!book) {
throw new Error(`Book not found: ${bookId}`);
}
const chapterData = book.chaptersData[chapterNumber];
if (!chapterData) {
throw new Error(`Chapter not found: ${bookId} ${chapterNumber}`);
}
const verseData = chapterData[verseNumber];
if (!verseData) {
throw new Error(`Verse not found: ${bookId} ${chapterNumber}:${verseNumber}`);
}
return {
bookId,
chapterNumber,
verseNumber,
name: `${book.name} ${chapterNumber}:${verseNumber} (${this.shortName})`,
html: ('<span class="bible__verse">' +
`<span class="bible__verse-number">${verseNumber}</span>` +
verseData
.replace(/\*\*(?<jesus>.+)\*\*/g, '<span class="bible__jesus">$<jesus></span>')
.replace(/\*(?<italic>.+)\*/g, '<i>$<italic></i>')
.replace(/`(?<note>.+)`/g, '<span class="bible__note">$<note></span>') +
'</span>'),
markdown: verseData,
text: verseData
.replace(/\*\*(?<jesus>.+)\*\*/g, '$<jesus>')
.replace(/\*(?<italic>.+)\*/g, '[$<italic>]')
.replace(/`(?<note>.+)`/g, '($<note>)')
};
}
/**
* Gets a passage from the Bible.
*
* @param options The options for getting the passage.
* @returns The passage.
* @throws If the book, a chapter, or a verse is not found.
*/
getPassage(options) {
const { bookId, start, end } = options;
const book = this.booksData[bookId];
if (!book) {
throw new Error(`Book not found: ${bookId}`);
}
if (start.chapterNumber > end.chapterNumber) {
throw new Error(`The first chapter cannot be after last chapter`);
}
if (start.chapterNumber === end.chapterNumber &&
start.verseNumber > end.verseNumber) {
throw new Error(`The first verse cannot be after last verse`);
}
const endChapter = book.chaptersData[end.chapterNumber];
if (!endChapter) {
throw new Error(`Chapter not found: ${bookId} ${end.chapterNumber}`);
}
const endVerseNumber = Math.min(end.verseNumber, endChapter.length - 1);
const verses = [];
for (let chapterNumber = start.chapterNumber; chapterNumber <= end.chapterNumber; chapterNumber++) {
const chapterData = book.chaptersData[chapterNumber];
if (!chapterData) {
throw new Error(`Chapter not found: ${bookId} ${chapterNumber}`);
}
for (let verseNumber = chapterNumber === start.chapterNumber ? start.verseNumber : 1; verseNumber <=
(chapterNumber === end.chapterNumber
? endVerseNumber
: chapterData.length - 1); verseNumber++) {
verses.push(this.getVerse({ bookId, chapterNumber, verseNumber }));
}
}
let name = `${book.name} ${start.chapterNumber}`;
if (start.chapterNumber !== end.chapterNumber) {
if (start.verseNumber === 1) {
name += `\u2013${end.chapterNumber}`;
if (endVerseNumber !== endChapter.length - 1) {
name += `:${endVerseNumber}`;
}
}
else {
name += `:${start.verseNumber}\u2013${end.chapterNumber}:${endVerseNumber}`;
}
}
else if (start.verseNumber === end.verseNumber) {
name += `:${start.verseNumber}`;
}
else if (start.verseNumber !== 1 ||
endVerseNumber !== endChapter.length - 1) {
name += `:${start.verseNumber}\u2013${endVerseNumber}`;
}
name += ` (${this.shortName})`;
return {
bookId,
start: {
chapterNumber: start.chapterNumber,
verseNumber: start.verseNumber
},
end: {
chapterNumber: end.chapterNumber,
verseNumber: endVerseNumber
},
name: name,
verses
};
}
}
exports.default = BibleVersion;
//# sourceMappingURL=BibleVersion.js.map