@mvp-factory/holy-bible-api
Version:
성경 구절 검색 및 슬래시 명령어 지원 API 모듈
197 lines (196 loc) • 7.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BibleVerseEngine = void 0;
const BibleStructure_1 = require("../data/BibleStructure");
const BibleVerses_1 = require("../data/BibleVerses");
class BibleVerseEngine {
constructor() {
this.cache = {};
this.initializeKeyVerses();
}
static getInstance() {
if (!BibleVerseEngine.instance) {
BibleVerseEngine.instance = new BibleVerseEngine();
}
return BibleVerseEngine.instance;
}
setApiEndpoint(endpoint) {
this.apiEndpoint = endpoint;
}
setFullVerseDatabase(database) {
this.fullVerseDatabase = database;
}
initializeKeyVerses() {
Object.entries(BibleVerses_1.KEY_BIBLE_VERSES).forEach(([reference, text]) => {
try {
const verse = (0, BibleVerses_1.createBibleVerse)(reference, text);
this.cache[reference] = verse;
}
catch (error) {
console.warn(`Failed to parse verse: ${reference}`, error);
}
});
}
parseReference(reference) {
const normalized = (0, BibleStructure_1.normalizeBibleReference)(reference);
const match = normalized.match(/^(.+?)\s+(\d+):(\d+)(?:-(\d+))?$/);
if (!match) {
return null;
}
const [, book, chapter, verseStart, verseEnd] = match;
const bookInfo = (0, BibleStructure_1.getBibleBook)(book);
if (!bookInfo) {
return null;
}
return {
book: bookInfo.name,
chapter: parseInt(chapter, 10),
verseStart: parseInt(verseStart, 10),
verseEnd: verseEnd ? parseInt(verseEnd, 10) : undefined
};
}
async searchVerses(query, options = {}) {
try {
const parsed = this.parseReference(query);
if (!parsed) {
return {
success: false,
error: '잘못된 성경구절 형식입니다. 예: 롬 1:1, 시 23:1-6',
suggestions: [
'정확한 형식으로 입력해보세요 (예: 롬 1:1)',
'책명 약어를 확인해보세요 (창, 출, 레, 민, 신...)',
'장과 절 번호를 정확히 입력해보세요'
]
};
}
const verses = [];
const { book, chapter, verseStart, verseEnd } = parsed;
const endVerse = verseEnd || verseStart;
const maxVerses = options.maxVerses || 20;
const actualEndVerse = Math.min(endVerse, verseStart + maxVerses - 1);
for (let verse = verseStart; verse <= actualEndVerse; verse++) {
const reference = `${book} ${chapter}:${verse}`;
if (this.cache[reference]) {
verses.push(this.cache[reference]);
continue;
}
if (this.fullVerseDatabase && this.fullVerseDatabase[reference]) {
const verseData = this.fullVerseDatabase[reference];
verses.push(verseData);
this.cache[reference] = verseData;
continue;
}
}
if (verses.length === 0) {
return {
success: false,
error: '해당 성경구절을 찾을 수 없습니다.',
query,
suggestions: [
'다른 구절을 시도해보세요. 예: 창 1:1, 시 23:1, 요 3:16, 롬 8:28'
]
};
}
return {
success: true,
query,
result_count: verses.length,
verses
};
}
catch (error) {
return {
success: false,
error: '성경구절 검색 중 오류가 발생했습니다.',
query
};
}
}
detectSlashCommands(text) {
const matches = [];
const pattern = /\/([가-힣]+\d+:\d+(?:-\d+)?)/g;
let match;
while ((match = pattern.exec(text)) !== null) {
matches.push({
match: match[0],
reference: match[1],
startIndex: match.index,
endIndex: match.index + match[0].length
});
}
return matches;
}
formatVerse(verse, includeHeading = true) {
let formatted = '';
if (includeHeading && verse.heading) {
formatted += `[${verse.heading}]\n`;
}
formatted += verse.text;
formatted += `\n- ${verse.reference}`;
return formatted;
}
formatVerses(verses, includeHeading = true) {
if (verses.length === 0) {
return '';
}
if (verses.length === 1) {
return this.formatVerse(verses[0], includeHeading);
}
let formatted = '';
let currentHeading = '';
verses.forEach((verse, index) => {
if (includeHeading && verse.heading && verse.heading !== currentHeading) {
if (index > 0)
formatted += '\n';
formatted += `[${verse.heading}]\n`;
currentHeading = verse.heading;
}
formatted += `${verse.verse}. ${verse.text}`;
if (index < verses.length - 1) {
formatted += '\n';
}
});
if (verses.length > 1) {
const firstVerse = verses[0];
const lastVerse = verses[verses.length - 1];
formatted += `\n- ${firstVerse.book_full} ${firstVerse.chapter}:${firstVerse.verse}-${lastVerse.verse}`;
}
else {
formatted += `\n- ${verses[0].reference}`;
}
return formatted;
}
async processSlashCommands(text, options = {}) {
const commands = this.detectSlashCommands(text);
if (commands.length === 0) {
return text;
}
const sortedCommands = [...commands].sort((a, b) => b.startIndex - a.startIndex);
let processedText = text;
for (const command of sortedCommands) {
const response = await this.searchVerses(command.reference, options);
if (response.success && response.verses && response.verses.length > 0) {
const formatted = this.formatVerses(response.verses, options.includeHeadings);
processedText =
processedText.substring(0, command.startIndex) +
formatted +
processedText.substring(command.endIndex);
}
}
return processedText;
}
getAvailableBooks() {
return Object.keys(BibleStructure_1.BIBLE_ABBREVIATIONS);
}
isValidReference(reference) {
return this.parseReference(reference) !== null;
}
clearCache() {
this.cache = {};
this.initializeKeyVerses();
}
getCacheSize() {
return Object.keys(this.cache).length;
}
}
exports.BibleVerseEngine = BibleVerseEngine;