[sword-devel] Behavior of SWModule::getConfigEntry in case of multiple entries with same key

Tobias Klein contact at tklein.info
Sun May 5 09:12:56 MST 2019


Hi Troy,

I think the usecase I mentioned is maybe most relevant when installing 
modules.

Well, I'm generating a table like this as meta information for bible 
translation modules:

Name: 	engNET2016eb
Version: 	25.2
Language: 	English
Strong's: 	Yes
Headings: 	Yes
Footnotes: 	No
Cross references: 	No
Red letter words: 	No
Size: 	3628 KB


So this is sort of a human-readable version of the module's conf file.

I just implemented a method to query on this type of information - based 
on your earlier tip. I guess something like this could be integrated in 
the Sword API to make it more accessible/convenient.

bool moduleHasGlobalOption(SWModule* module, string globalOption)
{
     bool hasGlobalOption = false;
     ConfigEntMap::const_iterator it = 
module->getConfig().lower_bound("GlobalOptionFilter");
     ConfigEntMap::const_iterator end = 
module->getConfig().upper_bound("GlobalOptionFilter");

     for(; it !=end; ++it) {
         string currentOption = string(it->second.c_str());
         if (currentOption.find(globalOption) != string::npos) {
             hasGlobalOption = true;
             break;
         }
     }

     return hasGlobalOption;
}

I don't actually need additional Sword API features for toggling markup, 
only to retrieve the meta information for the modules.

Best regards,
Tobias

On 05.05.19 17:31, Troy A. Griffitts wrote:
>
> Hi Tobias,
>
> Yeah, so in my frontends, I usually just have a toolbar or option menu 
> which has associated buttons or menu checkbox toggles for any options 
> available in the installed module set, which can be obtained, along 
> with suggested option names, tooltips, options value (if more than 
> simply On and Off are available) with the code Peter sent.
>
> I know at least Bibletime, at one point and probably still, lists the 
> options per modules.
>
> My usecase is typically: I want to toggle Strongs and Morphology for a 
> second while I do a word study; I want to turn footnotes on or off, 
> etc.  I typically don't care if it is done for one particular module.  
> I just want them either on or off.
>
> But, I understand others have different study habits and that is why 
> we have different user interfaces.
>
> So, having said all this... SWModule::optionFilters will give you a 
> list<OptionFilter *> for any module.  The problem right now is that 
> this property is protected.  You would need to expose this in a 
> derived class and override SWMgr::createModule to construct your 
> derived class instead of the ones created in the default 
> implementation.  That would suck and isn't the path I would want you 
> to go down.
>
> So, I can add a public getOptionsFilters() method for you to access 
> this, if you really wish to know exactly which option filters are 
> available on a per module basis.  That's simple and would help other 
> who wish to show per module options.
>
> There is one caveat though, the default implementation of 
> SWMgr::addGlobalOptionFilters only constructs one instance of each 
> type of filter and reuses it for all modules which want that same 
> filter.  This is how, e.g., toggling Strongs numbers toggles it for 
> all modules.  If you indeed wish to allow toggling of an option for a 
> single module, but not others, then you'd want to override 
> SWMgr::addGlobalOptionFilters and make it work more like 
> SWMgr::addLocalOptionFilters, which constructs an instance of the 
> filter for each module, and thus would allow you to toggle one option 
> for a module and not affect that same logical option class for any 
> other module.
>
> Hope this is helpful,
>
> Troy
>
>
> On 5/5/19 7:56 AM, Tobias Klein wrote:
>>
>> Hi Troy, Peter,
>>
>> Thank you! My usecase is to list the options available for one 
>> particular (bible translation) module.
>>
>> @Troy: The solution you suggested is probably what I need. Or are 
>> there better solutions based on my usecase mentioned above?
>>
>> Best regards,
>> Tobias
>>
>> On 05.05.19 15:41, Troy A. Griffitts wrote:
>>> While Peter is correct about how to find all the options that any 
>>> loaded module might allow for toggling by an end user... and if this 
>>> is your purpose, you should certainly use the methods Peter 
>>> suggested... your question as to more generally how to read config 
>>> entries which have the same key values is answered by how to iterate 
>>> a multimap in C++. SWModule::getConfig returns the full multimap of 
>>> config entries. Something like this should work:Hi
>>>
>>> ConfigEntMap::const_iterator begin = 
>>> module->getConfig().lower_bound("Key");
>>> ConfigEntMap::const_iterator end = 
>>> module->getConfig().upper_bound("Key");
>>>
>>> for(; begin !=end; ++begin) {
>>> cout << begin->first.c_str() << " = " << begin->second.c_str() << endl;
>>> }
>>>
>>> But I've never needed to do this as a client of the library. Maybe 
>>> if you tell us your use case, we can recommend a facility in the 
>>> system which might make things easier for you.
>>>
>>> Troy
>>>
>>> On May 5, 2019 2:04:11 AM MST, Peter von Kaehne <refdoc at gmx.net> wrote:
>>>
>>>     On Sun, 2019-05-05 at 08:49 +0200, Tobias Klein wrote:
>>>
>>>         Hi, how is SWModule::getConfigEntry(const char *key)
>>>         supposed to behave when there are multiple entries with the
>>>         same key? 
>>>
>>>
>>>     There is a set of separate methods for those.
>>>
>>>     Check out ./examples/cmdline/listoptions.cpp
>>>
>>>         { SWMgr library; StringList options =
>>>         library.getGlobalOptions(); for (StringList::const_iterator
>>>         it = options.begin(); it != options.end(); ++it) { cout <<
>>>         *it << " (" << library.getGlobalOptionTip(*it) << ")\n";
>>>         StringList optionValues =
>>>         library.getGlobalOptionValues(*it); for
>>>         (StringList::const_iterator it2 = optionValues.begin(); it2
>>>         != optionValues.end(); ++it2) { cout << "\t" << *it2 <<
>>>         "\n"; } } 
>>>
>>>     ------------------------------------------------------------------------
>>>     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
>>>
>>>
>>> -- 
>>> Sent from my Android device with K-9 Mail. Please excuse my brevity.
>>>
>>> _______________________________________________
>>> 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
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/sword-devel/attachments/20190505/61a42601/attachment-0001.html>


More information about the sword-devel mailing list