[jsword-devel] Method to find if BibleBook is contained in a Book

John Austin gpl.programs.info at gmail.com
Tue Mar 25 20:43:46 MST 2014

There has been a lot of discussion about how missing material in a v11n 
should be treated (the discussion of the meaning and use of Scope was 
part of that). Tools such as osis2mod generated warnings whenever OSIS 
files lacked any part of the chosen v11n. The Scope conf param was, for 
a time at least, the recommended method of describing what part of a 
v11n was covered by a module. For these reasons, many existing modules 
(IBT alone has at least 26 such modules) are currently encoded so as to 
encompass the entire v11n, returning empty-string verse content for all 
verses in the v11n that are not included in the module, and using the 
.conf Scope param to define exactly what is present in the module.

So even though current module making best practice may be different, it 
would be good for JSword to be graceful with modules that are encoded 
somewhat differently if at all possible, at least for a time. There are 
many modules out there, old and new, which don't contain the complete 
v11n, so determining book coverage is important.


On 03/25/2014 08:19 PM, DM Smith wrote:
> Those verses exist since they are defined in the OSIS input file to
> osis2mod. Osis2mod retains everything in its input. This is a well
> documented behavior of osis2mod.
> The end chapter markup will be put in the last verse that is in the
> chapter, which might be verse 0.
> They should use xslt to strip empty verses, chapters and books out of
> their file into an intermediate file and give that as input to osis2mod.
> Alternatively they can use <!-- ... --> to comment out huge swaths of
> the input file.
> -- DM
> On Mar 25, 2014, at 7:48 AM, Martin Denham <mjdenham at gmail.com
> <mailto:mjdenham at gmail.com>> wrote:
>> IBT have just passed me more information regarding their handling of
>> empty verses to help clarify if this is an IBT module issue or not.
>>  The following is an extract from IBT's e-mail:
>>     Here are examples of how IBT's OSIS source defines empty verses in
>>     the markup:
>>     Empty book (Epistle of Jeremiah):
>>     <div type="x-Synodal-non-canonical"__><div type="book"
>>     osisID="EpJer"><chapter osisID="EpJer.1"><verse sID="EpJer.1.1-72"
>>     osisID="EpJer.1.1 EpJer.1.2 EpJer.1.3 EpJer.1.4 EpJer.1.5
>>     EpJer.1.6 EpJer.1.7 EpJer.1.8 EpJer.1.9 EpJer.1.10 EpJer.1.11
>>     EpJer.1.12 EpJer.1.13 EpJer.1.14 EpJer.1.15 EpJer.1.16 EpJer.1.17
>>     EpJer.1.18 EpJer.1.19 EpJer.1.20 EpJer.1.21 EpJer.1.22 EpJer.1.23
>>     EpJer.1.24 EpJer.1.25 EpJer.1.26 EpJer.1.27 EpJer.1.28 EpJer.1.29
>>     EpJer.1.30 EpJer.1.31 EpJer.1.32 EpJer.1.33 EpJer.1.34 EpJer.1.35
>>     EpJer.1.36 EpJer.1.37 EpJer.1.38 EpJer.1.39 EpJer.1.40 EpJer.1.41
>>     EpJer.1.42 EpJer.1.43 EpJer.1.44 EpJer.1.45 EpJer.1.46 EpJer.1.47
>>     EpJer.1.48 EpJer.1.49 EpJer.1.50 EpJer.1.51 EpJer.1.52 EpJer.1.53
>>     EpJer.1.54 EpJer.1.55 EpJer.1.56 EpJer.1.57 EpJer.1.58 EpJer.1.59
>>     EpJer.1.60 EpJer.1.61 EpJer.1.62 EpJer.1.63 EpJer.1.64 EpJer.1.65
>>     EpJer.1.66 EpJer.1.67 EpJer.1.68 EpJer.1.69 EpJer.1.70 EpJer.1.71
>>     EpJer.1.72"/><verse eID="EpJer.1.1-72"/></chapter>__</div></div>
>>     I'm not sure how osis2mod handles all this when importing to the
>>     module, but it works perfectly without warnings or errors. Also,
>>     when the resulting module is passed to the "emptyvss" tool, it
>>     passes this test without warnings.
>> On 25 March 2014 11:38, Martin Denham <mjdenham at gmail.com
>> <mailto:mjdenham at gmail.com>> wrote:
>>     I am having problems getting a list of BibleBooks contained in
>>     some AV modules which we know do not contain certain books.  I
>>     can't work out if the problem is with JSword, the modules, or
>>     osis2mod.
>>     There are 2 related problems I can see:
>>      1. book.contains(nonExistingVerse) returns TRUE
>>      2. book.getRawText(nonExistingVerse) returns <chapter end tag>
>>     Here is a simple test to show the problem using KAZ which has
>>     Synodal v11n but does not contain any deuterocanonical books:
>>     SwordBook kaz = (SwordBook)Books.installed().getBook("KAZ");
>>     Verse esd11Verse = new Verse(kaz.getVersification(),
>>     BibleBook.ESD1, 1, 1);
>>     System.out.println(kaz.contains(esd11Verse));// prints: *true*
>>     System.out.println(kaz.getRawText(esd11Verse));// prints:
>>     *<chapter eID="gen7" osisID="1Esd.1"/>*
>>     Verse esd12Verse = new Verse(kaz.getVersification(),
>>     BibleBook.ESD1, 1, 2);
>>     System.out.println(kaz.contains(esd12Verse));// prints: *true*
>>     System.out.println(kaz.getRawText(esd12Verse));// prints:
>>     *<chapter eID="gen7" osisID="1Esd.1"/>*
>>     So how does "<chapter eID="gen7" osisID="1Esd.1"/>" get into verse
>>     content unexpectedly?
>>     It seems to me like it could be either:
>>      1. a module problem; but IBT say they do not add empty verse slots
>>      2. Sword osis2mod issue
>>      3. JSword issue: why is JSword returning a chapter end tag
>>         instead of verse content
>>     Any ideas what might cause this problem?
>>     Thanks
>>     Martin
>>     On 11 March 2014 12:15, DM Smith <dmsmith at crosswire.org
>>     <mailto:dmsmith at crosswire.org>> wrote:
>>         We haven't pushed this down into JSword. So far it is the
>>         responsibility of the front-end. Chris B has made it efficient
>>         to ask a Book whether it contains a Verse.
>>         Essentially, when it comes to asking a module if it has
>>         meaningful content, you want containsAny(Key verses, boolean
>>         includeIntros) and containsAny(Key verses) { return
>>         containsAny(verses, false); }
>>         I think it should ignore verse 0 by default. If it doesn't
>>         have verse content, then does the content really mean something?
>>         As you have noted contains(Key) is confusing. There are a few
>>         places where it means containsAny. Usually it means
>>         containAll. The name, contains, was chosen early as we derived
>>         from a container class where the argument was an element of
>>         the container.  That is, contains is supposed to mean
>>         isMemberOf. Later we changed the inheritance as it wasn't an
>>         "is a" relationship.
>>         But we need to be careful of not introducing more confusion.
>>         By the way, the list serve was holding mail for a few days.
>>         In Him,
>>                 DM
>>         On Mar 8, 2014, at 5:26 PM, Martin Denham <mjdenham at gmail.com
>>         <mailto:mjdenham at gmail.com>> wrote:
>>         > Is there an efficient way to find if a BibleBook is
>>         contained in a Book (Bible or commentary) using JSword?
>>         >
>>         > I recall this subject being discussed but can't recall the
>>         outcome.
>>         >
>>         > Thanks
>>         > Martin
>>         > _______________________________________________
>>         > jsword-devel mailing list
>>         > jsword-devel at crosswire.org <mailto:jsword-devel at crosswire.org>
>>         > http://www.crosswire.org/mailman/listinfo/jsword-devel
>>         _______________________________________________
>>         jsword-devel mailing list
>>         jsword-devel at crosswire.org <mailto:jsword-devel at crosswire.org>
>>         http://www.crosswire.org/mailman/listinfo/jsword-devel
>> _______________________________________________
>> jsword-devel mailing list
>> jsword-devel at crosswire.org <mailto:jsword-devel at crosswire.org>
>> http://www.crosswire.org/mailman/listinfo/jsword-devel
> _______________________________________________
> jsword-devel mailing list
> jsword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/jsword-devel

More information about the jsword-devel mailing list