Render embedded Bible paragraphs inline

This commit is contained in:
2026-07-05 20:55:43 -05:00
parent 98253920ca
commit 6972a4e531
2 changed files with 78 additions and 13 deletions
+55 -13
View File
@@ -30,6 +30,17 @@ proc verseKey(code: string, chapter, verse: int): string =
proc chapterKey(code: string, chapter: int): string =
code & "\t" & $chapter
proc legacySegment(text: string): tuple[breakKind: SegmentBreak, text: string] =
const pilcrow = "\xC2\xB6"
let stripped = text.strip(leading = true, trailing = false)
if stripped.startsWith(pilcrow):
result.breakKind = sbParagraph
result.text = stripped[pilcrow.len .. ^1].strip(leading = true, trailing = false)
else:
result.breakKind = sbSame
result.text = text
proc parseSegmentBreak(s: string): SegmentBreak =
case s
of "same": sbSame
@@ -64,14 +75,15 @@ proc loadBibleIndex(rows, translationName: string): BibleIndex =
"invalid embedded " & translationName & " row: " & line)
if parts.len == 4:
let legacy = legacySegment(parts[3])
result.addSegment(BibleSegment(
code: parts[0],
chapter: parseInt(parts[1]),
verse: parseInt(parts[2]),
segment: 0,
breakKind: sbLine,
breakKind: legacy.breakKind,
indent: 0,
text: parts[3]))
text: legacy.text))
else:
result.addSegment(BibleSegment(
code: parts[0],
@@ -151,9 +163,41 @@ proc addFormattedSegment(
lines[^1].add(" ")
lines[^1].add(content)
else:
if segment.breakKind == sbParagraph and hasPassageLine:
lines.add("")
lines.add(prefix & content)
let isMarkerlessParagraphContinuation =
segment.breakKind == sbParagraph and marker.len == 0 and hasPassageLine
if isMarkerlessParagraphContinuation:
if lines[^1].len > 0 and not lines[^1][^1].isSpaceAscii:
lines[^1].add(" ")
lines[^1].add(content)
else:
if segment.breakKind == sbParagraph and hasPassageLine:
lines.add("")
lines.add(prefix & content)
proc normalizeFirstSelectedSegment(segment: BibleSegment): BibleSegment =
result = segment
if result.breakKind == sbSame:
result.breakKind = sbLine
elif result.breakKind == sbParagraph and result.segment == 0:
result.breakKind = sbLine
proc addAllSegments(lines: var seq[string], index: BibleIndex, code: string) =
var emittedVerses: Table[string, bool]
var firstSelected = true
discard index.requireLastChapter(code)
for segment in index.segments:
if segment.code == code:
var adjusted = segment
if firstSelected:
adjusted = normalizeFirstSelectedSegment(adjusted)
lines.addFormattedSegment(adjusted, emittedVerses)
firstSelected = false
proc addRangeSeparator(lines: var seq[string]) =
if lines.len > 1 and lines[^1].len > 0:
lines.add("")
proc addVerseLines(
lines: var seq[string],
@@ -170,8 +214,8 @@ proc addVerseLines(
if segment.code == code and
selected.hasKey(verseKey(segment.code, segment.chapter, segment.verse)):
var adjusted = segment
if firstSelected and adjusted.breakKind == sbSame:
adjusted.breakKind = sbLine
if firstSelected:
adjusted = normalizeFirstSelectedSegment(adjusted)
lines.addFormattedSegment(adjusted, emittedVerses)
firstSelected = false
@@ -180,13 +224,11 @@ proc fetchReference(index: BibleIndex, reference: PassageReference): string =
let code = reference.book.code
if reference.ranges.len == 0:
var emittedVerses: Table[string, bool]
discard index.requireLastChapter(code)
for segment in index.segments:
if segment.code == code:
lines.addFormattedSegment(segment, emittedVerses)
lines.addAllSegments(index, code)
else:
for range in reference.ranges:
for idx, range in reference.ranges:
if idx > 0:
lines.addRangeSeparator()
lines.addVerseLines(index, reference, range)
lines.join("\n")