Render embedded Bible paragraphs inline
This commit is contained in:
+55
-13
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user