[sword-devel] Locale and text retrieval code
Troy A. Griffitts
scribe at crosswire.org
Sun Feb 1 15:40:04 MST 2009
>> The second thing I don't really understand is how to correctly pull
>> out text for a verse key.
>> Some code is following, sorry for that.
Well, to correctly pull out text for a VerseKey, you should be able to
just use 'VerseKey::getText()' If you have enable unicode in sword,
then you will be using the UTF8 locales which should always return UTF8
and not Latin1.
If you have a crash bug please let me know and I will try to hunt things
down before this next release. Can you give me a small example of code
that crashes? e.g.
VerseKey key = "jn.1.1";
key.Persist(true);
ntOnlyModule.setKey(key);
ntOnlyModule.RenderText();
Does this crash? It shouldn't. Hope we can get things working well for
you. I need a new laptop and considering buying a Mac! :)
-Troy.
>>
>> In MacSword I have implemented the code like this:
>>
>> -----------------------
>> // needed to check for UTF8 string
>> MSStringMgr *strMgr = new MSStringMgr();
>>
>> // incoming reference
>> const char *cref = [reference UTF8String];
>> sword::VerseKey vk;
>> sword::ListKey listkey = vk.ParseVerseList(cref, vk, true);
>> // for the duration of this query be want the key to persist
>> listkey.Persist(true);
>> swModule->setKey(listkey);
>>
>> // iterate through keys
>> for ((*swModule) = sword::TOP; !swModule->Error(); (*swModule)++) {
>> const char *keyCStr = swModule->getKeyText();
>> const char *txtCStr = swModule->RenderText();
>> NSMutableDictionary *dict = [NSMutableDictionary
>> dictionaryWithCapacity:2];
>> NSString *key = @"";
>> NSString *txt = @"";
>> if(strMgr->isUtf8(txtCStr)) {
>> txt = [NSString stringWithUTF8String:txtCStr];
>> } else {
>> txt = [NSString stringWithCString:txtCStr
>> encoding:NSISOLatin1StringEncoding];
>> }
>>
>> if([self isUnicode]) {
>> key = [NSString stringWithUTF8String:keyCStr];
>> } else {
>> key = [NSString stringWithCString:keyCStr
>> encoding:NSISOLatin1StringEncoding];
>> }
>>
>> // add to dict
>> [dict setObject:txt forKey:SW_OUTPUT_TEXT_KEY];
>> [dict setObject:key forKey:SW_OUTPUT_REF_KEY];
>> // add to array
>> [ret addObject:dict];
>> }
>> // remove persitent key
>> swModule->setKey("gen.1.1");
>> ------------------------
>
> The above code still crashes for references that doesn't exist while the
> below code works everywhere and always.
>
>> This actually works but due to the problem with the locale and Umlauts
>> it crashes somewhere in the library in the head of the for loop
>> ((*swModule) = sword::TOP).
>>
>> I have some older code lying around (which actually is used in
>> MacSword 1.4.3 done by William) which I to be honest don't understand:
>>
>> --------------------------
>> sword::VerseKey vk;
>> int lastIndex;
>> ((sword::VerseKey*)(swModule->getKey()))->Headings(1);
>> sword::ListKey listkey = vk.ParseVerseList(toUTF8(reference),
>> "Gen1", true);
>> for (int i = 0; i < listkey.Count(); i++) {
>> sword::VerseKey *element = My_SWDYNAMIC_CAST(VerseKey,
>> listkey.GetElement(i));
>>
>> // is it a chapter or book - not atomic
>> if(element) {
>> swModule->Key(element->LowerBound());
>> // find the upper bound
>> vk = element->UpperBound();
>> vk.Headings(true);
>> } else {
>> // set it up
>> swModule->Key(*listkey.GetElement(i));
>> }
>>
>> // while not past the upper bound
>> do {
>> //add verse index to dictionary
>> char *ctxt = (char *)swModule->RenderText();
>> int clen = strlen(ctxt);
>> NSString *text = fromUTF8(ctxt);
>> NSString *verse = fromUTF8(swModule->Key().getText());
>>
>> // add to dict
>> NSMutableDictionary *dict = [NSMutableDictionary
>> dictionaryWithCapacity:2];
>> [dict setObject:text forKey:SW_OUTPUT_TEXT_KEY];
>> [dict setObject:verse forKey:SW_OUTPUT_REF_KEY];
>> // add to array
>> [ret addObject:dict];
>>
>> lastIndex = (swModule->Key()).Index();
>> (*swModule)++;
>> if(lastIndex == (swModule->Key()).Index())
>> break;
>> }while (element && swModule->Key() <= vk);
>> }
>> ---------------------
>> This code also has the locale problem but it doesn't crash.
>> The problem is however that I don't know the right way of pulling out
>> text and I don't really understand some portions of the above code.
>> These two loops really confuse me. I would be happy if someone could
>> tell me line by line what happens here.
>> I had the impression that actually the code above, which crashes, is
>> correct. But it seems, it is not.
>>
>>
>>
>> Regards,
>> Manfred
>>
>>
>> _______________________________________________
>> sword-devel mailing list: sword-devel at crosswire.org
>> http://www.crosswire.org/mailman/listinfo/sword-devel
>> Instructions to unsubscribe/change your settings at above page
>
>
> _______________________________________________
> sword-devel mailing list: sword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/sword-devel
> Instructions to unsubscribe/change your settings at above page
More information about the sword-devel
mailing list