Fixed search
This commit is contained in:
+6
-4
@@ -1,8 +1,7 @@
|
|||||||
import { useCallback, useEffect, useState } from 'react'
|
import { useCallback, useEffect, useState } from 'react'
|
||||||
import { Link } from 'react-router-dom'
|
import { Link } from 'react-router-dom'
|
||||||
import CandleCanvas from './Candle'
|
import CandleCanvas from './Candle'
|
||||||
import { type Verse } from './bible'
|
import { daySeed, loadKJV, msUntilRollover, pickForDay, type DailyVerse } from './verse'
|
||||||
import { daySeed, loadKJV, msUntilRollover, pickForDay } from './verse'
|
|
||||||
|
|
||||||
type Phase = 'sealed' | 'revealing' | 'revealed'
|
type Phase = 'sealed' | 'revealing' | 'revealed'
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ function formatCountdown(ms: number): string {
|
|||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const [phase, setPhase] = useState<Phase>('sealed')
|
const [phase, setPhase] = useState<Phase>('sealed')
|
||||||
const [verse, setVerse] = useState<Verse | null>(null)
|
const [verse, setVerse] = useState<DailyVerse | null>(null)
|
||||||
const [countdown, setCountdown] = useState('')
|
const [countdown, setCountdown] = useState('')
|
||||||
const [error, setError] = useState(false)
|
const [error, setError] = useState(false)
|
||||||
|
|
||||||
@@ -92,7 +91,10 @@ export default function Home() {
|
|||||||
<div className="verse">
|
<div className="verse">
|
||||||
<p className="verse-text">{verse.text}</p>
|
<p className="verse-text">{verse.text}</p>
|
||||||
<p className="verse-ref">
|
<p className="verse-ref">
|
||||||
— <Link to={`/read/${verse.reference.split(' ')[0]}/1`}>{verse.reference}</Link>
|
—{' '}
|
||||||
|
<Link to={`/read/${encodeURIComponent(verse.book)}/${verse.chapter}#v${verse.verse}`}>
|
||||||
|
{verse.reference}
|
||||||
|
</Link>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
+10
-2
@@ -39,6 +39,7 @@ interface IndexEntry {
|
|||||||
verse: number
|
verse: number
|
||||||
text: string
|
text: string
|
||||||
lower: string
|
lower: string
|
||||||
|
refLower: string
|
||||||
}
|
}
|
||||||
|
|
||||||
let loaded = false
|
let loaded = false
|
||||||
@@ -61,7 +62,14 @@ export function loadBible(): Promise<void> {
|
|||||||
for (const ch of b.chapters) {
|
for (const ch of b.chapters) {
|
||||||
const cn = Number(ch.chapter)
|
const cn = Number(ch.chapter)
|
||||||
for (const v of ch.verses) {
|
for (const v of ch.verses) {
|
||||||
index.push({ book: b.book, chapter: cn, verse: v.verse, text: v.text, lower: v.text.toLowerCase() })
|
index.push({
|
||||||
|
book: b.book,
|
||||||
|
chapter: cn,
|
||||||
|
verse: v.verse,
|
||||||
|
text: v.text,
|
||||||
|
lower: v.text.toLowerCase(),
|
||||||
|
refLower: `${displayName(b.book)} ${cn}:${v.verse}`.toLowerCase(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,7 +107,7 @@ export function searchBible(query: string, limit = 60): SearchOutcome {
|
|||||||
const results: SearchResult[] = []
|
const results: SearchResult[] = []
|
||||||
let total = 0
|
let total = 0
|
||||||
for (const e of index) {
|
for (const e of index) {
|
||||||
if (e.lower.includes(q)) {
|
if (e.lower.includes(q) || e.refLower.includes(q)) {
|
||||||
total++
|
total++
|
||||||
if (results.length < limit) {
|
if (results.length < limit) {
|
||||||
results.push({ text: e.text, reference: `${displayName(e.book)} ${e.chapter}:${e.verse}`, book: e.book, chapter: e.chapter, verse: e.verse })
|
results.push({ text: e.text, reference: `${displayName(e.book)} ${e.chapter}:${e.verse}`, book: e.book, chapter: e.chapter, verse: e.verse })
|
||||||
|
|||||||
+10
-4
@@ -2,7 +2,13 @@ import { getBooks, loadBible, type Verse } from './bible'
|
|||||||
|
|
||||||
const ROLLOVER_LOCAL_HOUR = 2
|
const ROLLOVER_LOCAL_HOUR = 2
|
||||||
|
|
||||||
let flatNT: Verse[] | null = null
|
export interface DailyVerse extends Verse {
|
||||||
|
book: string
|
||||||
|
chapter: number
|
||||||
|
verse: number
|
||||||
|
}
|
||||||
|
|
||||||
|
let flatNT: DailyVerse[] | null = null
|
||||||
|
|
||||||
export function daySeed(now: Date = new Date()): number {
|
export function daySeed(now: Date = new Date()): number {
|
||||||
const shifted = new Date(now.getTime() - ROLLOVER_LOCAL_HOUR * 3600_000)
|
const shifted = new Date(now.getTime() - ROLLOVER_LOCAL_HOUR * 3600_000)
|
||||||
@@ -26,13 +32,13 @@ function mulberry32(seed: number): () => number {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function pickForDay(verses: Verse[], seed: number): Verse {
|
export function pickForDay(verses: DailyVerse[], seed: number): DailyVerse {
|
||||||
const rand = mulberry32(seed)
|
const rand = mulberry32(seed)
|
||||||
const index = Math.floor(rand() * verses.length)
|
const index = Math.floor(rand() * verses.length)
|
||||||
return verses[index]
|
return verses[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function loadKJV(): Promise<Verse[]> {
|
export async function loadKJV(): Promise<DailyVerse[]> {
|
||||||
if (flatNT) return flatNT
|
if (flatNT) return flatNT
|
||||||
await loadBible()
|
await loadBible()
|
||||||
flatNT = []
|
flatNT = []
|
||||||
@@ -44,7 +50,7 @@ export async function loadKJV(): Promise<Verse[]> {
|
|||||||
for (const chapter of book.chapters) {
|
for (const chapter of book.chapters) {
|
||||||
const chapterNumber = Number(chapter.chapter)
|
const chapterNumber = Number(chapter.chapter)
|
||||||
for (const v of chapter.verses) {
|
for (const v of chapter.verses) {
|
||||||
flatNT.push({ text: v.text, reference: `${name} ${chapterNumber}:${v.verse}` })
|
flatNT.push({ text: v.text, reference: `${name} ${chapterNumber}:${v.verse}`, book: book.book, chapter: chapterNumber, verse: v.verse })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user