UNPKG

@jager-ai/holy-bible-api

Version:

성경 구절 검색 및 슬래시 명령어 지원 API 모듈

197 lines (196 loc) 7.25 kB
"use strict"; 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;