@@ -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