Skip to content

Commit d0f6234

Browse files
authored
chore: refactor, and make textBlocks() public for testing purposes.
(This is one step of multiple PRs.)
1 parent 3f361ac commit d0f6234

File tree

2 files changed

+35
-27
lines changed

2 files changed

+35
-27
lines changed

Sources/YouVersionPlatformUI/Views/BibleTextView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public struct BibleTextView: View {
141141
loadingPhase = .loading
142142
do {
143143
if let blocks = try await BibleVersionRendering.textBlocks(
144-
reference,
144+
reference: reference,
145145
renderHeadlines: textOptions.renderHeadlines,
146146
renderVerseNumbers: textOptions.renderVerseNumbers,
147147
footnotesMode: textOptions.footnoteMode,
@@ -173,7 +173,7 @@ public struct BibleTextView: View {
173173
) async -> (some View)? {
174174
do {
175175
guard let blocks = try? await BibleVersionRendering.textBlocks(
176-
reference,
176+
reference: reference,
177177
fonts: BibleTextFonts(familyName: fontFamily, baseSize: fontSize)
178178
) else {
179179
return nil as BibleTextView?

Sources/YouVersionPlatformUI/Views/Rendering/BibleVersionRendering.swift

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public enum BibleVersionRendering {
1313
let familyName = "Times New Roman"
1414
do {
1515
guard let blocks = try await textBlocks(
16-
reference,
16+
reference: reference,
1717
renderHeadlines: false,
1818
renderVerseNumbers: false,
1919
footnotesMode: .none,
@@ -31,8 +31,9 @@ public enum BibleVersionRendering {
3131

3232
/// Formats the Bible data into AttributedString objects plus metadata.
3333
/// If the chapter data is unavailable (e.g. we're offline), this returns nil.
34-
static func textBlocks(
35-
_ reference: BibleReference,
34+
public static func textBlocks(
35+
from textNode: BibleTextNode? = nil,
36+
reference: BibleReference,
3637
renderHeadlines: Bool = true,
3738
renderVerseNumbers: Bool = true,
3839
footnotesMode: BibleTextFootnoteMode = .letters,
@@ -41,27 +42,11 @@ public enum BibleVersionRendering {
4142
wocColor: Color = Color.red,
4243
fonts: BibleTextFonts
4344
) async throws -> [BibleTextBlock]? {
44-
let book = reference.bookUSFM
45-
let c = reference.chapter
46-
let chapterReference = BibleReference(versionId: reference.versionId, bookUSFM: book, chapter: c)
47-
48-
let rootNode: BibleTextNode?
49-
do {
50-
let data = try await BibleChapterRepository.shared.chapter(withReference: chapterReference)
51-
var node = try? BibleTextNode.parse(data)
52-
if node?.children.count ?? 0 == 0 {
53-
print("cached chapter data seems bad. Removing it and retrying.")
54-
await BibleChapterRepository.shared.removeVersion(withId: reference.versionId)
55-
let data = try await BibleChapterRepository.shared.chapter(withReference: chapterReference)
56-
node = try? BibleTextNode.parse(data)
57-
}
58-
rootNode = node
59-
} catch YouVersionAPIError.notPermitted {
60-
throw YouVersionAPIError.notPermitted
61-
} catch {
62-
return nil
45+
var node = textNode
46+
if node == nil {
47+
node = try await rootNode(from: reference)
6348
}
64-
guard let rootNode, !rootNode.children.isEmpty else {
49+
guard let node, !node.children.isEmpty else {
6550
return nil
6651
}
6752

@@ -102,11 +87,11 @@ public enum BibleVersionRendering {
10287
headIndent: 0,
10388
versionId: reference.versionId,
10489
bookUSFM: reference.bookUSFM,
105-
chapter: c,
90+
chapter: reference.chapter,
10691
verse: 0
10792
)
10893

109-
if let firstChild = rootNode.children.first {
94+
if let firstChild = node.children.first {
11095
handleNodeBlock(
11196
node: firstChild,
11297
stateIn: stateIn, stateDown: stateDown, stateUp: &stateUp,
@@ -115,6 +100,29 @@ public enum BibleVersionRendering {
115100
}
116101
return ret
117102
}
103+
104+
/// Fetches the data for the given reference, returns it converted to a BibleTextNode tree.
105+
static func rootNode(from reference: BibleReference) async throws -> BibleTextNode? {
106+
let book = reference.bookUSFM
107+
let c = reference.chapter
108+
let chapterReference = BibleReference(versionId: reference.versionId, bookUSFM: book, chapter: c)
109+
110+
do {
111+
let data = try await BibleChapterRepository.shared.chapter(withReference: chapterReference)
112+
var node = try? BibleTextNode.parse(data)
113+
if node?.children.count ?? 0 == 0 {
114+
// cached chapter data seems bad. Remove the cached data and retry.
115+
await BibleChapterRepository.shared.removeVersion(withId: reference.versionId)
116+
let data = try await BibleChapterRepository.shared.chapter(withReference: chapterReference)
117+
node = try? BibleTextNode.parse(data)
118+
}
119+
return node
120+
} catch YouVersionAPIError.notPermitted {
121+
throw YouVersionAPIError.notPermitted
122+
} catch {
123+
return nil
124+
}
125+
}
118126

119127
private static func traceLog(_ node: BibleTextNode, stateDown: StateDown) {
120128
#if false

0 commit comments

Comments
 (0)