From f5d9a21db7b8cd9d69757faf4165fdd77ed32969 Mon Sep 17 00:00:00 2001 From: Agent Benji Date: Mon, 23 Feb 2026 13:59:31 -0600 Subject: [PATCH 1/6] Handle headers in verse ranges --- .../Rendering/BibleVersionRendering.swift | 51 ++++- .../BibleVersionRenderingTests.swift | 198 ++++++++++++++++++ 2 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift diff --git a/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift b/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift index 7cbf368..c07a11f 100644 --- a/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift +++ b/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift @@ -357,18 +357,42 @@ public enum BibleVersionRendering { marginTop: &marginTop ) - for child in node.children { + for (index, child) in node.children.enumerated() { if child.type == .block || child.type == .table { if !stateUp.isTextEmpty { if stateUp.rendering { ret.append(createBlock(stateDown: stateDown, stateUp: &stateUp, marginTop: marginTop)) } stateUp.clearText() - } - if child.type == .block { - handleNodeBlock(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) - } else if child.type == .table { - handleNodeTable(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) + } else { + let isHeader = child.classes.contains("yv-h") || child.classes.contains("yvh") + let savedRendering = stateUp.rendering + + if isHeader && stateIn.renderHeadlines { + let nextVerse = node.children + .dropFirst(index + 1) + .compactMap { firstVerseInNode($0) } + .first + let isNextVerseInRange = nextVerse != nil + && nextVerse! >= stateIn.fromVerse + && nextVerse! <= stateIn.toVerse + + if !stateUp.rendering && isNextVerseInRange { + stateUp.rendering = true + } else if stateUp.rendering && nextVerse != nil && !isNextVerseInRange { + stateUp.rendering = false + } + } + + if child.type == .block { + handleNodeBlock(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) + } else if child.type == .table { + handleNodeTable(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) + } + + if isHeader { + stateUp.rendering = savedRendering + } } } else { if child.type == .span && child.classes.contains("qs") { // Selah. Force a line break and right-alignment. @@ -583,6 +607,21 @@ public enum BibleVersionRendering { return localCopy } + /// Finds the first verse number in a node's subtree by searching for verse-labeled spans. + private static func firstVerseInNode(_ node: BibleTextNode) -> Int? { + if node.classes.contains("yv-v") || node.classes.contains("verse") { + if let v = node.attributes["v"], let vi = Int(v) { + return vi + } + } + for child in node.children { + if let found = firstVerseInNode(child) { + return found + } + } + return nil + } + private static func assertionFailed( _ message: String, string: String? = nil, diff --git a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift new file mode 100644 index 0000000..d40bb61 --- /dev/null +++ b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift @@ -0,0 +1,198 @@ +import SwiftUI +import Testing +@testable import YouVersionPlatformCore +@testable import YouVersionPlatformUI + +@MainActor +@Suite struct BibleVersionRenderingTests { + private let fonts = BibleTextFonts(familyName: "Times New Roman", baseSize: 16) + + private func renderBlocks( + html: String, + reference: BibleReference, + renderHeadlines: Bool = true + ) async throws -> [BibleTextBlock] { + let cache = ChapterDiskCache() + let chapterReference = BibleReference( + versionId: reference.versionId, + bookUSFM: reference.bookUSFM, + chapter: reference.chapter + ) + await cache.removeVersion(versionId: reference.versionId) + await cache.addChapterContent(html, reference: chapterReference) + + let blocks = try await BibleVersionRendering.textBlocks( + reference, + renderHeadlines: renderHeadlines, + renderVerseNumbers: true, + footnotesMode: .none, + textColor: .black, + wocColor: .red, + fonts: fonts + ) + + let result = try #require(blocks) + await cache.removeVersion(versionId: reference.versionId) + return result + } + + private func hasHeaderContaining(_ blocks: [BibleTextBlock], text: String) -> Bool { + blocks.contains { block in + let runs = block.text.asAttributedString.runs[\.bibleTextCategory] + let hasHeader = runs.contains { $0.0 == .header } + return hasHeader && block.text.characters.contains(text) + } + } + + private func hasScriptureContaining(_ blocks: [BibleTextBlock], text: String) -> Bool { + blocks.contains { block in + block.text.characters.contains(text) + } + } + + @Test func testHeaderBeforeFirstVerseInRangeIsRendered() async throws { + let html = """ +
+
The List
+
+ + 5 + Fifth verse text. +
+
+ + 6 + Sixth verse text. +
+
+ """ + + let reference = BibleReference( + versionId: 111, + bookUSFM: "GEN", + chapter: 1, + verseStart: 5, + verseEnd: 10 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasHeaderContaining(blocks, text: "The List")) + #expect(hasScriptureContaining(blocks, text: "Fifth verse text.")) + } + + @Test func testHeaderInMiddleOfLastVerseInRangeIsRendered() async throws { + let html = """ +
+
+ + 5 + Part one of verse five. +
+
Mid-Verse Header
+
+ Part two of verse five. +
+
+ """ + + let reference = BibleReference( + versionId: 112, + bookUSFM: "GEN", + chapter: 1, + verseStart: 1, + verseEnd: 5 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasHeaderContaining(blocks, text: "Mid-Verse Header")) + #expect(hasScriptureContaining(blocks, text: "Part one of verse five.")) + #expect(hasScriptureContaining(blocks, text: "Part two of verse five.")) + } + + @Test func testHeaderAfterLastVerseInRangeIsNotRendered() async throws { + let html = """ +
+
+ + 5 + Fifth verse text. +
+
Next Section
+
+ + 6 + Sixth verse text. +
+
+ """ + + let reference = BibleReference( + versionId: 113, + bookUSFM: "GEN", + chapter: 1, + verseStart: 1, + verseEnd: 5 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasScriptureContaining(blocks, text: "Fifth verse text.")) + #expect(!hasHeaderContaining(blocks, text: "Next Section")) + #expect(!hasScriptureContaining(blocks, text: "Sixth verse text.")) + } + + @Test func testHeaderBeforeOutOfRangeVerseIsNotRendered() async throws { + let html = """ +
+
Early Section
+
+ + 3 + Third verse text. +
+
+ + 5 + Fifth verse text. +
+
+ """ + + let reference = BibleReference( + versionId: 114, + bookUSFM: "GEN", + chapter: 1, + verseStart: 5, + verseEnd: 10 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(!hasHeaderContaining(blocks, text: "Early Section")) + #expect(!hasScriptureContaining(blocks, text: "Third verse text.")) + #expect(hasScriptureContaining(blocks, text: "Fifth verse text.")) + } + + @Test func testHeaderIsNotRenderedWhenRenderHeadlinesIsFalse() async throws { + let html = """ +
+
Visible Header
+
+ + 1 + First verse text. +
+
+ """ + + let reference = BibleReference( + versionId: 115, + bookUSFM: "GEN", + chapter: 1, + verseStart: 1, + verseEnd: 5 + ) + + let blocks = try await renderBlocks(html: html, reference: reference, renderHeadlines: false) + #expect(!hasHeaderContaining(blocks, text: "Visible Header")) + #expect(hasScriptureContaining(blocks, text: "First verse text.")) + } +} From 5a873166cef3fb92d4688a1c4b4163cd0f0a8520 Mon Sep 17 00:00:00 2001 From: David Fedor Date: Mon, 23 Feb 2026 16:41:55 -0600 Subject: [PATCH 2/6] fix: skip headings at the end of a requested passage, e.g. for BibleWidgetView use. NEEDS MORE TESTING. --- Examples/SampleApp/WidgetView.swift | 38 +++++-- README.md | 6 ++ .../Rendering/BibleVersionRendering.swift | 55 ++++++----- .../BibleVersionRenderingTests.swift | 99 +++++++++++++++++++ 4 files changed, 165 insertions(+), 33 deletions(-) diff --git a/Examples/SampleApp/WidgetView.swift b/Examples/SampleApp/WidgetView.swift index bdf053f..9673624 100644 --- a/Examples/SampleApp/WidgetView.swift +++ b/Examples/SampleApp/WidgetView.swift @@ -3,12 +3,38 @@ import YouVersionPlatform struct WidgetView: View { var body: some View { - BibleWidgetView( - reference: BibleReference( - versionId: 3034, bookUSFM: "2CO", chapter: 1, verseStart: 3, verseEnd: 4 - ), - fontSize: 18 - ) + ScrollView { + BibleWidgetView( + reference: BibleReference( + versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 1, verseEnd: 3 + ), + fontSize: 18 + ) + BibleWidgetView( + reference: BibleReference( + versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 1, verseEnd: 4 + ), + fontSize: 18 + ) + BibleWidgetView( + reference: BibleReference( + versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 3, verseEnd: 4 + ), + fontSize: 18 + ) + BibleWidgetView( + reference: BibleReference( + versionId: 111, bookUSFM: "MAT", chapter: 5, verseStart: 1, verseEnd: 1 + ), + fontSize: 18 + ) + BibleWidgetView( + reference: BibleReference( + versionId: 111, bookUSFM: "MAT", chapter: 5, verseStart: 1, verseEnd: 2 + ), + fontSize: 18 + ) + } } } diff --git a/README.md b/README.md index ef50c74..8aa3dad 100644 --- a/README.md +++ b/README.md @@ -260,6 +260,12 @@ Building AI applications with Bible content? Access YouVersion's LLM-optimized e We welcome contributions! Please see our [Contributing Guide](./CONTRIBUTING.md) for details on development setup, code style, and the pull request process. +## Bible Rendering Tests + +Run focused tests: `swift test --filter BibleVersionRenderingTests` + +Note: this suite currently seeds `ChapterDiskCache` as a test harness. Once `BibleVersionRendering.textBlocks` accepts raw HTML directly, migrate tests to inject HTML without disk cache writes. + ## Support - **Issues**: [GitHub Issues](https://github.com/youversion/platform-sdk-swift/issues) diff --git a/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift b/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift index c07a11f..139ab6b 100644 --- a/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift +++ b/Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift @@ -359,40 +359,41 @@ public enum BibleVersionRendering { for (index, child) in node.children.enumerated() { if child.type == .block || child.type == .table { - if !stateUp.isTextEmpty { + let hadPendingText = !stateUp.isTextEmpty + if hadPendingText { if stateUp.rendering { ret.append(createBlock(stateDown: stateDown, stateUp: &stateUp, marginTop: marginTop)) } stateUp.clearText() - } else { - let isHeader = child.classes.contains("yv-h") || child.classes.contains("yvh") - let savedRendering = stateUp.rendering - - if isHeader && stateIn.renderHeadlines { - let nextVerse = node.children - .dropFirst(index + 1) - .compactMap { firstVerseInNode($0) } - .first - let isNextVerseInRange = nextVerse != nil - && nextVerse! >= stateIn.fromVerse - && nextVerse! <= stateIn.toVerse - - if !stateUp.rendering && isNextVerseInRange { - stateUp.rendering = true - } else if stateUp.rendering && nextVerse != nil && !isNextVerseInRange { - stateUp.rendering = false - } + } + let isHeader = child.classes.contains("yv-h") || child.classes.contains("yvh") + let savedRendering = stateUp.rendering + + if isHeader && stateIn.renderHeadlines { + let followingChildren = node.children.dropFirst(index + 1) + let nextVerse = followingChildren + .compactMap { firstVerseInNode($0) } + .first + let immediateNextVerse = followingChildren.first.flatMap { firstVerseInNode($0) } + let isNextVerseInRange = nextVerse != nil + && nextVerse! >= stateIn.fromVerse + && nextVerse! <= stateIn.toVerse + + if !stateUp.rendering && isNextVerseInRange { + stateUp.rendering = true + } else if stateUp.rendering && nextVerse != nil && !isNextVerseInRange && !hadPendingText && immediateNextVerse != nil { + stateUp.rendering = false } + } - if child.type == .block { - handleNodeBlock(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) - } else if child.type == .table { - handleNodeTable(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) - } + if child.type == .block { + handleNodeBlock(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) + } else if child.type == .table { + handleNodeTable(node: child, stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp, ret: &ret) + } - if isHeader { - stateUp.rendering = savedRendering - } + if isHeader { + stateUp.rendering = savedRendering } } else { if child.type == .span && child.classes.contains("qs") { // Selah. Force a line break and right-alignment. diff --git a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift index d40bb61..bf69af4 100644 --- a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift +++ b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift @@ -7,6 +7,13 @@ import Testing @Suite struct BibleVersionRenderingTests { private let fonts = BibleTextFonts(familyName: "Times New Roman", baseSize: 16) + /// Temporary regression-eval harness: + /// Tests seed ChapterDiskCache and then call `BibleVersionRendering.textBlocks`. + /// + /// Cleanup after `textBlocks` can accept raw HTML directly: + /// 1. Replace cache seeding with direct HTML injection into renderer. + /// 2. Remove synthetic per-test version IDs used to avoid cache collisions. + /// 3. Remove explicit cache cleanup (`removeVersion`) calls in this suite. private func renderBlocks( html: String, reference: BibleReference, @@ -109,6 +116,65 @@ import Testing #expect(hasScriptureContaining(blocks, text: "Part two of verse five.")) } + @Test func testHeaderEmbeddedWithinVerseAfterInlineTextIsRendered() async throws { + let html = """ +
+
+ + 2 + He said +
The Beatitudes
+ blessed are the poor in spirit. +
+
+ """ + + let reference = BibleReference( + versionId: 1112, + bookUSFM: "MAT", + chapter: 5, + verseStart: 2, + verseEnd: 2 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasHeaderContaining(blocks, text: "The Beatitudes")) + } + + @Test func testHeaderFollowingVerseTwoIsRenderedForRangeOneToTwo() async throws { + let html = """ +
+
Introduction to the Sermon on the Mount
+
+ 1 + When Jesus saw the crowds, He went up on the mountain and sat down. + 2 + and he began to teach them. +
+
The Beatitudes
+
He said:
+
+ 3 + Blessed are the poor in spirit. +
+
+ """ + + let reference = BibleReference( + versionId: 1113, + bookUSFM: "MAT", + chapter: 5, + verseStart: 1, + verseEnd: 2 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasHeaderContaining(blocks, text: "Introduction to the Sermon on the Mount")) + #expect(hasHeaderContaining(blocks, text: "The Beatitudes")) + #expect(hasScriptureContaining(blocks, text: "He said:")) + #expect(!hasScriptureContaining(blocks, text: "Blessed are the poor in spirit.")) + } + @Test func testHeaderAfterLastVerseInRangeIsNotRendered() async throws { let html = """
@@ -140,6 +206,39 @@ import Testing #expect(!hasScriptureContaining(blocks, text: "Sixth verse text.")) } + @Test func testGenesisTwoOneToThreeDoesNotIncludeEndHeader() async throws { + let html = """ +
+
+ 1 + Thus the heavens and the earth were completed in all their vast array. + 2 + By the seventh day God had finished the work He had been doing. + 3 + Then God blessed the seventh day and sanctified it. +
+
Man and Woman in the Garden
+
+ 4 + This is the account of the heavens and the earth when they were created. +
+
+ """ + + let reference = BibleReference( + versionId: 1114, + bookUSFM: "GEN", + chapter: 2, + verseStart: 1, + verseEnd: 3 + ) + + let blocks = try await renderBlocks(html: html, reference: reference) + #expect(hasScriptureContaining(blocks, text: "Thus the heavens and the earth were completed")) + #expect(!hasHeaderContaining(blocks, text: "Man and Woman in the Garden")) + #expect(!hasScriptureContaining(blocks, text: "This is the account of the heavens and the earth")) + } + @Test func testHeaderBeforeOutOfRangeVerseIsNotRendered() async throws { let html = """
From 96eef49c6c60bb5d6136149e1619fd4921608d79 Mon Sep 17 00:00:00 2001 From: David Fedor Date: Tue, 24 Feb 2026 10:42:14 -0600 Subject: [PATCH 3/6] fix param to textBlocks() --- .../YouVersionPlatformUITests/BibleVersionRenderingTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift index bf69af4..64667e4 100644 --- a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift +++ b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift @@ -29,7 +29,7 @@ import Testing await cache.addChapterContent(html, reference: chapterReference) let blocks = try await BibleVersionRendering.textBlocks( - reference, + reference: reference, renderHeadlines: renderHeadlines, renderVerseNumbers: true, footnotesMode: .none, From 131ed95af9fa547807fd6d7cc037558649e85843 Mon Sep 17 00:00:00 2001 From: David Fedor Date: Tue, 24 Feb 2026 13:11:46 -0600 Subject: [PATCH 4/6] tidy --- .../BibleVersionRenderingTests.swift | 86 +++---------------- 1 file changed, 12 insertions(+), 74 deletions(-) diff --git a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift index 64667e4..9d13e3f 100644 --- a/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift +++ b/Tests/YouVersionPlatformUITests/BibleVersionRenderingTests.swift @@ -5,30 +5,18 @@ import Testing @MainActor @Suite struct BibleVersionRenderingTests { + private let defaultVersionId = 1 private let fonts = BibleTextFonts(familyName: "Times New Roman", baseSize: 16) - /// Temporary regression-eval harness: - /// Tests seed ChapterDiskCache and then call `BibleVersionRendering.textBlocks`. - /// - /// Cleanup after `textBlocks` can accept raw HTML directly: - /// 1. Replace cache seeding with direct HTML injection into renderer. - /// 2. Remove synthetic per-test version IDs used to avoid cache collisions. - /// 3. Remove explicit cache cleanup (`removeVersion`) calls in this suite. private func renderBlocks( html: String, reference: BibleReference, renderHeadlines: Bool = true ) async throws -> [BibleTextBlock] { - let cache = ChapterDiskCache() - let chapterReference = BibleReference( - versionId: reference.versionId, - bookUSFM: reference.bookUSFM, - chapter: reference.chapter - ) - await cache.removeVersion(versionId: reference.versionId) - await cache.addChapterContent(html, reference: chapterReference) + let node = try #require(try BibleTextNode.parse(html)) let blocks = try await BibleVersionRendering.textBlocks( + from: node, reference: reference, renderHeadlines: renderHeadlines, renderVerseNumbers: true, @@ -38,9 +26,7 @@ import Testing fonts: fonts ) - let result = try #require(blocks) - await cache.removeVersion(versionId: reference.versionId) - return result + return try #require(blocks) } private func hasHeaderContaining(_ blocks: [BibleTextBlock], text: String) -> Bool { @@ -74,13 +60,7 @@ import Testing
""" - let reference = BibleReference( - versionId: 111, - bookUSFM: "GEN", - chapter: 1, - verseStart: 5, - verseEnd: 10 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 1, verseStart: 5, verseEnd: 10) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasHeaderContaining(blocks, text: "The List")) @@ -102,13 +82,7 @@ import Testing
""" - let reference = BibleReference( - versionId: 112, - bookUSFM: "GEN", - chapter: 1, - verseStart: 1, - verseEnd: 5 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 1, verseStart: 1, verseEnd: 5) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasHeaderContaining(blocks, text: "Mid-Verse Header")) @@ -129,13 +103,7 @@ import Testing """ - let reference = BibleReference( - versionId: 1112, - bookUSFM: "MAT", - chapter: 5, - verseStart: 2, - verseEnd: 2 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "MAT", chapter: 5, verseStart: 2, verseEnd: 2) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasHeaderContaining(blocks, text: "The Beatitudes")) @@ -160,13 +128,7 @@ import Testing """ - let reference = BibleReference( - versionId: 1113, - bookUSFM: "MAT", - chapter: 5, - verseStart: 1, - verseEnd: 2 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "MAT", chapter: 5, verseStart: 1, verseEnd: 2) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasHeaderContaining(blocks, text: "Introduction to the Sermon on the Mount")) @@ -192,13 +154,7 @@ import Testing """ - let reference = BibleReference( - versionId: 113, - bookUSFM: "GEN", - chapter: 1, - verseStart: 1, - verseEnd: 5 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 1, verseStart: 1, verseEnd: 5) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasScriptureContaining(blocks, text: "Fifth verse text.")) @@ -225,13 +181,7 @@ import Testing """ - let reference = BibleReference( - versionId: 1114, - bookUSFM: "GEN", - chapter: 2, - verseStart: 1, - verseEnd: 3 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 2, verseStart: 1, verseEnd: 3) let blocks = try await renderBlocks(html: html, reference: reference) #expect(hasScriptureContaining(blocks, text: "Thus the heavens and the earth were completed")) @@ -256,13 +206,7 @@ import Testing """ - let reference = BibleReference( - versionId: 114, - bookUSFM: "GEN", - chapter: 1, - verseStart: 5, - verseEnd: 10 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 1, verseStart: 5, verseEnd: 10) let blocks = try await renderBlocks(html: html, reference: reference) #expect(!hasHeaderContaining(blocks, text: "Early Section")) @@ -282,13 +226,7 @@ import Testing """ - let reference = BibleReference( - versionId: 115, - bookUSFM: "GEN", - chapter: 1, - verseStart: 1, - verseEnd: 5 - ) + let reference = BibleReference(versionId: defaultVersionId, bookUSFM: "GEN", chapter: 1, verseStart: 1, verseEnd: 5) let blocks = try await renderBlocks(html: html, reference: reference, renderHeadlines: false) #expect(!hasHeaderContaining(blocks, text: "Visible Header")) From 540e945b292ff8387dafa124b06d6fd5be469a9f Mon Sep 17 00:00:00 2001 From: David Fedor Date: Tue, 24 Feb 2026 14:11:57 -0600 Subject: [PATCH 5/6] undo the test additions --- Examples/SampleApp/WidgetView.swift | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/Examples/SampleApp/WidgetView.swift b/Examples/SampleApp/WidgetView.swift index 9673624..c58af8a 100644 --- a/Examples/SampleApp/WidgetView.swift +++ b/Examples/SampleApp/WidgetView.swift @@ -6,31 +6,7 @@ struct WidgetView: View { ScrollView { BibleWidgetView( reference: BibleReference( - versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 1, verseEnd: 3 - ), - fontSize: 18 - ) - BibleWidgetView( - reference: BibleReference( - versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 1, verseEnd: 4 - ), - fontSize: 18 - ) - BibleWidgetView( - reference: BibleReference( - versionId: 111, bookUSFM: "GEN", chapter: 2, verseStart: 3, verseEnd: 4 - ), - fontSize: 18 - ) - BibleWidgetView( - reference: BibleReference( - versionId: 111, bookUSFM: "MAT", chapter: 5, verseStart: 1, verseEnd: 1 - ), - fontSize: 18 - ) - BibleWidgetView( - reference: BibleReference( - versionId: 111, bookUSFM: "MAT", chapter: 5, verseStart: 1, verseEnd: 2 + versionId: 3034, bookUSFM: "2CO", chapter: 1, verseStart: 3, verseEnd: 4 ), fontSize: 18 ) From 23f40f6ba1ceb45f7b9640accf66e28ccd30e0e7 Mon Sep 17 00:00:00 2001 From: David Fedor Date: Tue, 24 Feb 2026 14:12:42 -0600 Subject: [PATCH 6/6] remove test scrollview --- Examples/SampleApp/WidgetView.swift | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Examples/SampleApp/WidgetView.swift b/Examples/SampleApp/WidgetView.swift index c58af8a..bdf053f 100644 --- a/Examples/SampleApp/WidgetView.swift +++ b/Examples/SampleApp/WidgetView.swift @@ -3,14 +3,12 @@ import YouVersionPlatform struct WidgetView: View { var body: some View { - ScrollView { - BibleWidgetView( - reference: BibleReference( - versionId: 3034, bookUSFM: "2CO", chapter: 1, verseStart: 3, verseEnd: 4 - ), - fontSize: 18 - ) - } + BibleWidgetView( + reference: BibleReference( + versionId: 3034, bookUSFM: "2CO", chapter: 1, verseStart: 3, verseEnd: 4 + ), + fontSize: 18 + ) } }