mirror of
https://github.com/MinimalBible/MinimalBible
synced 2024-12-22 14:48:23 -05:00
Switch to the VerseLookup over parser
Allows me to use the LRUCache frontent
This commit is contained in:
parent
96c5c895e9
commit
66076c759a
@ -12,6 +12,7 @@ import android.view.ViewGroup;
|
||||
import org.bspeice.minimalbible.Injector;
|
||||
import org.bspeice.minimalbible.R;
|
||||
import org.bspeice.minimalbible.activity.BaseFragment;
|
||||
import org.bspeice.minimalbible.service.lookup.VerseLookup;
|
||||
import org.crosswire.jsword.book.Book;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@ -34,6 +35,8 @@ public class BookFragment extends BaseFragment {
|
||||
Book mBook;
|
||||
@Inject
|
||||
PublishSubject<BookScrollEvent> scrollEventProvider;
|
||||
@Inject
|
||||
VerseLookup lookup;
|
||||
|
||||
@InjectView(R.id.book_content)
|
||||
RecyclerView bookContent;
|
||||
@ -91,7 +94,7 @@ public class BookFragment extends BaseFragment {
|
||||
((BibleViewer)getActivity()).setActionBarTitle(b.getInitials());
|
||||
|
||||
final RecyclerView.LayoutManager manager = new LinearLayoutManager(getActivity());
|
||||
BookAdapter adapter = new BookAdapter(b);
|
||||
BookAdapter adapter = new BookAdapter(b, lookup);
|
||||
bookContent.setLayoutManager(manager);
|
||||
bookContent.setAdapter(adapter);
|
||||
|
||||
|
@ -1,50 +0,0 @@
|
||||
package org.bspeice.minimalbible.activity.viewer
|
||||
|
||||
import org.crosswire.jsword.passage.Verse
|
||||
import android.webkit.WebViewClient
|
||||
import android.webkit.JavascriptInterface
|
||||
import org.crosswire.jsword.book.Book
|
||||
import android.util.Log
|
||||
import rx.subjects.PublishSubject
|
||||
import org.crosswire.jsword.book.getVersification
|
||||
import org.bspeice.minimalbible.service.lookup.VerseLookup
|
||||
|
||||
/**
|
||||
* Created by bspeice on 9/14/14.
|
||||
*/
|
||||
|
||||
class BibleViewClient(val b: Book, val lookup: VerseLookup,
|
||||
val subject: PublishSubject<String>?) : WebViewClient() {
|
||||
|
||||
// We can receive and return only primitives and Strings. Still means we can use JSON :)
|
||||
JavascriptInterface fun getVerse(ordinal: Int): String {
|
||||
val v = Verse(b.getVersification(), ordinal)
|
||||
// TODO: WebView should notify us what verse it's on
|
||||
subject?.onNext("${v.getBook()} ${v.getChapter()}:${v.getVerse()}")
|
||||
return lookup getJson v
|
||||
}
|
||||
|
||||
JavascriptInterface fun getVerses(first: Int, count: Int): String {
|
||||
Log.e("getVerses", "First: $first count: $count")
|
||||
val verses: MutableList<String> = linkedListOf()
|
||||
val trueCount: Int
|
||||
val trueFirst: Int
|
||||
when {
|
||||
first < 0 - count -> return ""
|
||||
first < 0 -> {
|
||||
trueCount = count + first // Equivalent to count - abs(first)
|
||||
trueFirst = 0
|
||||
}
|
||||
else -> {
|
||||
trueCount = count
|
||||
trueFirst = first
|
||||
}
|
||||
}
|
||||
|
||||
for (i in trueFirst..trueFirst + trueCount - 1) {
|
||||
verses.add(getVerse(i))
|
||||
}
|
||||
Log.e("getVerses", "return verses size: ${verses.size}")
|
||||
return verses.toString()
|
||||
}
|
||||
}
|
@ -6,19 +6,19 @@ import org.crosswire.jsword.book.Book
|
||||
import android.view.LayoutInflater
|
||||
import org.bspeice.minimalbible.R
|
||||
import android.widget.TextView
|
||||
import org.bspeice.minimalbible.service.format.osisparser.OsisParser
|
||||
import org.crosswire.jsword.book.getVersification
|
||||
import org.crosswire.jsword.versification.getBooks
|
||||
import org.crosswire.jsword.versification.BibleBook
|
||||
import org.bspeice.minimalbible.activity.viewer.BookAdapter.ChapterInfo
|
||||
import rx.subjects.PublishSubject
|
||||
import org.bspeice.minimalbible.service.lookup.VerseLookup
|
||||
|
||||
/**
|
||||
* Adapter used for displaying a book
|
||||
* Displays one chapter at a time,
|
||||
* as each TextView widget is it's own line break
|
||||
*/
|
||||
class BookAdapter(val b: Book)
|
||||
class BookAdapter(val b: Book, val lookup: VerseLookup)
|
||||
: RecyclerView.Adapter<PassageView>() {
|
||||
|
||||
val versification = b.getVersification()
|
||||
@ -58,7 +58,7 @@ class BookAdapter(val b: Book)
|
||||
val emptyView = LayoutInflater.from(parent?.getContext())
|
||||
.inflate(R.layout.viewer_passage_view, parent, false) as TextView
|
||||
|
||||
val passage = PassageView(emptyView)
|
||||
val passage = PassageView(emptyView, b, lookup)
|
||||
return passage
|
||||
}
|
||||
|
||||
@ -87,16 +87,16 @@ class BookAdapter(val b: Book)
|
||||
}
|
||||
}
|
||||
|
||||
class PassageView(val v: TextView) : RecyclerView.ViewHolder(v) {
|
||||
val parser = OsisParser()
|
||||
class PassageView(val v: TextView, val b: Book, val lookup: VerseLookup)
|
||||
: RecyclerView.ViewHolder(v) {
|
||||
|
||||
fun getVerseText(b: Book, verseRange: Progression<Int>) =
|
||||
verseRange.map { parser.getVerse(b, it).content }
|
||||
fun getVerseText(verseRange: Progression<Int>) =
|
||||
verseRange.map { lookup.getText(b.getVersification().decodeOrdinal(it)) }
|
||||
|
||||
fun reduceText(verses: List<String>) = verses.join(" ")
|
||||
|
||||
// Uses functional style, but those parentheses man... you'd think I was writing LISP
|
||||
fun bind(info: ChapterInfo) {
|
||||
v.setText(reduceText(getVerseText(info.book, info.vStart..info.vEnd)))
|
||||
v.setText(reduceText(getVerseText(info.vStart..info.vEnd)))
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,8 @@ import org.crosswire.jsword.passage.Verse
|
||||
import java.util.ArrayDeque
|
||||
import org.xml.sax.Attributes
|
||||
import org.crosswire.jsword.book.OSISUtil
|
||||
import org.bspeice.minimalbible.SafeValDelegate
|
||||
import org.crosswire.jsword.book.BookData
|
||||
import org.crosswire.jsword.book.Book
|
||||
import org.crosswire.jsword.book.getVersification
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
/**
|
||||
@ -24,17 +22,9 @@ class OsisParser() : DefaultHandler() {
|
||||
// TODO: Implement a stack to keep min API 8
|
||||
val doWrite = ArrayDeque<Boolean>()
|
||||
|
||||
fun getJson(b: Book, v: Verse): String {
|
||||
// I don't always set up my constructors to have faces, but when I do...
|
||||
verseContent = VerseContent(v = v)
|
||||
fun getVerse(b: Book, v: Verse): VerseContent {
|
||||
verseContent = VerseContent(v)
|
||||
BookData(b, v).getSAXEventProvider() provideSAXEvents this
|
||||
return verseContent.json
|
||||
}
|
||||
|
||||
fun getVerse(b: Book, v: Int): VerseContent {
|
||||
val verse = b.getVersification().decodeOrdinal(v)
|
||||
verseContent = VerseContent(verse)
|
||||
BookData(b, verse).getSAXEventProvider() provideSAXEvents this
|
||||
return verseContent
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@ import rx.subjects.PublishSubject
|
||||
import rx.schedulers.Schedulers
|
||||
import org.bspeice.minimalbible.service.format.osisparser.OsisParser
|
||||
import org.crosswire.jsword.book.getVersification
|
||||
import org.bspeice.minimalbible.service.format.osisparser.VerseContent
|
||||
|
||||
/**
|
||||
* Do the low-level work of getting a verse's content
|
||||
@ -28,11 +29,11 @@ open class VerseLookup(val b: Book) : Action1<Verse> {
|
||||
|
||||
fun getVerseId(v: Verse) = v.getOrdinal()
|
||||
|
||||
fun getJson(v: Verse): String =
|
||||
fun getText(v: Verse): String =
|
||||
if (cache contains v)
|
||||
cache[getVerseId(v)]
|
||||
else {
|
||||
val content = doLookup(v)
|
||||
val content = doLookup(v).content
|
||||
notify(v)
|
||||
content
|
||||
}
|
||||
@ -43,11 +44,11 @@ open class VerseLookup(val b: Book) : Action1<Verse> {
|
||||
* it is displayed.
|
||||
*
|
||||
* @param v The verse to look up
|
||||
* @return The JSON content of this verse
|
||||
* @return The string content of this verse
|
||||
*/
|
||||
fun doLookup(v: Verse): String = OsisParser().getJson(b, v)
|
||||
fun doLookup(ordinal: Int): String = OsisParser()
|
||||
.getJson(b, Verse(b.getVersification(), ordinal))
|
||||
fun doLookup(v: Verse): VerseContent = OsisParser().getVerse(b, v)
|
||||
fun doLookup(ordinal: Int): VerseContent = OsisParser()
|
||||
.getVerse(b, b.getVersification() decodeOrdinal ordinal)
|
||||
|
||||
/**
|
||||
* Not necessary, but helpful if you let us know ahead of time we should pre-cache a verse.
|
||||
|
Loading…
Reference in New Issue
Block a user