Skip to content

Commit b3b07da

Browse files
Implement show chapters and verses setting, closes #14
1 parent dc2f6f3 commit b3b07da

8 files changed

Lines changed: 93 additions & 73 deletions

File tree

lib/models/bibles/kjv_bible.dart

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ class KJVBibleImpl extends JsonToBible {
99
KJVBibleImpl(Map<String, dynamic> json) : super(json: json);
1010

1111
@override
12-
String getBook(Area readerArea, String bookCode, List<String> bookmarks, bool showSpecialMarks) {
12+
String getBook(
13+
Area readerArea,
14+
String bookCode,
15+
List<String> bookmarks,
16+
bool showSpecialMarks,
17+
bool showChaptersAndVerses,
18+
) {
1319
String htmlText = '';
1420
String chapterNumber = '';
1521
List<dynamic> chapterContents = [];
@@ -22,7 +28,9 @@ class KJVBibleImpl extends JsonToBible {
2228

2329
String chapterId = '${readerArea.name}-$bookCode-$chapterNumber';
2430

25-
String chapterNumberHtml = '''<span class="c" id="$chapterId">$chapterNumber</span>''';
31+
String chapterNumberHtml = '''<span class="c" id="$chapterId">
32+
${showChaptersAndVerses ? chapterNumber : ''}
33+
</span>''';
2634

2735
for (Map item in chapterContents) {
2836
String verseNumber = item['verse'];
@@ -32,11 +40,13 @@ class KJVBibleImpl extends JsonToBible {
3240
String bookmarkIcon = bookmarkIconHTML(verseId, bookmarks);
3341

3442
if (verseNumber == '1') {
35-
htmlText +=
36-
"""<p ondblclick=onCreateBookmark("$verseId") class="p" id="$verseId">$chapterNumberHtml$bookmarkIcon<sup>$verseNumber</sup> $verseText</p>""";
43+
htmlText += """<p ondblclick=onCreateBookmark("$verseId") class="p" id="$verseId">
44+
$chapterNumberHtml$bookmarkIcon<sup>${showChaptersAndVerses ? verseNumber : ''}</sup>&nbsp;$verseText
45+
</p>""";
3746
} else {
38-
htmlText +=
39-
"""<p ondblclick=onCreateBookmark("$verseId") class="p" id="$verseId">$bookmarkIcon<sup>$verseNumber</sup> $verseText</p>""";
47+
htmlText += """<p ondblclick=onCreateBookmark("$verseId") class="p" id="$verseId">
48+
$bookmarkIcon<sup>${showChaptersAndVerses ? verseNumber : ''}</sup>&nbsp;$verseText
49+
</p>""";
4050
}
4151
}
4252
}

lib/models/bibles/oet_lv_bible.dart

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ class OETLiteralBibleImpl extends JsonToBible {
99

1010
// TODO: currently replaces all ' marks with ’.
1111
@override
12-
String getBook(Area readerArea, String bookCode, List<String> bookmarks, bool showSpecialMarks) {
12+
String getBook(
13+
Area readerArea,
14+
String bookCode,
15+
List<String> bookmarks,
16+
bool showSpecialMarks,
17+
bool showChaptersAndVerses,
18+
) {
1319
String htmlText = '';
1420
String chapterNumberHtml = '';
1521

@@ -21,7 +27,9 @@ class OETLiteralBibleImpl extends JsonToBible {
2127
for (Map<String, dynamic> chapter in chaptersData) {
2228
chapterNumber = chapter['chapterNumber'];
2329

24-
chapterNumberHtml = '<span class="c" id="${readerArea.name}-$bookCode-$chapterNumber">$chapterNumber</span>';
30+
chapterNumberHtml = '''<span class="c" id="${readerArea.name}-$bookCode-$chapterNumber">
31+
${showChaptersAndVerses ? chapterNumber : ''}
32+
</span>''';
2533

2634
chapterContents = chapter['contents'];
2735

@@ -52,8 +60,8 @@ class OETLiteralBibleImpl extends JsonToBible {
5260
String verseId = '${readerArea.name}-$bookCode-$chapterNumber-$verseNumberText';
5361
String bookmarkIcon = bookmarkIconHTML(verseId, bookmarks);
5462

55-
htmlText +=
56-
'<p ondblclick=onCreateBookmark("$verseId") class="p">$chapterNumberHtml$bookmarkIcon<sup id="$verseId"> $verseNumberText</sup>';
63+
htmlText += '''<p ondblclick=onCreateBookmark("$verseId") class="p">
64+
$chapterNumberHtml$bookmarkIcon<sup id="$verseId"> ${showChaptersAndVerses ? verseNumberText : ''}</sup>''';
5765
}
5866
} else if (key == 'verseText') {
5967
// Note: we remove numbers and markings related to links for now
@@ -70,7 +78,7 @@ class OETLiteralBibleImpl extends JsonToBible {
7078
verseText = verseText.replaceAll('_', ' ');
7179
}
7280

73-
htmlText += " ${verseText.replaceAll("'", "’")}</span>";
81+
htmlText += "&nbsp;${verseText.replaceAll("'", "’")}</span>";
7482
}
7583
}
7684
}

lib/models/bibles/oet_rv_bible.dart

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ class OETReadersBibleImpl extends JsonToBible {
1111

1212
// TODO: currently replaces all ' marks with ’.
1313
@override
14-
String getBook(Area readerArea, String bookCode, List<String> bookmarks, bool showSpecialMarks) {
14+
String getBook(
15+
Area readerArea,
16+
String bookCode,
17+
List<String> bookmarks,
18+
bool showSpecialMarks,
19+
bool showChaptersAndVerses,
20+
) {
1521
String htmlText = '';
1622
String chapterNumberHtml = '';
1723

@@ -23,7 +29,8 @@ class OETReadersBibleImpl extends JsonToBible {
2329

2430
for (Map<String, dynamic> chapter in chaptersData) {
2531
chapterNumber = chapter['chapterNumber'];
26-
chapterNumberHtml = '<span class="c" id="${readerArea.name}-$bookCode-$chapterNumber">$chapterNumber</span>';
32+
chapterNumberHtml =
33+
'''<span class="c" id="${readerArea.name}-$bookCode-$chapterNumber">${showChaptersAndVerses ? chapterNumber : ''}</span>''';
2734

2835
chapterContents = chapter['contents'];
2936

@@ -88,10 +95,10 @@ class OETReadersBibleImpl extends JsonToBible {
8895
String bookmarkIcon = bookmarkIconHTML(verseId, bookmarks);
8996
if (isNewParagraph == false) {
9097
htmlText +=
91-
'<span ondblclick=onCreateBookmark("$verseId") class="p">$bookmarkIcon<sup id="$verseId">$verseNumberText</sup>';
98+
'''<span ondblclick=onCreateBookmark("$verseId") class="p">$bookmarkIcon<sup id="$verseId">${showChaptersAndVerses ? verseNumberText : ''}</sup>''';
9299
} else {
93100
htmlText +=
94-
'<p ondblclick=onCreateBookmark("$verseId") class="p">$chapterNumberHtml$bookmarkIcon<sup id="$verseId">$verseNumberText</sup>';
101+
'''<p ondblclick=onCreateBookmark("$verseId") class="p">$chapterNumberHtml$bookmarkIcon<sup id="$verseId">${showChaptersAndVerses ? verseNumberText : ''}</sup>''';
95102
}
96103
}
97104
} else if (key == 'verseText') {
@@ -107,19 +114,13 @@ class OETReadersBibleImpl extends JsonToBible {
107114
if (isSection == true && isNext == true) {
108115
String verseId = '${readerArea.name}-$bookCode-$chapterNumber-$sectionVerseReference';
109116
String bookmarkIcon = bookmarkIconHTML(verseId, bookmarks);
110-
htmlText += """<p>
111-
<div class="section-box">
112-
<p><sup id="$verseId">$chapterNumber:$sectionVerseReference</sup> ${sectionText.replaceAll("'", "’")}</p>
113-
</div>
114-
<span ondblclick=onCreateBookmark("$verseId") class="p">
115-
$chapterNumberHtml$bookmarkIcon<sup>$sectionVerseReference</sup> ${verseText.replaceAll("'", "’")}
116-
</span>
117-
""";
117+
htmlText +=
118+
"""<p><div class="section-box"><p><sup id="$verseId">$chapterNumber:$sectionVerseReference</sup> ${sectionText.replaceAll("'", "’")}</p></div><span ondblclick=onCreateBookmark("$verseId") class="p">$chapterNumberHtml$bookmarkIcon<sup>${showChaptersAndVerses ? sectionVerseReference : ''}</sup>&nbsp;${verseText.replaceAll("'", "’")}</span>""";
118119

119120
isSection = false;
120121
isNext = false;
121122
} else {
122-
htmlText += " ${verseText.replaceAll("'", "’")}</span>";
123+
htmlText += "&nbsp;${verseText.replaceAll("'", "’")}</span>";
123124
}
124125
}
125126
}

lib/models/json_to_bible.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,19 @@ abstract class JsonToBible {
2727
bool isBookmarked = bookmarks.contains(verseId);
2828

2929
String svg =
30-
"""<svg class="svg $verseId-svg ${isBookmarked ? "bookmarked" : ""}" style="fill: ${verseId.textToHslColor()} !important;" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 256 256"><path d="M184,32H72A16,16,0,0,0,56,48V224a8,8,0,0,0,12.24,6.78L128,193.43l59.77,37.35A8,8,0,0,0,200,224V48A16,16,0,0,0,184,32Zm0,177.57-51.77-32.35a8,8,0,0,0-8.48,0L72,209.57V48H184Z"></path></svg>""";
30+
"""<svg class="svg $verseId-svg ${isBookmarked ? "bookmarked" : ""}" style="fill: ${verseId.textToHslColor()} !important;" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 256 256">
31+
<path d="M184,32H72A16,16,0,0,0,56,48V224a8,8,0,0,0,12.24,6.78L128,193.43l59.77,37.35A8,8,0,0,0,200,224V48A16,16,0,0,0,184,32Zm0,177.57-51.77-32.35a8,8,0,0,0-8.48,0L72,209.57V48H184Z"></path>
32+
</svg>""";
3133
return svg;
3234
}
3335

34-
String getBook(Area readerArea, String bookCode, List<String> bookmarks, bool showSpecialMarks) {
36+
String getBook(
37+
Area readerArea,
38+
String bookCode,
39+
List<String> bookmarks,
40+
bool showSpecialMarks,
41+
bool showChaptersAndVerses,
42+
) {
3543
return '~';
3644
}
3745
}

lib/services/reader_service.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class ReaderService {
1212
Map<String, dynamic> get secondaryAreaJson => _biblesService.secondaryAreaJson;
1313

1414
/// An "Area" is the area in the reader where bible text is displayed and scrolled.
15-
String getReaderBookHTML(
16-
Area area, ViewBy viewBy, String bibleCode, String bookCode, List<String> bookmarks, bool showMarks) {
15+
String getReaderBookHTML(Area area, ViewBy viewBy, String bibleCode, String bookCode, List<String> bookmarks,
16+
bool showMarks, bool showChaptersAndVerses) {
1717
Map<String, dynamic> json;
1818
if (area == Area.primary) {
1919
json = primaryAreaJson;
@@ -23,13 +23,13 @@ class ReaderService {
2323

2424
if (bibleCode == 'OET-LV') {
2525
var bibleImpl = OETLiteralBibleImpl(json);
26-
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks);
26+
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks, showChaptersAndVerses);
2727
} else if (bibleCode == 'OET-RV') {
2828
var bibleImpl = OETReadersBibleImpl(json);
29-
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks);
29+
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks, showChaptersAndVerses);
3030
} else if (bibleCode == 'KJV') {
3131
var bibleImpl = KJVBibleImpl(json);
32-
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks);
32+
return bibleImpl.getBook(area, bookCode, bookmarks, showMarks, showChaptersAndVerses);
3333
} else {
3434
return 'Invalid bibleCode.';
3535
}

lib/ui/views/reader/reader_viewmodel.dart

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class ReaderViewModel extends ReactiveViewModel {
3333

3434
double get textScaling => _settingsService.textScaling;
3535
bool get showMarks => _settingsService.showMarks;
36+
bool get showChaptersAndVerses => _settingsService.showChaptersAndVerses;
37+
3638
bool get showSecondaryArea => _settingsService.showSecondaryArea;
3739
bool get linkReaderAreaScrolling => _settingsService.linkReaderAreaScrolling;
3840

@@ -58,6 +60,7 @@ class ReaderViewModel extends ReactiveViewModel {
5860
bookCode,
5961
bookmarks,
6062
showMarks,
63+
showChaptersAndVerses,
6164
);
6265

6366
String secondaryAreaHTML = _readerService.getReaderBookHTML(
@@ -67,6 +70,7 @@ class ReaderViewModel extends ReactiveViewModel {
6770
bookCode,
6871
bookmarks,
6972
showMarks,
73+
showChaptersAndVerses,
7074
);
7175

7276
await initilizeReaderWebview(
@@ -505,12 +509,26 @@ class ReaderViewModel extends ReactiveViewModel {
505509
Future<void> updateReaderAreas() async {
506510
await _biblesService.reloadBiblesJson();
507511

508-
String primaryAreaHTML =
509-
_readerService.getReaderBookHTML(Area.primary, viewBy, primaryAreaBible, bookCode, bookmarks, showMarks);
512+
String primaryAreaHTML = _readerService.getReaderBookHTML(
513+
Area.primary,
514+
viewBy,
515+
primaryAreaBible,
516+
bookCode,
517+
bookmarks,
518+
showMarks,
519+
showChaptersAndVerses,
520+
);
510521
await updateReaderAreaHTMLContent(Area.primary, primaryAreaHTML);
511522
if (showSecondaryArea == true) {
512-
String secondaryAreaHTML =
513-
_readerService.getReaderBookHTML(Area.secondary, viewBy, secondaryAreaBible, bookCode, bookmarks, showMarks);
523+
String secondaryAreaHTML = _readerService.getReaderBookHTML(
524+
Area.secondary,
525+
viewBy,
526+
secondaryAreaBible,
527+
bookCode,
528+
bookmarks,
529+
showMarks,
530+
showChaptersAndVerses,
531+
);
514532
await updateReaderAreaHTMLContent(Area.secondary, secondaryAreaHTML);
515533
}
516534

lib/ui/views/settings/settings_view.dart

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -153,41 +153,16 @@ class SettingsView extends StackedView<SettingsViewModel> {
153153
value: viewModel.showMarks,
154154
onChanged: viewModel.changeShowMarks,
155155
),
156-
// Divider(
157-
// height: 0,
158-
// color: context.theme.appColors.divider,
159-
// ),
160-
// // Show chapters and verses
161-
// Padding(
162-
// padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
163-
// child: Row(
164-
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
165-
// children: [
166-
// Text(
167-
// 'Show chapters and verses',
168-
// style: TextStyle(
169-
// color: context.theme.appColors.primary,
170-
// fontSize: 16.0,
171-
// fontWeight: FontWeight.w500,
172-
// ),
173-
// ),
174-
// Switch(
175-
// activeColor: context.theme.appColors.background,
176-
// activeTrackColor: context.theme.appColors.switchBackground,
177-
// inactiveThumbColor: context.theme.appColors.primary,
178-
// inactiveTrackColor: context.theme.appColors.background,
179-
// trackOutlineColor: MaterialStateProperty.resolveWith((states) {
180-
// if (states.contains(MaterialState.selected)) {
181-
// return context.theme.appColors.switchBackground;
182-
// }
183-
// return context.theme.appColors.primary;
184-
// }),
185-
// value: viewModel.showChaptersAndVerses,
186-
// onChanged: viewModel.changeShowChaptersAndVerses,
187-
// ),
188-
// ],
189-
// ),
190-
// ),
156+
Divider(
157+
height: 0,
158+
color: context.theme.appColors.divider,
159+
),
160+
// Show chapters and verses
161+
ToggleItem(
162+
label: 'Show chapters and verses',
163+
value: viewModel.showChaptersAndVerses,
164+
onChanged: viewModel.changeShowChaptersAndVerses,
165+
),
191166
Divider(
192167
height: 0,
193168
color: context.theme.appColors.divider,
@@ -200,6 +175,7 @@ class SettingsView extends StackedView<SettingsViewModel> {
200175
height: 0,
201176
color: context.theme.appColors.divider,
202177
),
178+
// Theme
203179
Padding(
204180
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0, left: 12.0),
205181
child: Text(
@@ -212,7 +188,6 @@ class SettingsView extends StackedView<SettingsViewModel> {
212188
),
213189
),
214190
),
215-
216191
SingleChildScrollView(
217192
scrollDirection: Axis.horizontal,
218193
child: Row(

lib/ui/views/settings/widgets/settings_category_title/settings_category_title.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class SettingsCategoryTitle extends StackedView<SettingsCategoryTitleModel> {
2323
child: Text(
2424
title,
2525
style: TextStyle(
26-
color: context.theme.appColors.secondary,
26+
color: context.theme.appColors.secondary.withValues(alpha: 0.8),
2727
fontWeight: FontWeight.w500,
28-
fontSize: 12.0,
28+
fontSize: 14.0,
2929
letterSpacing: -0.1,
3030
),
3131
),

0 commit comments

Comments
 (0)