Changes

Jump to: navigation, search

Zimlib

3,192 bytes added, 09:12, 13 November 2016
See also
ZIMlib The '''zimlib''' is the standard implementation of the [[ZIM file format|ZIM specification]]. It is a library which implements the access to read and write method for ZIM files. The zimlib is released under the [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPLv2 license terms]. Use libzim the zimlib in your own software - like reader applications - to make them ZIM-capable without the need having to dig too much into the ZIM file format. Have a look to the [[Releases]] or [[git]] pages to get more information about how to download it.
== Programming ==
=== Introduction ===zimlib is written in C++. To use the library, you need the include files of zimlib have to link against libzimzimlib. Both are installed when zimlib is built with the normal "(<tt>./autogen.sh; ./configure; make; make install"</tt>).
Errors are handled with exceptions. When something goes wrong, zimlib throws an error, which is always derived from std::exception.
#include <zim/fileiterator.h>
#include <iostream>
 
int main(int argc, char* argv[])
{
You may save that file under the name "zimlist.cpp" and compile using the command:
'''<tt>g++ -o zimlist -lzim zimlist.cpp</tt>'''. You get a program, which lists the urls and titles of the file named ''wikipedia.zim''. Of course it is better to pass that name as a parameter in argc/argv. But this should be an easy task for you, so I do not show that.
In subsequent examples I show only the code needed to use the library. The main-function with the error catcher should always be in place.
Articles are addressed either by index or by namespace and url or title. The index is normally not that useful. So let us look how to find a specific article.
''zim::File'' has methods ''find'' and ''findByTitle''. Both take 2 parameters. A char for the namespace (which is normally 'A' for articles) and a string, which specifies the url (in find) or the title (in findByTitle). It returns a const_iterator pointing to the lexicographically next article. Be aware, that the returned iterator may point to end(), so you should check that, before dereferencing the iterator. I should add, that both - the url and title - are case sensitive.
;Sample: find a article by title and print the content:
</source>
''find'' and ''findByTitle'' return the lexicographically next article. If you whan to know, if you really got exactly the article you requested, you may either compare the url (or title) to the parameter or use ''findx'' or ''findxByTitle''. Both return a std::pair, with the first element a bool, which is true, if a exact match was found and false otherwise. The second element is the actual iterator, as returned by ''find'' or ''findByTitle''. The latter are actually only wrappers around the ''findx''-methods throwing away the flag. If the flag is true, the iterator does point to a article. It is not necessary to check against end() any more. ;Sample: find the exact article by url<source lang=c>std::pair<bool, zim::File::const_iterator> it = file.findxByTitle('A', "Wikipedia");if (!it.first) throw std::runtime_error("article not found");if (it->isRedirect()) std::cout << "see: " << it->getRedirectArticle().getTitle() << std::endl;else std::cout << it->getData();</source> == using the Search-class == The class ''zim::Search'' adds 2 search features to zimlib. Both fill a result object of type zim::Search::Results. This result object is actually a ''std::vector'' of a ''zim::SearchResult''. The ''zim::SearchResult'' holds a article and a priority. Since copying large result sets is quite expensive, all search methods of this expects a reference to a existing ''zim::Search::Results'', which is filled. The simpler searches articles by title either by a praefix or by a range of titles. You pass a namespace and either a single ''std::string'' and you get all articles, whose title starts with that string or you pass two strings and you get all articles whose title is between these strings (including the passed strings). The method zim::Search::search implements a full text search. For that it needs the full text index file. The full text index file is also a zim file, so you pass the index file as second paramter of type zim::File. The search-method is then called with the SearchResults-reference and a string, containing a space delimited list of words. The full text search then returns a list of articles where at least one of the words is found. Each article is weighted and the result is sorted by weight starting with the highest weighted article. == Methods ======zim::file::const_iterator = Article Filezim::file::getArticlefindx(char ns, const QUnicodeStringstd::string& title, bool collate ) ===returns an iterator to the article named ''title'' in namespace ''ns'' === zim::file::const_iterator = zim::file::findx(const std::string& url) === falsereturns an iterator to the article with the (non-encoded) URL ''url'' === std::string = zim::urldecode(const std::string& url) ===returns an object of an articleURL-decoded string for use in findx() == Requirements ==If you compile the software from source you need the following libraries installed:* libxz-dev* autoconf* automake* libtool
==See also == std::string Article::getPage(bool layout = true, unsigned maxRecurse = 10) ====returns * [[Releases]]* [[Bindings]]* [[Readers]]* [[zimwriterdb]]* [[zimdump]]* [[Git|Get the content of an articlesource code]]* in [https://tracker.debian.org/pkg/zimlib Debian]

Navigation menu