Preserve layout in embedded Bible data

This commit is contained in:
2026-07-05 20:49:18 -05:00
parent dbc39480f7
commit 98253920ca
4 changed files with 276 additions and 64 deletions
+52 -13
View File
@@ -84,6 +84,22 @@ proc parseVerseLine(line: string): tuple[verse: int, text: string] =
result.verse = parseInt(rest[0 ..< numberEnd])
result.text = stripUsfmMarkup(rest[numberEnd + 1 .. ^1])
proc usfmBlock(line: string): tuple[matched: bool, segmentBreak: string, indent: int] =
if line.startsWith("\\p") or line.startsWith("\\m"):
return (true, "paragraph", 0)
if line.startsWith("\\q"):
var idx = 2
var digits = ""
while idx < line.len and line[idx].isDigit:
digits.add(line[idx])
inc idx
let indent =
if digits.len > 0: parseInt(digits)
else: 1
return (true, "line", indent)
proc findCanonFiles(inputDir: string): Table[string, string] =
for path in walkFiles(inputDir / "*eng-kjv.usfm"):
let name = path.extractFilename
@@ -104,35 +120,58 @@ proc generate(inputDir, outputPath: string) =
var chapter = 0
var verse = 0
var verseText = ""
var segment = 0
var segmentText = ""
var segmentBreak = "line"
var indent = 0
proc flushVerse() =
proc flushSegment() =
if chapter > 0 and verse > 0:
let text = normalizeWhitespace(verseText).replace("\t", " ")
let text = normalizeWhitespace(segmentText).replace("\t", " ")
if text.len > 0:
rows.add([code, $chapter, $verse, text].join("\t"))
verse = 0
verseText = ""
rows.add([
code,
$chapter,
$verse,
$segment,
segmentBreak,
$indent,
text
].join("\t"))
inc segment
segmentBreak = "same"
segmentText = ""
proc startBlock(nextBreak: string, nextIndent: int) =
flushSegment()
segmentBreak = nextBreak
indent = nextIndent
for rawLine in canonFiles[code].lines:
let line = rawLine.strip
if line.startsWith("\\c "):
flushVerse()
flushSegment()
chapter = parseInt(line[3..^1].strip)
verse = 0
elif line.startsWith("\\v "):
flushVerse()
flushSegment()
let parsed = parseVerseLine(line)
verse = parsed.verse
verseText = parsed.text
segment = 0
segmentText = parsed.text
elif verse > 0:
let block = usfmBlock(line)
if block.matched:
startBlock(block.segmentBreak, block.indent)
let continued = stripUsfmMarkup(line)
if continued.len > 0:
if verseText.len > 0:
verseText.add(' ')
verseText.add(continued)
if segmentText.len > 0:
segmentText.add(' ')
segmentText.add(continued)
flushVerse()
flushSegment()
createDir(outputPath.parentDir)
writeFile(outputPath, rows.join("\n") & "\n")