Skip to content

Commit db21ad8

Browse files
Add WEB bible implementation for the reader and search
* The WEB is not yet enabled in search
1 parent 443a793 commit db21ad8

4 files changed

Lines changed: 128 additions & 1 deletion

File tree

lib/common/bibles.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ const List<String> bibleVersions = [
33
'OET-RV',
44
'OET-LV',
55
'KJV',
6+
'WEB',
67
];
78

89
/// Mapping bibleCodes to the full Bible version name
910
const Map<String, String> bibleVersionsMapping = {
1011
'OET-RV': 'Open English Translation Readers Version',
1112
'OET-LV': 'Open English Translation Literal Version',
1213
'KJV': 'King James Version',
14+
'WEB': 'The World English Bible',
1315
};

lib/models/bibles/web_bible.dart

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import 'dart:developer';
2+
import '../../common/enums.dart';
3+
import '../json_to_bible.dart';
4+
import '../search_result.dart';
5+
6+
/// The World English Bible (WEB) implementation.
7+
///
8+
/// The WEB is displayed in chapters verse-by-verse.
9+
class WEBBibleImpl extends JsonToBible {
10+
WEBBibleImpl(Map<String, dynamic> json) : super(json: json);
11+
12+
@override
13+
Future<String> getBook(
14+
Area readerArea,
15+
String bookCode,
16+
List<String> bookmarks,
17+
bool showSpecialMarks,
18+
bool showChaptersAndVerses,
19+
) async {
20+
String htmlText = '';
21+
String chapterNumberHtml = '';
22+
String chapterNumber = '1';
23+
String verseNumber = '1';
24+
25+
for (Map item in json['content']) {
26+
// Chapter 'chapter'
27+
if (item['type'] == 'chapter') {
28+
chapterNumber = item['number'];
29+
30+
String chapterId = '${readerArea.name}-$bookCode-$chapterNumber';
31+
32+
chapterNumberHtml = '''<span class="c" id="$chapterId">
33+
${showChaptersAndVerses ? chapterNumber : ''}
34+
</span>''';
35+
}
36+
37+
// Paragraph 'para'
38+
if (item['type'] == 'para') {
39+
// 'para' type items always have inner 'content'
40+
for (dynamic paraItem in item['content']) {
41+
if (paraItem is String) {
42+
if (item['marker'] == 'p') {
43+
String verseText = paraItem
44+
.replaceAll('*j', '') // Remove leftover instances of j* from the original usfm
45+
.replaceAll(RegExp(r'¦G([0-9])*\d+'), ''); // For now, remove all Strong's numbers
46+
47+
htmlText += '$verseText</p>';
48+
}
49+
} else if (paraItem is Map) {
50+
String itemType = paraItem['type'];
51+
52+
if (itemType == 'verse') {
53+
verseNumber = paraItem['number'];
54+
55+
String verseId = '${readerArea.name}-$bookCode-$chapterNumber-$verseNumber';
56+
String bookmarkIcon = bookmarkIconHTML(verseId, bookmarks);
57+
58+
if (verseNumber == '1') {
59+
htmlText += """<p ondblclick="onCreateBookmark("$verseId")" class="p" id="$verseId">
60+
$chapterNumberHtml$bookmarkIcon<sup>${showChaptersAndVerses ? verseNumber : ''}</sup>&nbsp;""";
61+
} else {
62+
htmlText += """<p ondblclick=onCreateBookmark("$verseId") class="p" id="$verseId">
63+
$bookmarkIcon<sup>${showChaptersAndVerses ? verseNumber : ''}</sup>&nbsp;""";
64+
}
65+
}
66+
}
67+
}
68+
}
69+
}
70+
71+
return htmlText;
72+
}
73+
74+
@override
75+
Future<List<SearchResult>> getSearchResults(String bookCode, String searchTerm) async {
76+
List<SearchResult> results = [];
77+
78+
String chapterNumber = '';
79+
String verseNumber = '';
80+
String verseText = '';
81+
82+
for (Map item in json['content']) {
83+
// Chapter 'chapter'
84+
if (item['type'] == 'chapter') {
85+
chapterNumber = item['number'];
86+
}
87+
88+
// Paragraph 'para'
89+
if (item['type'] == 'para') {
90+
// 'para' type items always have inner 'content'
91+
for (dynamic paraItem in item['content']) {
92+
if (paraItem is String) {
93+
if (item['marker'] == 'p') {
94+
verseText = paraItem
95+
.replaceAll('*j', '') // Remove leftover instances of j* from the original usfm
96+
.replaceAll(RegExp(r'¦G([0-9])*\d+'), ''); // For now, remove all Strong's numbers
97+
}
98+
} else if (paraItem is Map) {
99+
String itemType = paraItem['type'];
100+
101+
if (itemType == 'verse') {
102+
verseNumber = paraItem['number'];
103+
104+
bool isSearchTermInVerse = verseText.toLowerCase().contains(searchTerm);
105+
if (isSearchTermInVerse == true) {
106+
results.add(SearchResult(
107+
bookCode: bookCode,
108+
chapter: int.parse(chapterNumber),
109+
verse: int.parse(verseNumber),
110+
verseText: verseText,
111+
));
112+
}
113+
}
114+
}
115+
}
116+
}
117+
}
118+
119+
return results;
120+
}
121+
}

lib/services/reader_service.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import '../common/enums.dart';
33
import '../models/bibles/kjv_bible.dart';
44
import '../models/bibles/oet_lv_bible.dart';
55
import '../models/bibles/oet_rv_bible.dart';
6+
import '../models/bibles/web_bible.dart';
67
import 'bibles_service.dart';
78

89
class ReaderService {
@@ -30,6 +31,9 @@ class ReaderService {
3031
} else if (bibleCode == 'KJV') {
3132
var bibleImpl = KJVBibleImpl(json);
3233
return await bibleImpl.getBook(area, bookCode, bookmarks, showMarks, showChaptersAndVerses);
34+
} else if (bibleCode == 'WEB') {
35+
var bibleImpl = WEBBibleImpl(json);
36+
return await bibleImpl.getBook(area, bookCode, bookmarks, showMarks, showChaptersAndVerses);
3337
} else {
3438
return 'Invalid bibleCode.';
3539
}

lib/ui/views/reader/reader_view.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ReaderView extends StackedView<ReaderViewModel> {
6565
controller: viewModel.webviewController,
6666
),
6767
),
68-
if (viewModel.primaryAreaBible != 'KJV' || viewModel.secondaryAreaBible != 'KJV')
68+
if (viewModel.primaryAreaBible.startsWith('OET') || viewModel.secondaryAreaBible.startsWith('OET'))
6969
Container(
7070
color: context.theme.appColors.background,
7171
padding: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 12.0),

0 commit comments

Comments
 (0)