-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathBibleVersion+Additions.swift
More file actions
81 lines (70 loc) · 3.17 KB
/
BibleVersion+Additions.swift
File metadata and controls
81 lines (70 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import Foundation
import YouVersionPlatformCore
public extension BibleVersion {
func bookName(_ bookUSFM: String) -> String? {
guard let book = book(with: bookUSFM) else {
return nil
}
return book.title ?? book.fullTitle
}
// Example: "https://www.bible.com/bible/3034/1SA.3.10.BSB"
func shareUrl(reference: BibleReference) -> URL? {
let prefix = "https://www.bible.com/bible/\(id)/"
let book = reference.bookUSFM
let version = (localizedAbbreviation?.isEmpty == false ? localizedAbbreviation : nil) ??
(abbreviation?.isEmpty == false ? abbreviation : nil) ??
String(id)
let urlString = if let verseStart = reference.verseStart {
if let verseEnd = reference.verseEnd, verseStart != verseEnd {
"\(prefix)\(book).\(reference.chapter).\(verseStart)-\(verseEnd).\(version)"
} else {
"\(prefix)\(book).\(reference.chapter).\(verseStart).\(version)"
}
} else {
"\(prefix)\(book).\(reference.chapter).\(version)"
}
return URL(string: urlString)
}
func displayTitle(for reference: BibleReference, includesVersionAbbreviation: Bool = true) -> String {
var referenceOnlyChunks = titleChunks(for: reference)
if isRightToLeft {
referenceOnlyChunks.reverse()
}
let referenceOnlyTitle = referenceOnlyChunks.joined()
var titleChunks = [referenceOnlyTitle]
if includesVersionAbbreviation, let abbreviation = localizedAbbreviation ?? abbreviation {
titleChunks.append(abbreviation)
if isRightToLeft {
titleChunks.reverse()
}
}
return titleChunks.joined(separator: " ")
}
private func titleChunks(for reference: BibleReference) -> [String] {
let bookUSFM = reference.bookUSFM
let bookName = bookName(bookUSFM) ?? ""
let hasOneChapter = canonicalChapters(bookUSFM).count == 1
let chapterSeparator = hasOneChapter ? " " : ":"
let bookAndChapterSeparator = hasOneChapter ? "" : " "
let chapter = hasOneChapter ? "" : String(reference.chapter)
switch (reference.verseStart, reference.verseEnd) {
case (_, let verseEnd?) where verseEnd == 999:
// Whole chapter
return [bookName, bookAndChapterSeparator, chapter]
case (nil, _):
// Whole chapter
return [bookName, bookAndChapterSeparator, chapter]
case let (verseStart?, verseEnd?):
if verseStart == verseEnd {
// Single verse
return [bookName, bookAndChapterSeparator, chapter, chapterSeparator, String(verseStart)]
} else {
// Verse range
return [bookName, bookAndChapterSeparator, chapter, chapterSeparator, String(verseStart), "-", String(verseEnd)]
}
case let (verseStart?, nil):
// Single verse with no verseEnd
return [bookName, bookAndChapterSeparator, chapter, chapterSeparator, String(verseStart)]
}
}
}