[sword-devel] Feature Complete Perl Interface

John Keiser sword-devel@crosswire.org
21 Jul 2001 17:52:00 -0400


A minor change: the border where the greater than comparison has trouble is between Amos 9:15 and Obadiah 1:1--not between Obadiah and Jonah.  Amos is the 30th book; Obadiah is the 31st.

--John

On 21 Jul 2001 17:43:10 -0400, John Keiser wrote:
> On 21 Jul 2001 10:57:23 -0700, Chris Little wrote:
> > 
> > > I'll take a look ... right now I'm implementing a new 
> > > parse_verse_list() in Perl (the Sword one doesn't seem to 
> > > actually support ranges, even though there's an option for it).
> > 
> > It does parse verse lists.  Just use VerseKey::ParseVerseList and it
> > will return a listkey, containing a number of VerseKeys and SWKeys.  The
> > VerseKeys have UpperBound and LowerBound indicating the first and last
> > verse of the range.  The SWKeys are a single verse.  Check one of the
> > front ends for examples of implementation.  I believe the addvs utility
> > may have the simples to read implementation.
> >  
> 
> Oh!  I didn't realize the UpperBound and LowerBound were set.  I've
> already implemented it in Perl (and it's pretty nice IMHO) but I'll look
> into it.
> 
> Oh, while we're at it, I think I've found a bug (though I could be just
> doing something wrong.  The software does not seem to be able to compare
> verses from books 32 and above (Jonah and above in the Old Testament).
> Specifically, given the following code:
> 
> int VerseIterator::_verse_greater(char * verse1, char * verse2) {
>         if(module->SetKey(verse1)) {
>                 return -1;
>         }
>         SWKey key1 = module->Key();
>         if(module->SetKey(verse2)) {
>                 return -1;
>         }
>         SWKey key2 = module->Key();
>         return key1 > key2;
> }
> 
> The following results occur:
> 
> _verse_greater("James 3:4", "Malachi 4:5"); FALSE
> _verse_greater("James 3:4", "Obadiah 12:21"); TRUE
> _verse_greater("James 3:4", "Jonah 1:1"); FALSE
> 
> I have reimplemented it myself using the testament and book # direct
> from Sword, and it works.  Looking at the compare() function in VerseKey
> (and tests confirm that it is called) I cannot figure out why this is.
> 
> > > How does language stuff work?  Can you just say
> > > systemLocaleMgr.setDefaultLocaleName(...) and then book names 
> > > and verses and everything will automagically come back in the 
> > > new language? Specifically, will the book[] array in VerseKey 
> > > work correctly?
> > 
> > In short, you need to do
> > 
> >               LocaleMgr::systemLocaleMgr.setDefaultLocaleName(locale);
> >               vk.setLocale(locale);
> > 
> > where locale is string containing the name of a locale and vk is a
> > VerseKey you're using.  (Repeat for all VerseKeys whose keys you
> > output.)
> > You can use 
> > 
> >               LocaleMgr lm = LocaleMgr::systemLocaleMgr;
> >               list<string> loclist =  lm.getAvailableLocales();
> >               list<string>::iterator li = loclist.begin();
> >               for (;li != loclist.end(); li++) {
> >                 cout << li->c_str();
> >                 cout << "\n";
> >               }
> > 
> > to output a list of locales installed on the system to your users.
> > 
> 
> Yahoo!  Thanks.  I'll get that into 0.3 (to be released shortly--I've
> included a bunch of functions to play with and merge verse lists and
> ranges).
> 
> > I'm looking forward to trying this module out myself.  I have a feeling
> > it's not going to be much faster if I rig the diatheke CGI to use it,
> > though, since the biggest performance hit still comes with instantiating
> > SWMgr.
> 
> I agree to a degree on the performance issue; starting up a shell is a
> definite hit, though.  The thing I wanted most to gain with a Perl
> interface was an easier, more flexible interface than shelling can
> offer.
> 
> > Do you (or anyone else) have any ideas for keeping SWMgr running
> > between CGI queries, aside from the idea I mentioned before of making a
> > Sword daemon to communicate using sockets?
> > 
> 
> To keep SWMgr running, all you have to do is use a lib and run your CGI
> against mod_perl.  mod_perl allows CGIs to keep static data around
> between invocations.  I have not determined how safe this lib is under 
> mod_perl; I am working on features still.  But in theory it should
> oughta work fine.  I'm not keeping SWMgr around right now, I'll put that
> in the next release.
> 
> --John
>