From 5d5de516e47c182d01976c62134da6ba8be76a0b Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Mon, 14 Sep 2015 09:51:11 +0200 Subject: [PATCH] more filter conversion to python: svg and xml. Get rid of rclnull --- .hgignore | 122 + packaging/FreeBSD/recoll/Makefile | 34 + packaging/FreeBSD/recoll/distinfo | 2 + packaging/FreeBSD/recoll/pkg-descr | 24 + packaging/FreeBSD/recoll/pkg-plist | 100 + packaging/debian/buildppa.sh | 180 + packaging/debian/debian/README.Debian | 23 + packaging/debian/debian/changelog | 579 + packaging/debian/debian/compat | 1 + packaging/debian/debian/control | 85 + packaging/debian/debian/copyright | 219 + .../debian/patches/fix-python-install.patch | 10 + packaging/debian/debian/patches/series | 1 + packaging/debian/debian/python-recoll.install | 2 + .../debian/debian/python3-recoll.install | 2 + packaging/debian/debian/recoll.install | 12 + packaging/debian/debian/recoll.menu | 2 + packaging/debian/debian/rules | 86 + packaging/debian/debian/source/format | 1 + packaging/debian/debian/watch | 2 + packaging/debian/debiankio/changelog | 92 + packaging/debian/debiankio/compat | 1 + packaging/debian/debiankio/control | 32 + packaging/debian/debiankio/copyright | 113 + packaging/debian/debiankio/dirs | 2 + packaging/debian/debiankio/docs | 1 + .../patches/fix-cmake-build-parser.patch | 21 + packaging/debian/debiankio/patches/series | 1 + packaging/debian/debiankio/rules | 6 + packaging/debian/debiankio/source/format | 1 + packaging/debian/debiankio/watch | 4 + packaging/debian/debianunitylens/changelog | 30 + packaging/debian/debianunitylens/compat | 1 + packaging/debian/debianunitylens/control | 18 + packaging/debian/debianunitylens/copyright | 20 + packaging/debian/debianunitylens/docs | 1 + packaging/debian/debianunitylens/rules | 52 + packaging/debian/debianunitylens/watch | 12 + packaging/homebrew/00README.txt | 10 + packaging/homebrew/recoll.rb | 35 + packaging/macports/README.txt | 24 + packaging/macports/textproc/recoll/Portfile | 45 + .../files/patch-sampleconf-mimeview.diff | 147 + packaging/rpm/kio_recoll.spec | 77 + packaging/rpm/recoll-mageia.spec | 75 + packaging/rpm/recoll.spec | 224 + packaging/rpm/recollCooker.spec | 88 + packaging/rpm/recollfedora.spec | 224 + packaging/rpm/recollmdk.spec | 130 + src/COPYING | 340 + src/ChangeLog | 10552 +++++ src/INSTALL | 1348 + src/Makefile.am | 570 + src/README | 4612 ++ src/VERSION | 1 + src/aspell/Makefile | 12 + src/aspell/aspell-local.h | 729 + src/aspell/rclaspell.cpp | 586 + src/aspell/rclaspell.h | 79 + src/autogen.sh | 4 + src/bincimapmime/00README.recoll | 3 + src/bincimapmime/AUTHORS | 45 + src/bincimapmime/COPYING | 356 + src/bincimapmime/Makefile | 11 + src/bincimapmime/config.h | 0 src/bincimapmime/convert.cc | 133 + src/bincimapmime/convert.h | 316 + src/bincimapmime/mime-inputsource.h | 222 + src/bincimapmime/mime-parsefull.cc | 629 + src/bincimapmime/mime-parseonlyheader.cc | 193 + src/bincimapmime/mime-printbody.cc | 52 + src/bincimapmime/mime-utils.h | 55 + src/bincimapmime/mime.cc | 168 + src/bincimapmime/mime.h | 191 + src/bincimapmime/trbinc.cc | 126 + src/common/Makefile | 33 + src/common/autoconfig-win.h | 186 + src/common/autoconfig.h.in | 181 + src/common/beaglequeuecache.cpp | 95 + src/common/beaglequeuecache.h | 50 + src/common/conf_post.h | 67 + src/common/cstr.cpp | 6 + src/common/cstr.h | 86 + src/common/rclconfig.cpp | 1680 + src/common/rclconfig.h | 407 + src/common/rclinit.cpp | 282 + src/common/rclinit.h | 60 + src/common/rclversion.h.in | 1 + src/common/syngroups.cpp | 248 + src/common/syngroups.h | 41 + src/common/textsplit.cpp | 1239 + src/common/textsplit.h | 225 + src/common/unacpp.cpp | 249 + src/common/unacpp.h | 40 + src/common/uproplist.h | 202 + src/configure.ac | 590 + src/desktop/hotrecoll.py | 66 + src/desktop/recoll-searchgui.desktop | 10 + src/desktop/recoll.appdata.xml | 24 + src/desktop/recoll.png | Bin 0 -> 457 bytes src/desktop/recoll.svg | 275 + src/desktop/recoll.xcf | Bin 0 -> 3825 bytes src/desktop/recoll_index_on_ac.sh | 69 + src/desktop/recollindex.desktop | 13 + src/desktop/xdg-utils-1.0.1/LICENSE | 18 + .../xdg-utils-1.0.1/scripts/xdg-desktop-menu | 1261 + .../xdg-utils-1.0.1/scripts/xdg-icon-resource | 837 + src/desktop/xdg-utils-1.0.1/scripts/xdg-open | 436 + src/doc/man/recoll.1 | 99 + src/doc/man/recoll.conf.5 | 369 + src/doc/man/recollindex.1 | 293 + src/doc/man/recollq.1 | 148 + src/doc/prog/Doxyfile | 1212 + src/doc/prog/Makefile | 5 + src/doc/prog/filters.txt | 47 + src/doc/prog/top.txt | 20 + src/doc/user/00README.txt | 30 + src/doc/user/Makefile | 38 + src/doc/user/docbook-xsl.css | 212 + src/doc/user/docbook.css | 208 + src/doc/user/usermanual-italian.html | 3849 ++ src/doc/user/usermanual.xml | 6562 +++ src/filters/injectcommon.sh | 15 + src/filters/msodump.zip | Bin 0 -> 115355 bytes src/filters/ppt-dump.py | 139 + src/filters/rcl7z | 127 + src/filters/rclabw | 179 + src/filters/rclaptosidman | 93 + src/filters/rclaudio | 113 + src/filters/rclcheckneedretry.sh | 41 + src/filters/rclchm | 338 + src/filters/rcldia | 110 + src/filters/rcldjvu | 180 + src/filters/rcldoc | 176 + src/filters/rcldoc.py | 165 + src/filters/rcldvi | 150 + src/filters/rclepub | 107 + src/filters/rclexec1.py | 107 + src/filters/rclexecm.py | 356 + src/filters/rclfb2 | 139 + src/filters/rclgaim | 144 + src/filters/rclgnm | 191 + src/filters/rclics | 168 + src/filters/rclimg | 184 + src/filters/rclinfo | 217 + src/filters/rclkar | 322 + src/filters/rclkwd | 217 + src/filters/rcllatinclass.py | 123 + src/filters/rcllatinstops.zip | Bin 0 -> 12689 bytes src/filters/rcllyx | 243 + src/filters/rclman | 127 + src/filters/rclmpdf | 237 + src/filters/rclokulnote | 130 + src/filters/rclopxml | 238 + src/filters/rclopxml.py | 224 + src/filters/rclpdf | 351 + src/filters/rclppt | 110 + src/filters/rclps | 135 + src/filters/rclpurple | 181 + src/filters/rclpython | 236 + src/filters/rclrar | 118 + src/filters/rclrtf | 102 + src/filters/rclrtf.py | 56 + src/filters/rclscribus | 190 + src/filters/rclshowinfo | 32 + src/filters/rclsiduxman | 92 + src/filters/rclsoff | 225 + src/filters/rclsoff.py | 189 + src/filters/rclsvg | 161 + src/filters/rclsvg.py | 140 + src/filters/rcltar | 88 + src/filters/rcltex | 102 + src/filters/rcltext | 91 + src/filters/rcltext.py | 51 + src/filters/rcluncomp | 46 + src/filters/rclwar | 59 + src/filters/rclwpd | 87 + src/filters/rclxls | 116 + src/filters/rclxml | 119 + src/filters/rclxml.py | 98 + src/filters/rclxslt.py | 52 + src/filters/rclzip | 154 + src/filters/recfiltcommon | 66 + src/filters/xls-dump.py | 248 + src/filters/xlsxmltocsv.py | 56 + src/index/Makefile | 18 + src/index/beaglequeue.cpp | 484 + src/index/beaglequeue.h | 81 + src/index/bglfetcher.cpp | 64 + src/index/bglfetcher.h | 30 + src/index/checkretryfailed.cpp | 54 + src/index/checkretryfailed.h | 33 + src/index/fetcher.cpp | 44 + src/index/fetcher.h | 76 + src/index/fsfetcher.cpp | 73 + src/index/fsfetcher.h | 34 + src/index/fsindexer.cpp | 892 + src/index/fsindexer.h | 162 + src/index/indexer.cpp | 363 + src/index/indexer.h | 156 + src/index/mimetype.cpp | 227 + src/index/mimetype.h | 39 + src/index/rclmon.h | 115 + src/index/rclmon.sh | 80 + src/index/rclmonprc.cpp | 618 + src/index/rclmonrcv.cpp | 755 + src/index/recollindex.cpp | 716 + src/index/recollindex.h | 31 + src/index/subtreelist.cpp | 131 + src/index/subtreelist.h | 33 + src/internfile/Filter.h | 206 + src/internfile/Makefile | 20 + src/internfile/extrameta.cpp | 148 + src/internfile/extrameta.h | 49 + src/internfile/htmlparse.cpp | 396 + src/internfile/htmlparse.h | 52 + src/internfile/indextext.h | 38 + src/internfile/internfile.cpp | 1224 + src/internfile/internfile.h | 297 + src/internfile/mh_exec.cpp | 196 + src/internfile/mh_exec.h | 90 + src/internfile/mh_execm.cpp | 318 + src/internfile/mh_execm.h | 125 + src/internfile/mh_html.cpp | 183 + src/internfile/mh_html.h | 58 + src/internfile/mh_mail.cpp | 658 + src/internfile/mh_mail.h | 84 + src/internfile/mh_mbox.cpp | 683 + src/internfile/mh_mbox.h | 59 + src/internfile/mh_null.h | 59 + src/internfile/mh_symlink.h | 74 + src/internfile/mh_text.cpp | 200 + src/internfile/mh_text.h | 67 + src/internfile/mh_unknown.h | 58 + src/internfile/mimehandler.cpp | 384 + src/internfile/mimehandler.h | 174 + src/internfile/myhtmlparse.cpp | 594 + src/internfile/myhtmlparse.h | 72 + src/internfile/txtdcode.cpp | 79 + src/internfile/uncomp.cpp | 144 + src/internfile/uncomp.h | 68 + src/kde/kioslave/kio_recoll/00README.txt | 94 + src/kde/kioslave/kio_recoll/CMakeLists.txt | 75 + src/kde/kioslave/kio_recoll/Makefile.kde3 | 59 + .../kioslave/kio_recoll/cleancmakestuff.sh | 6 + src/kde/kioslave/kio_recoll/data/help.html | 100 + .../kioslave/kio_recoll/data/searchable.html | 28 + src/kde/kioslave/kio_recoll/data/welcome.html | 29 + src/kde/kioslave/kio_recoll/dirif.cpp | 318 + src/kde/kioslave/kio_recoll/htmlif.cpp | 301 + src/kde/kioslave/kio_recoll/kio_recoll.cpp | 381 + src/kde/kioslave/kio_recoll/kio_recoll.h | 191 + src/kde/kioslave/kio_recoll/kio_recoll.la | 35 + src/kde/kioslave/kio_recoll/notes.txt | 188 + src/kde/kioslave/kio_recoll/recoll.protocol | 11 + src/kde/kioslave/kio_recoll/recollf.protocol | 11 + .../kioslave/kio_recoll/recollnolist.protocol | 11 + src/kde/recoll_applet/0README.Recoll | 19 + src/kde/recoll_applet/AUTHORS | 2 + src/kde/recoll_applet/COPYING | 340 + src/kde/recoll_applet/ChangeLog | 0 src/kde/recoll_applet/Doxyfile | 283 + src/kde/recoll_applet/INSTALL | 167 + src/kde/recoll_applet/Makefile.am | 22 + src/kde/recoll_applet/Makefile.cvs | 10 + src/kde/recoll_applet/Makefile.in | 877 + src/kde/recoll_applet/NEWS | 0 src/kde/recoll_applet/README | 0 src/kde/recoll_applet/TODO | 0 src/kde/recoll_applet/acinclude.m4 | 11862 ++++++ src/kde/recoll_applet/aclocal.m4 | 863 + src/kde/recoll_applet/admin/Doxyfile.am | 102 + src/kde/recoll_applet/admin/Doxyfile.global | 192 + src/kde/recoll_applet/admin/Makefile.common | 37 + src/kde/recoll_applet/admin/acinclude.m4.in | 5971 +++ src/kde/recoll_applet/admin/am_edit | 2445 ++ src/kde/recoll_applet/admin/bcheck.pl | 157 + src/kde/recoll_applet/admin/compile | 142 + src/kde/recoll_applet/admin/conf.change.pl | 191 + src/kde/recoll_applet/admin/config.guess | 1519 + src/kde/recoll_applet/admin/config.pl | 238 + src/kde/recoll_applet/admin/config.sub | 1626 + .../recoll_applet/admin/configure.in.bot.end | 45 + src/kde/recoll_applet/admin/configure.in.min | 57 + src/kde/recoll_applet/admin/cvs.sh | 661 + src/kde/recoll_applet/admin/debianrules | 43 + src/kde/recoll_applet/admin/depcomp | 530 + src/kde/recoll_applet/admin/deps.am | 19 + .../recoll_applet/admin/detect-autoconf.pl | 173 + src/kde/recoll_applet/admin/doxygen.sh | 883 + src/kde/recoll_applet/admin/install-sh | 401 + src/kde/recoll_applet/admin/libtool.m4.in | 5891 +++ src/kde/recoll_applet/admin/ltmain.sh | 6468 +++ src/kde/recoll_applet/admin/missing | 353 + src/kde/recoll_applet/admin/mkinstalldirs | 158 + src/kde/recoll_applet/admin/nmcheck | 371 + src/kde/recoll_applet/admin/oldinclude.m4.in | 192 + src/kde/recoll_applet/admin/pkg.m4.in | 57 + src/kde/recoll_applet/admin/ylwrap | 223 + src/kde/recoll_applet/config.h.in | 244 + src/kde/recoll_applet/configure | 34897 ++++++++++++++++ src/kde/recoll_applet/configure.files | 2 + src/kde/recoll_applet/configure.in | 123 + src/kde/recoll_applet/configure.in.in | 6 + src/kde/recoll_applet/doc/Makefile.am | 6 + src/kde/recoll_applet/doc/Makefile.in | 720 + src/kde/recoll_applet/doc/en/Makefile.am | 2 + src/kde/recoll_applet/doc/en/Makefile.in | 598 + src/kde/recoll_applet/doc/en/index.docbook | 555 + src/kde/recoll_applet/po/Makefile.am | 1 + src/kde/recoll_applet/po/Makefile.in | 549 + src/kde/recoll_applet/src/Makefile.am | 16 + src/kde/recoll_applet/src/Makefile.in | 780 + src/kde/recoll_applet/src/kpixmapcombo.cpp | 60 + src/kde/recoll_applet/src/kpixmapcombo.h | 52 + src/kde/recoll_applet/src/recoll_applet.cpp | 190 + .../recoll_applet/src/recoll_applet.desktop | 7 + src/kde/recoll_applet/src/recoll_applet.h | 108 + src/kde/recoll_applet/src/recoll_applet.lsm | 16 + src/kde/recoll_applet/stamp-h.in | 0 src/kde/recoll_applet/subdirs | 3 + src/php/00README.txt | 22 + src/php/recoll/config.m4 | 18 + src/php/recoll/make.sh | 14 + src/php/recoll/php_recoll.h | 18 + src/php/recoll/recoll.cpp | 240 + src/php/sample/shell.php | 31 + src/python/README.txt | 2 + src/python/recoll/Makefile | 11 + src/python/recoll/pyrclextract.cpp | 361 + src/python/recoll/pyrecoll.cpp | 2094 + src/python/recoll/pyrecoll.h | 33 + src/python/recoll/recoll/__init__.py | 0 src/python/recoll/recoll/rclconfig.py | 205 + src/python/recoll/setup.py.in | 67 + src/python/samples/docdups.py | 116 + src/python/samples/mutt-recoll.py | 112 + src/python/samples/rcldlkp.py | 117 + src/python/samples/rclmbox.py | 118 + src/python/samples/recollgui/Makefile | 7 + src/python/samples/recollgui/qrecoll.py | 278 + src/python/samples/recollgui/rclmain.ui | 127 + src/python/samples/recollq.py | 137 + src/python/samples/recollqsd.py | 43 + src/python/samples/trconfig.py | 47 + src/qtgui/advsearch.ui | 578 + src/qtgui/advsearch_w.cpp | 571 + src/qtgui/advsearch_w.h | 83 + src/qtgui/advshist.cpp | 96 + src/qtgui/advshist.h | 64 + src/qtgui/confgui/confgui.cpp | 466 + src/qtgui/confgui/confgui.h | 254 + src/qtgui/confgui/confguiindex.cpp | 608 + src/qtgui/confgui/confguiindex.h | 107 + src/qtgui/confgui/conflinkrcl.h | 69 + src/qtgui/confgui/main.cpp | 132 + src/qtgui/confgui/trconf.pro | 32 + src/qtgui/crontool.cpp | 102 + src/qtgui/crontool.h | 48 + src/qtgui/crontool.ui | 156 + src/qtgui/editdialog.h | 35 + src/qtgui/editdialog.ui | 67 + src/qtgui/firstidx.h | 32 + src/qtgui/firstidx.ui | 147 + src/qtgui/fragbuts.cpp | 215 + src/qtgui/fragbuts.h | 68 + src/qtgui/guiutils.cpp | 443 + src/qtgui/guiutils.h | 171 + src/qtgui/i18n/recoll_cs.qm | Bin 0 -> 91428 bytes src/qtgui/i18n/recoll_cs.ts | 3090 ++ src/qtgui/i18n/recoll_da.qm | Bin 0 -> 99874 bytes src/qtgui/i18n/recoll_da.ts | 2500 ++ src/qtgui/i18n/recoll_de.qm | Bin 0 -> 94186 bytes src/qtgui/i18n/recoll_de.ts | 3071 ++ src/qtgui/i18n/recoll_el.qm | Bin 0 -> 97509 bytes src/qtgui/i18n/recoll_el.ts | 2753 ++ src/qtgui/i18n/recoll_es.qm | Bin 0 -> 94632 bytes src/qtgui/i18n/recoll_es.ts | 2845 ++ src/qtgui/i18n/recoll_fr.qm | Bin 0 -> 105807 bytes src/qtgui/i18n/recoll_fr.ts | 3203 ++ src/qtgui/i18n/recoll_it.qm | Bin 0 -> 27756 bytes src/qtgui/i18n/recoll_it.ts | 2811 ++ src/qtgui/i18n/recoll_lt.qm | Bin 0 -> 34438 bytes src/qtgui/i18n/recoll_lt.ts | 2945 ++ src/qtgui/i18n/recoll_pl.qm | Bin 0 -> 92943 bytes src/qtgui/i18n/recoll_pl.ts | 2266 + src/qtgui/i18n/recoll_ru.qm | Bin 0 -> 88743 bytes src/qtgui/i18n/recoll_ru.ts | 3125 ++ src/qtgui/i18n/recoll_tr.qm | Bin 0 -> 26030 bytes src/qtgui/i18n/recoll_tr.ts | 2811 ++ src/qtgui/i18n/recoll_uk.qm | Bin 0 -> 29571 bytes src/qtgui/i18n/recoll_uk.ts | 2856 ++ src/qtgui/i18n/recoll_xx.qm | 1 + src/qtgui/i18n/recoll_xx.ts | 2342 ++ src/qtgui/i18n/recoll_zh.qm | Bin 0 -> 69709 bytes src/qtgui/i18n/recoll_zh.ts | 2795 ++ src/qtgui/i18n/recoll_zh_CN.qm | Bin 0 -> 82629 bytes src/qtgui/i18n/recoll_zh_CN.ts | 2829 ++ src/qtgui/idxsched.h | 37 + src/qtgui/idxsched.ui | 120 + src/qtgui/images/asearch.png | Bin 0 -> 1007 bytes src/qtgui/images/cancel.png | Bin 0 -> 883 bytes src/qtgui/images/close.png | Bin 0 -> 1119 bytes src/qtgui/images/code-block.png | Bin 0 -> 512 bytes src/qtgui/images/down.png | Bin 0 -> 3568 bytes src/qtgui/images/firstpage.png | Bin 0 -> 1324 bytes src/qtgui/images/history.png | Bin 0 -> 1515 bytes src/qtgui/images/nextpage.png | Bin 0 -> 1281 bytes src/qtgui/images/prevpage.png | Bin 0 -> 1282 bytes src/qtgui/images/recoll.icns | Bin 0 -> 9078 bytes src/qtgui/images/recoll.png | Bin 0 -> 457 bytes src/qtgui/images/sortparms.png | Bin 0 -> 768 bytes src/qtgui/images/spell.png | Bin 0 -> 339 bytes src/qtgui/images/table.png | Bin 0 -> 3351 bytes src/qtgui/images/up.png | Bin 0 -> 3510 bytes src/qtgui/listdialog.h | 32 + src/qtgui/listdialog.ui | 79 + src/qtgui/main.cpp | 401 + src/qtgui/mtpics/License_sidux.txt | 22 + src/qtgui/mtpics/README | 8 + src/qtgui/mtpics/aptosid-book.png | Bin 0 -> 4488 bytes src/qtgui/mtpics/aptosid-manual-copyright.txt | 306 + src/qtgui/mtpics/aptosid-manual.png | Bin 0 -> 4488 bytes src/qtgui/mtpics/archive.png | Bin 0 -> 3868 bytes src/qtgui/mtpics/book.png | Bin 0 -> 4784 bytes src/qtgui/mtpics/bookchap.png | Bin 0 -> 2943 bytes src/qtgui/mtpics/document.png | Bin 0 -> 5394 bytes src/qtgui/mtpics/drawing.png | Bin 0 -> 5195 bytes src/qtgui/mtpics/emblem-symbolic-link.png | Bin 0 -> 1891 bytes src/qtgui/mtpics/folder.png | Bin 0 -> 6043 bytes src/qtgui/mtpics/html.png | Bin 0 -> 4848 bytes src/qtgui/mtpics/image.png | Bin 0 -> 4345 bytes src/qtgui/mtpics/message.png | Bin 0 -> 4362 bytes src/qtgui/mtpics/mozilla_doc.png | Bin 0 -> 4442 bytes src/qtgui/mtpics/pdf.png | Bin 0 -> 3753 bytes src/qtgui/mtpics/pidgin.png | Bin 0 -> 3564 bytes src/qtgui/mtpics/postscript.png | Bin 0 -> 3235 bytes src/qtgui/mtpics/presentation.png | Bin 0 -> 3639 bytes src/qtgui/mtpics/sidux-book.png | Bin 0 -> 1835 bytes src/qtgui/mtpics/soffice.png | Bin 0 -> 5376 bytes src/qtgui/mtpics/source.png | Bin 0 -> 4126 bytes src/qtgui/mtpics/sownd.png | Bin 0 -> 4756 bytes src/qtgui/mtpics/spreadsheet.png | Bin 0 -> 3382 bytes src/qtgui/mtpics/text-x-python.png | Bin 0 -> 3788 bytes src/qtgui/mtpics/txt.png | Bin 0 -> 2912 bytes src/qtgui/mtpics/video.png | Bin 0 -> 4892 bytes src/qtgui/mtpics/wordprocessing.png | Bin 0 -> 5664 bytes src/qtgui/multisave.cpp | 143 + src/qtgui/multisave.h | 24 + src/qtgui/preview_w.cpp | 1233 + src/qtgui/preview_w.h | 191 + src/qtgui/ptrans.ui | 142 + src/qtgui/ptrans_w.cpp | 134 + src/qtgui/ptrans_w.h | 52 + src/qtgui/rclhelp.cpp | 73 + src/qtgui/rclhelp.h | 40 + src/qtgui/rclm_idx.cpp | 302 + src/qtgui/rclm_preview.cpp | 259 + src/qtgui/rclm_saveload.cpp | 134 + src/qtgui/rclm_view.cpp | 445 + src/qtgui/rclm_wins.cpp | 389 + src/qtgui/rclmain.ui | 522 + src/qtgui/rclmain_w.cpp | 1104 + src/qtgui/rclmain_w.h | 246 + src/qtgui/rclzg.cpp | 84 + src/qtgui/rclzg.h | 30 + src/qtgui/recoll.h | 57 + src/qtgui/recoll.pro.in | 172 + src/qtgui/recoll.qrc | 18 + src/qtgui/reslist.cpp | 1123 + src/qtgui/reslist.h | 154 + src/qtgui/respopup.cpp | 177 + src/qtgui/respopup.h | 32 + src/qtgui/restable.cpp | 1022 + src/qtgui/restable.h | 185 + src/qtgui/restable.ui | 71 + src/qtgui/rtitool.cpp | 176 + src/qtgui/rtitool.h | 41 + src/qtgui/rtitool.ui | 123 + src/qtgui/searchclause_w.cpp | 222 + src/qtgui/searchclause_w.h | 54 + src/qtgui/snippets.ui | 143 + src/qtgui/snippets_w.cpp | 265 + src/qtgui/snippets_w.h | 58 + src/qtgui/spell.ui | 149 + src/qtgui/spell_w.cpp | 471 + src/qtgui/spell_w.h | 58 + src/qtgui/ssearch_w.cpp | 758 + src/qtgui/ssearch_w.h | 98 + src/qtgui/ssearchb.ui | 105 + src/qtgui/systray.cpp | 42 + src/qtgui/systray.h | 42 + src/qtgui/ui_rclmain.h-4.5 | 302 + src/qtgui/uiprefs.ui | 972 + src/qtgui/uiprefs_w.cpp | 616 + src/qtgui/uiprefs_w.h | 85 + src/qtgui/viewaction.ui | 208 + src/qtgui/viewaction_w.cpp | 235 + src/qtgui/viewaction_w.h | 57 + src/qtgui/xmltosd.cpp | 345 + src/qtgui/xmltosd.h | 77 + src/query/docseq.cpp | 130 + src/query/docseq.h | 294 + src/query/docseqdb.cpp | 250 + src/query/docseqdb.h | 76 + src/query/docseqdocs.h | 70 + src/query/docseqhist.cpp | 165 + src/query/docseqhist.h | 69 + src/query/dynconf.cpp | 213 + src/query/dynconf.h | 157 + src/query/filtseq.cpp | 125 + src/query/filtseq.h | 48 + src/query/location.hh | 187 + src/query/plaintorich.cpp | 546 + src/query/plaintorich.h | 106 + src/query/position.hh | 180 + src/query/recollq.cpp | 416 + src/query/recollq.h | 26 + src/query/recollqmain.cpp | 30 + src/query/reslistpager.cpp | 531 + src/query/reslistpager.h | 136 + src/query/sortseq.cpp | 76 + src/query/sortseq.h | 49 + src/query/stack.hh | 158 + src/query/wasaparse.cpp | 1517 + src/query/wasaparse.hpp | 476 + src/query/wasaparse.ypp | 433 + src/query/wasaparseaux.cpp | 235 + src/query/wasaparserdriver.h | 81 + src/query/wasatorcl.h | 34 + src/query/xadump.cpp | 342 + src/rcldb/Makefile | 21 + src/rcldb/daterange.cpp | 126 + src/rcldb/daterange.h | 10 + src/rcldb/expansiondbs.cpp | 154 + src/rcldb/expansiondbs.h | 70 + src/rcldb/rclabstract.cpp | 620 + src/rcldb/rcldb.cpp | 2218 + src/rcldb/rcldb.h | 548 + src/rcldb/rcldb_p.h | 183 + src/rcldb/rcldoc.cpp | 74 + src/rcldb/rcldoc.h | 302 + src/rcldb/rcldups.cpp | 115 + src/rcldb/rclquery.cpp | 505 + src/rcldb/rclquery.h | 159 + src/rcldb/rclquery_p.h | 72 + src/rcldb/rclterms.cpp | 545 + src/rcldb/searchdata.cpp | 348 + src/rcldb/searchdata.h | 519 + src/rcldb/searchdatatox.cpp | 1040 + src/rcldb/searchdataxml.cpp | 161 + src/rcldb/stemdb.cpp | 94 + src/rcldb/stemdb.h | 104 + src/rcldb/stoplist.cpp | 118 + src/rcldb/stoplist.h | 55 + src/rcldb/synfamily.cpp | 403 + src/rcldb/synfamily.h | 226 + src/rcldb/termproc.h | 299 + src/rcldb/xmacros.h | 51 + src/sampleconf/fields | 156 + src/sampleconf/fragbuts.xml | 57 + src/sampleconf/mimeconf | 398 + src/sampleconf/mimemap | 227 + src/sampleconf/mimeview | 185 + src/sampleconf/mimeview.mac | 163 + src/sampleconf/recoll.conf | 411 + src/sampleconf/recoll.qss | 55 + src/unac/AUTHORS | 1 + src/unac/COPYING | 340 + src/unac/README | 93 + src/unac/README.recoll | 10 + src/unac/unac.c | 14618 +++++++ src/unac/unac.cpp | 1 + src/unac/unac.h | 902 + src/unac/unac_version.h | 1 + src/utils/Makefile | 171 + src/utils/appformime.cpp | 235 + src/utils/appformime.h | 91 + src/utils/base64.cpp | 363 + src/utils/base64.h | 37 + src/utils/cancelcheck.h | 64 + src/utils/circache.cpp | 1600 + src/utils/circache.h | 107 + src/utils/closefrom.cpp | 270 + src/utils/closefrom.h | 27 + src/utils/conftree.cpp | 1025 + src/utils/conftree.h | 574 + src/utils/copyfile.cpp | 263 + src/utils/copyfile.h | 44 + src/utils/cpuconf.cpp | 85 + src/utils/cpuconf.h | 34 + src/utils/debuglog.cpp | 484 + src/utils/debuglog.h | 112 + src/utils/ecrontab.cpp | 272 + src/utils/ecrontab.h | 71 + src/utils/execmd.cpp | 1414 + src/utils/execmd.h | 251 + src/utils/fileudi.cpp | 131 + src/utils/fileudi.h | 31 + src/utils/fstreewalk.cpp | 614 + src/utils/fstreewalk.h | 127 + src/utils/hldata.h | 65 + src/utils/idfile.cpp | 205 + src/utils/idfile.h | 30 + src/utils/md5.cpp | 252 + src/utils/md5.h | 34 + src/utils/md5ut.cpp | 153 + src/utils/md5ut.h | 33 + src/utils/mimeparse.cpp | 976 + src/utils/mimeparse.h | 103 + src/utils/netcon.cpp | 1359 + src/utils/netcon.h | 368 + src/utils/pathut.cpp | 1283 + src/utils/pathut.h | 200 + src/utils/ptmutex.cpp | 105 + src/utils/ptmutex.h | 64 + src/utils/pxattr.cpp | 1075 + src/utils/pxattr.h | 136 + src/utils/rclionice.cpp | 58 + src/utils/rclionice.h | 25 + src/utils/readfile.cpp | 276 + src/utils/readfile.h | 50 + src/utils/refcntr.h | 70 + src/utils/smallut.cpp | 1482 + src/utils/smallut.h | 266 + src/utils/strmatcher.cpp | 132 + src/utils/strmatcher.h | 95 + src/utils/transcode.cpp | 232 + src/utils/transcode.h | 39 + src/utils/trexecmd.cpp | 383 + src/utils/utf8iter.cpp | 175 + src/utils/utf8iter.h | 283 + src/utils/utf8testin.txt | 212 + src/utils/utmkdefs.mk | 13 + src/utils/wipedir.cpp | 169 + src/utils/wipedir.h | 29 + src/utils/workqueue.cpp | 121 + src/utils/workqueue.h | 341 + src/utils/x11mon.cpp | 88 + src/utils/x11mon.h | 23 + .../SolutionSettings/SolutionSettings.props | 30 + .../SolutionSettings/SolutionSettings.vcxproj | 129 + .../SolutionSettings.vcxproj.filters | 17 + src/windows/Win32ProjectRecoll.sln | 64 + src/windows/Win32ProjectRecoll.vcxproj | 254 + .../Win32ProjectRecoll.vcxproj.filters | 318 + src/windows/Win32ProjectRecoll.vcxproj.user | 4 + src/windows/dirent.c | 148 + src/windows/dirent.h | 50 + src/windows/execmd_w.cpp | 987 + src/windows/fnmatch.c | 173 + src/windows/fnmatch.h | 44 + src/windows/mkinstdir.sh | 86 + src/windows/recollindex/recollindex.vcxproj | 163 + .../recollindex/recollindex.vcxproj.filters | 22 + .../recollindex/recollindex.vcxproj.user | 4 + src/windows/recollq/recollq.vcxproj | 190 + src/windows/recollq/recollq.vcxproj.filters | 96 + src/windows/strptime.cpp | 255 + src/windows/strptime.h | 3 + src/windows/targetver.h | 8 + src/windows/trexe/trexecmd/trexecmd.sln | 28 + src/windows/trexe/trexecmd/trexecmd.vcxproj | 168 + .../trexe/trexecmd/trexecmd.vcxproj.filters | 22 + src/xaposix/config.h | 249 + src/xaposix/realtime.h | 107 + src/xaposix/safe.cc | 31 + src/xaposix/safeerrno.h | 36 + src/xaposix/safefcntl.h | 71 + src/xaposix/safesysstat.h | 91 + src/xaposix/safesyswait.h | 39 + src/xaposix/safeunistd.h | 78 + src/xaposix/safewindows.h | 45 + src/ylwrap | 57 + tests/7zip/7zip.sh | 16 + tests/7zip/7zip.txt | 2 + tests/Maildir/Maildir.sh | 19 + tests/Maildir/Maildir.txt | 1 + tests/Maildir1/Maildir1.sh | 14 + tests/Maildir1/Maildir1.txt | 2 + tests/abiword/abiword.sh | 15 + tests/abiword/abiword.txt | 4 + tests/anchor/anchor.sh | 31 + tests/anchor/anchor.txt | 34 + tests/andor/andor.sh | 19 + tests/andor/andor.txt | 3 + tests/badsuffs/badsuffs.sh | 14 + tests/badsuffs/badsuffs.txt | 1 + tests/badsuffs1/badsuffs1.sh | 15 + tests/badsuffs1/badsuffs1.txt | 7 + tests/boolean/boolean.sh | 15 + tests/boolean/boolean.txt | 4 + tests/casediac/casediac.sh | 62 + tests/casediac/casediac.txt | 33 + tests/chm/chm.sh | 19 + tests/chm/chm.txt | 11 + tests/cjk/cjk.sh | 24 + tests/cjk/cjk.txt | 9 + tests/compressed/compressed.sh | 16 + tests/compressed/compressed.txt | 6 + tests/config/fields | 4 + tests/config/mimeconf | 11 + tests/config/mimemap | 44 + tests/config/mimeview | 3 + tests/config/recoll.conf | 43 + tests/dates/dates.sh | 24 + tests/dates/dates.txt | 9 + tests/delete/delete.sh | 24 + tests/delete/delete.txt | 3 + tests/dia/dia.sh | 14 + tests/dia/dia.txt | 4 + tests/dir/dir.sh | 17 + tests/dir/dir.txt | 2 + tests/dirwithblanks/dirwithblanks.sh | 14 + tests/dirwithblanks/dirwithblanks.txt | 4 + tests/djvu/djvu.sh | 13 + tests/djvu/djvu.txt | 2 + tests/dvi/dvi.sh | 13 + tests/dvi/dvi.txt | 2 + tests/embed/embed.sh | 14 + tests/embed/embed.txt | 2 + tests/empty/empty.sh | 14 + tests/empty/empty.txt | 2 + tests/epub/epub.sh | 16 + tests/epub/epub.txt | 6 + tests/gnumeric/gnumeric.sh | 16 + tests/gnumeric/gnumeric.txt | 6 + tests/html/html.sh | 36 + tests/html/html.txt | 30 + tests/ics/ics.sh | 13 + tests/ics/ics.txt | 2 + tests/images/images.sh | 14 + tests/images/images.txt | 2 + tests/incexcl/incexcl.sh | 22 + tests/incexcl/incexcl.txt | 7 + tests/indexedmimetypes/indexedmimetypes.sh | 57 + tests/indexedmimetypes/indexedmimetypes.txt | 8 + tests/info/info.sh | 13 + tests/info/info.txt | 2 + tests/kar/kar.sh | 16 + tests/kar/kar.txt | 6 + tests/koi8r/koi8r.sh | 23 + tests/koi8r/koi8r.txt | 2 + tests/langparser/langparser.sh | 78 + tests/langparser/langparser.txt | 83 + tests/lyx/lyx.sh | 16 + tests/lyx/lyx.txt | 8 + tests/mail/mail.sh | 21 + tests/mail/mail.txt | 15 + tests/man/man.sh | 16 + tests/man/man.txt | 2 + tests/media/media.sh | 17 + tests/media/media.txt | 6 + tests/msword/msword.sh | 15 + tests/msword/msword.txt | 5 + tests/non-auto/testmbox.sh | 42 + tests/notypes/notypes.sh | 17 + tests/notypes/notypes.txt | 4 + tests/okular-notes/okular-notes.sh | 14 + tests/okular-notes/okular-notes.txt | 2 + tests/ooff/ooff.sh | 17 + tests/ooff/ooff.txt | 4 + tests/partialpurge/partialpurge.sh | 41 + tests/partialpurge/partialpurge.txt | 18 + tests/pdf/pdf.sh | 13 + tests/pdf/pdf.txt | 3 + tests/postscript/postscript.sh | 13 + tests/postscript/postscript.txt | 3 + tests/ppt/ppt.sh | 13 + tests/ppt/ppt.txt | 2 + tests/program/program.sh | 16 + tests/program/program.txt | 6 + tests/purple/purple.sh | 15 + tests/purple/purple.txt | 4 + tests/pythonapi/doc.py | 53 + tests/pythonapi/extract.py | 45 + tests/pythonapi/pythonapi.sh | 30 + tests/pythonapi/pythonapi.txt | 79 + tests/pythonapi/simple.py | 40 + tests/pythonapi/url.py | 47 + tests/rar/rar.sh | 16 + tests/rar/rar.txt | 2 + tests/rfc2231/rfc2231.sh | 22 + tests/rfc2231/rfc2231.txt | 6 + tests/rtf/rtf.sh | 13 + tests/rtf/rtf.txt | 2 + tests/runtests.sh | 76 + tests/scribus/scribus.sh | 13 + tests/scribus/scribus.txt | 3 + tests/shared.sh | 68 + tests/skipped/skipped.sh | 13 + tests/skipped/skipped.txt | 2 + tests/special/special.sh | 27 + tests/special/special.txt | 10 + tests/stemming/stemming.sh | 15 + tests/stemming/stemming.txt | 5 + tests/tar/tar.sh | 16 + tests/tar/tar.txt | 6 + tests/txt/txt.sh | 18 + tests/txt/txt.txt | 6 + tests/unacex/unacex.sh | 20 + tests/unacex/unacex.txt | 3 + tests/utf8/utf8.sh | 13 + tests/utf8/utf8.txt | 2 + tests/utfInPath/utfInPath.sh | 17 + tests/utfInPath/utfInPath.txt | 6 + tests/xattr/fields | 4 + tests/xattr/xattr.sh | 85 + tests/xattr/xattr.txt | 57 + tests/xls/xls.sh | 13 + tests/xls/xls.txt | 2 + tests/xml/xml.sh | 16 + tests/xml/xml.txt | 7 + tests/zip/zip.sh | 17 + tests/zip/zip.txt | 6 + unac/.version | 1 + unac/AUTHORS | 1 + unac/COPYING | 340 + unac/CaseFolding-5.1.0.txt | 1196 + unac/CaseFolding-6.3.0.txt | 1226 + unac/ChangeLog | 160 + unac/INSTALL | 182 + unac/Makefile.am | 101 + unac/Makefile.in | 1522 + unac/NEWS | 58 + unac/README | 93 + unac/THANKS | 9 + unac/UnicodeData-5.1.0.txt | 19336 +++++++++ unac/UnicodeData-6.3.0.txt | 24434 +++++++++++ unac/acinclude.m4 | 156 + unac/aclocal.m4 | 11194 +++++ unac/builder.in | 527 + unac/compile | 1 + unac/config.guess | 1325 + unac/config.h.in | 71 + unac/config.rpath | 0 unac/config.sub | 1460 + unac/configure | 15098 +++++++ unac/configure.ac | 62 + unac/depcomp | 411 + unac/getopt.c | 1279 + unac/getopt.h | 181 + unac/install-sh | 251 + unac/ltconfig | 3114 ++ unac/ltmain.sh | 5055 +++ unac/missing | 283 + unac/mkinstalldirs | 40 + unac/stamp-h | 1 + unac/stamp-h.in | 1 + unac/t_unac.in | 35 + unac/test-driver | 0 unac/unac.3 | 390 + unac/unac.c | 14618 +++++++ unac/unac.h | 902 + unac/unac.pc.in | 13 + unac/unac.spec.in | 50 + unac/unac_version.h | 1 + unac/unaccent.1 | 115 + unac/unaccent.c | 137 + unac/unactest.c | 53 + unac/unactest1.c | 497 + website/BUGS.html | 951 + website/CHANGES.html | 945 + website/copydocs | 19 + website/credits.html | 80 + website/custom.html | 630 + website/devel.html | 101 + website/doc.html | 76 + website/download.html | 402 + website/favicon.ico | Bin 0 -> 318 bytes website/features.html | 467 + website/filters/filters.html | 242 + website/fr/features.html | 210 + website/helpernotes.html | 74 + website/id3lib.html | 57 + website/idxthreads/Makefile | 7 + website/idxthreads/assembly.dia | Bin 0 -> 2236 bytes website/idxthreads/assembly.png | Bin 0 -> 30918 bytes website/idxthreads/forkingRecoll.txt | 224 + website/idxthreads/multipara.dia | Bin 0 -> 2612 bytes website/idxthreads/multipara.png | Bin 0 -> 36051 bytes website/idxthreads/nothreads.dia | Bin 0 -> 1740 bytes website/idxthreads/nothreads.png | Bin 0 -> 19492 bytes website/idxthreads/threadingRecoll.html | 1296 + website/idxthreads/threadingRecoll.txt | 409 + website/idxthreads/xapDocCopyCrash.txt | 138 + website/index.html.en | 303 + website/index.html.fr | 235 + website/perfs.html | 114 + website/pics/00REMAKEALB.sh | 2 + website/pics/index.html | 44 + website/pics/index.html.head | 27 + website/pics/mario.png | Bin 0 -> 1792 bytes website/pics/piclist.txt | 9 + .../pics/recoll-HTML_search_results-thumb.png | Bin 0 -> 182129 bytes website/pics/recoll-HTML_search_results.html | 40 + website/pics/recoll-HTML_search_results.png | Bin 0 -> 64035 bytes website/pics/recoll-HTML_search_results.txt | 28 + website/pics/recoll0-thumb.png | Bin 0 -> 126689 bytes website/pics/recoll0.html | 13 + website/pics/recoll0.png | Bin 0 -> 130557 bytes website/pics/recoll0.txt | 2 + website/pics/recoll1-thumb.png | Bin 0 -> 157729 bytes website/pics/recoll1.html | 13 + website/pics/recoll1.png | Bin 0 -> 185674 bytes website/pics/recoll1.txt | 4 + website/pics/recoll2-thumb.png | Bin 0 -> 25877 bytes website/pics/recoll2.html | 13 + website/pics/recoll2.png | Bin 0 -> 46698 bytes website/pics/recoll2.txt | 1 + website/pics/recoll3-thumb.png | Bin 0 -> 56412 bytes website/pics/recoll3.html | 14 + website/pics/recoll3.png | Bin 0 -> 169706 bytes website/pics/recoll3.txt | 2 + website/pics/recoll4-thumb.png | Bin 0 -> 66895 bytes website/pics/recoll4.html | 14 + website/pics/recoll4.png | Bin 0 -> 55374 bytes website/pics/recoll4.txt | 2 + website/pics/recoll5-thumb.png | Bin 0 -> 53001 bytes website/pics/recoll5.html | 13 + website/pics/recoll5.png | Bin 0 -> 237133 bytes website/pics/recoll5.txt | 1 + website/pics/recoll64.png | Bin 0 -> 1420 bytes website/pics/recoll_chinese-thumb.png | Bin 0 -> 194549 bytes website/pics/recoll_chinese.html | 14 + website/pics/recoll_chinese.png | Bin 0 -> 738329 bytes website/pics/recoll_chinese.txt | 2 + website/pics/result-table-thumb.png | Bin 0 -> 50314 bytes website/pics/result-table.html | 13 + website/pics/result-table.png | Bin 0 -> 111110 bytes website/pics/smile.png | Bin 0 -> 1394 bytes website/rclidxfmt.html | 196 + website/recoll_XMP/index.html | 125 + website/recoll_XMP/jabref_metadata.png | Bin 0 -> 95017 bytes website/recoll_XMP/recoll_query.png | Bin 0 -> 291458 bytes website/release-1.14.4.html | 53 + website/release-1.15.html | 194 + website/release-1.16.html | 206 + website/release-1.17.html | 255 + website/release-1.18.html | 203 + website/release-1.19.html | 261 + website/release-1.20.html | 255 + website/release-1.21.html | 104 + website/release-history.html | 146 + website/resparpics/christopher.png | Bin 0 -> 54014 bytes website/resparpics/clean.png | Bin 0 -> 38831 bytes website/resparpics/default.png | Bin 0 -> 40542 bytes website/resparpics/detailSmallGreyTable.png | Bin 0 -> 31701 bytes website/resparpics/issue73+table.png | Bin 0 -> 37617 bytes website/resparpics/issue73.png | Bin 0 -> 37751 bytes website/resparpics/pip.png | Bin 0 -> 189818 bytes website/resparpics/pz3.png | Bin 0 -> 59963 bytes website/resparpics/structuredTable.png | Bin 0 -> 32595 bytes website/resparpics/weblike.png | Bin 0 -> 25158 bytes website/styles/style.css | 122 + website/support.html.en | 65 + website/usermanual/README-dir.txt | 1 + website/xapUpg100.html | 69 + 958 files changed, 393598 insertions(+) create mode 100644 .hgignore create mode 100644 packaging/FreeBSD/recoll/Makefile create mode 100644 packaging/FreeBSD/recoll/distinfo create mode 100644 packaging/FreeBSD/recoll/pkg-descr create mode 100644 packaging/FreeBSD/recoll/pkg-plist create mode 100644 packaging/debian/buildppa.sh create mode 100644 packaging/debian/debian/README.Debian create mode 100644 packaging/debian/debian/changelog create mode 100644 packaging/debian/debian/compat create mode 100644 packaging/debian/debian/control create mode 100644 packaging/debian/debian/copyright create mode 100644 packaging/debian/debian/patches/fix-python-install.patch create mode 100644 packaging/debian/debian/patches/series create mode 100644 packaging/debian/debian/python-recoll.install create mode 100644 packaging/debian/debian/python3-recoll.install create mode 100644 packaging/debian/debian/recoll.install create mode 100644 packaging/debian/debian/recoll.menu create mode 100755 packaging/debian/debian/rules create mode 100644 packaging/debian/debian/source/format create mode 100644 packaging/debian/debian/watch create mode 100644 packaging/debian/debiankio/changelog create mode 100644 packaging/debian/debiankio/compat create mode 100644 packaging/debian/debiankio/control create mode 100644 packaging/debian/debiankio/copyright create mode 100644 packaging/debian/debiankio/dirs create mode 100644 packaging/debian/debiankio/docs create mode 100644 packaging/debian/debiankio/patches/fix-cmake-build-parser.patch create mode 100644 packaging/debian/debiankio/patches/series create mode 100755 packaging/debian/debiankio/rules create mode 100644 packaging/debian/debiankio/source/format create mode 100644 packaging/debian/debiankio/watch create mode 100644 packaging/debian/debianunitylens/changelog create mode 100644 packaging/debian/debianunitylens/compat create mode 100644 packaging/debian/debianunitylens/control create mode 100644 packaging/debian/debianunitylens/copyright create mode 100644 packaging/debian/debianunitylens/docs create mode 100755 packaging/debian/debianunitylens/rules create mode 100644 packaging/debian/debianunitylens/watch create mode 100644 packaging/homebrew/00README.txt create mode 100644 packaging/homebrew/recoll.rb create mode 100644 packaging/macports/README.txt create mode 100644 packaging/macports/textproc/recoll/Portfile create mode 100644 packaging/macports/textproc/recoll/files/patch-sampleconf-mimeview.diff create mode 100644 packaging/rpm/kio_recoll.spec create mode 100644 packaging/rpm/recoll-mageia.spec create mode 100644 packaging/rpm/recoll.spec create mode 100644 packaging/rpm/recollCooker.spec create mode 100644 packaging/rpm/recollfedora.spec create mode 100644 packaging/rpm/recollmdk.spec create mode 100644 src/COPYING create mode 100644 src/ChangeLog create mode 100644 src/INSTALL create mode 100644 src/Makefile.am create mode 100644 src/README create mode 100644 src/VERSION create mode 100644 src/aspell/Makefile create mode 100644 src/aspell/aspell-local.h create mode 100644 src/aspell/rclaspell.cpp create mode 100644 src/aspell/rclaspell.h create mode 100755 src/autogen.sh create mode 100644 src/bincimapmime/00README.recoll create mode 100644 src/bincimapmime/AUTHORS create mode 100644 src/bincimapmime/COPYING create mode 100644 src/bincimapmime/Makefile create mode 100644 src/bincimapmime/config.h create mode 100644 src/bincimapmime/convert.cc create mode 100644 src/bincimapmime/convert.h create mode 100644 src/bincimapmime/mime-inputsource.h create mode 100644 src/bincimapmime/mime-parsefull.cc create mode 100644 src/bincimapmime/mime-parseonlyheader.cc create mode 100644 src/bincimapmime/mime-printbody.cc create mode 100644 src/bincimapmime/mime-utils.h create mode 100644 src/bincimapmime/mime.cc create mode 100644 src/bincimapmime/mime.h create mode 100644 src/bincimapmime/trbinc.cc create mode 100644 src/common/Makefile create mode 100644 src/common/autoconfig-win.h create mode 100644 src/common/autoconfig.h.in create mode 100644 src/common/beaglequeuecache.cpp create mode 100644 src/common/beaglequeuecache.h create mode 100644 src/common/conf_post.h create mode 100644 src/common/cstr.cpp create mode 100644 src/common/cstr.h create mode 100644 src/common/rclconfig.cpp create mode 100644 src/common/rclconfig.h create mode 100644 src/common/rclinit.cpp create mode 100644 src/common/rclinit.h create mode 100644 src/common/rclversion.h.in create mode 100644 src/common/syngroups.cpp create mode 100644 src/common/syngroups.h create mode 100644 src/common/textsplit.cpp create mode 100644 src/common/textsplit.h create mode 100644 src/common/unacpp.cpp create mode 100644 src/common/unacpp.h create mode 100644 src/common/uproplist.h create mode 100644 src/configure.ac create mode 100755 src/desktop/hotrecoll.py create mode 100644 src/desktop/recoll-searchgui.desktop create mode 100644 src/desktop/recoll.appdata.xml create mode 100644 src/desktop/recoll.png create mode 100644 src/desktop/recoll.svg create mode 100644 src/desktop/recoll.xcf create mode 100755 src/desktop/recoll_index_on_ac.sh create mode 100644 src/desktop/recollindex.desktop create mode 100644 src/desktop/xdg-utils-1.0.1/LICENSE create mode 100755 src/desktop/xdg-utils-1.0.1/scripts/xdg-desktop-menu create mode 100755 src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource create mode 100755 src/desktop/xdg-utils-1.0.1/scripts/xdg-open create mode 100644 src/doc/man/recoll.1 create mode 100644 src/doc/man/recoll.conf.5 create mode 100644 src/doc/man/recollindex.1 create mode 100644 src/doc/man/recollq.1 create mode 100644 src/doc/prog/Doxyfile create mode 100644 src/doc/prog/Makefile create mode 100644 src/doc/prog/filters.txt create mode 100644 src/doc/prog/top.txt create mode 100644 src/doc/user/00README.txt create mode 100644 src/doc/user/Makefile create mode 100644 src/doc/user/docbook-xsl.css create mode 100644 src/doc/user/docbook.css create mode 100644 src/doc/user/usermanual-italian.html create mode 100644 src/doc/user/usermanual.xml create mode 100755 src/filters/injectcommon.sh create mode 100644 src/filters/msodump.zip create mode 100755 src/filters/ppt-dump.py create mode 100755 src/filters/rcl7z create mode 100755 src/filters/rclabw create mode 100755 src/filters/rclaptosidman create mode 100755 src/filters/rclaudio create mode 100755 src/filters/rclcheckneedretry.sh create mode 100755 src/filters/rclchm create mode 100755 src/filters/rcldia create mode 100755 src/filters/rcldjvu create mode 100755 src/filters/rcldoc create mode 100755 src/filters/rcldoc.py create mode 100755 src/filters/rcldvi create mode 100755 src/filters/rclepub create mode 100644 src/filters/rclexec1.py create mode 100644 src/filters/rclexecm.py create mode 100755 src/filters/rclfb2 create mode 100755 src/filters/rclgaim create mode 100755 src/filters/rclgnm create mode 100755 src/filters/rclics create mode 100755 src/filters/rclimg create mode 100755 src/filters/rclinfo create mode 100755 src/filters/rclkar create mode 100755 src/filters/rclkwd create mode 100755 src/filters/rcllatinclass.py create mode 100644 src/filters/rcllatinstops.zip create mode 100755 src/filters/rcllyx create mode 100755 src/filters/rclman create mode 100755 src/filters/rclmpdf create mode 100755 src/filters/rclokulnote create mode 100755 src/filters/rclopxml create mode 100755 src/filters/rclopxml.py create mode 100755 src/filters/rclpdf create mode 100755 src/filters/rclppt create mode 100755 src/filters/rclps create mode 100755 src/filters/rclpurple create mode 100755 src/filters/rclpython create mode 100755 src/filters/rclrar create mode 100755 src/filters/rclrtf create mode 100755 src/filters/rclrtf.py create mode 100755 src/filters/rclscribus create mode 100755 src/filters/rclshowinfo create mode 100755 src/filters/rclsiduxman create mode 100755 src/filters/rclsoff create mode 100755 src/filters/rclsoff.py create mode 100755 src/filters/rclsvg create mode 100755 src/filters/rclsvg.py create mode 100755 src/filters/rcltar create mode 100755 src/filters/rcltex create mode 100755 src/filters/rcltext create mode 100755 src/filters/rcltext.py create mode 100755 src/filters/rcluncomp create mode 100755 src/filters/rclwar create mode 100755 src/filters/rclwpd create mode 100755 src/filters/rclxls create mode 100755 src/filters/rclxml create mode 100755 src/filters/rclxml.py create mode 100644 src/filters/rclxslt.py create mode 100755 src/filters/rclzip create mode 100755 src/filters/recfiltcommon create mode 100755 src/filters/xls-dump.py create mode 100755 src/filters/xlsxmltocsv.py create mode 100644 src/index/Makefile create mode 100644 src/index/beaglequeue.cpp create mode 100644 src/index/beaglequeue.h create mode 100644 src/index/bglfetcher.cpp create mode 100644 src/index/bglfetcher.h create mode 100644 src/index/checkretryfailed.cpp create mode 100644 src/index/checkretryfailed.h create mode 100644 src/index/fetcher.cpp create mode 100644 src/index/fetcher.h create mode 100644 src/index/fsfetcher.cpp create mode 100644 src/index/fsfetcher.h create mode 100644 src/index/fsindexer.cpp create mode 100644 src/index/fsindexer.h create mode 100644 src/index/indexer.cpp create mode 100644 src/index/indexer.h create mode 100644 src/index/mimetype.cpp create mode 100644 src/index/mimetype.h create mode 100644 src/index/rclmon.h create mode 100755 src/index/rclmon.sh create mode 100644 src/index/rclmonprc.cpp create mode 100644 src/index/rclmonrcv.cpp create mode 100644 src/index/recollindex.cpp create mode 100644 src/index/recollindex.h create mode 100644 src/index/subtreelist.cpp create mode 100644 src/index/subtreelist.h create mode 100644 src/internfile/Filter.h create mode 100644 src/internfile/Makefile create mode 100644 src/internfile/extrameta.cpp create mode 100644 src/internfile/extrameta.h create mode 100644 src/internfile/htmlparse.cpp create mode 100644 src/internfile/htmlparse.h create mode 100644 src/internfile/indextext.h create mode 100644 src/internfile/internfile.cpp create mode 100644 src/internfile/internfile.h create mode 100644 src/internfile/mh_exec.cpp create mode 100644 src/internfile/mh_exec.h create mode 100644 src/internfile/mh_execm.cpp create mode 100644 src/internfile/mh_execm.h create mode 100644 src/internfile/mh_html.cpp create mode 100644 src/internfile/mh_html.h create mode 100644 src/internfile/mh_mail.cpp create mode 100644 src/internfile/mh_mail.h create mode 100644 src/internfile/mh_mbox.cpp create mode 100644 src/internfile/mh_mbox.h create mode 100644 src/internfile/mh_null.h create mode 100644 src/internfile/mh_symlink.h create mode 100644 src/internfile/mh_text.cpp create mode 100644 src/internfile/mh_text.h create mode 100644 src/internfile/mh_unknown.h create mode 100644 src/internfile/mimehandler.cpp create mode 100644 src/internfile/mimehandler.h create mode 100644 src/internfile/myhtmlparse.cpp create mode 100644 src/internfile/myhtmlparse.h create mode 100644 src/internfile/txtdcode.cpp create mode 100644 src/internfile/uncomp.cpp create mode 100644 src/internfile/uncomp.h create mode 100644 src/kde/kioslave/kio_recoll/00README.txt create mode 100644 src/kde/kioslave/kio_recoll/CMakeLists.txt create mode 100644 src/kde/kioslave/kio_recoll/Makefile.kde3 create mode 100644 src/kde/kioslave/kio_recoll/cleancmakestuff.sh create mode 100644 src/kde/kioslave/kio_recoll/data/help.html create mode 100644 src/kde/kioslave/kio_recoll/data/searchable.html create mode 100644 src/kde/kioslave/kio_recoll/data/welcome.html create mode 100644 src/kde/kioslave/kio_recoll/dirif.cpp create mode 100644 src/kde/kioslave/kio_recoll/htmlif.cpp create mode 100644 src/kde/kioslave/kio_recoll/kio_recoll.cpp create mode 100644 src/kde/kioslave/kio_recoll/kio_recoll.h create mode 100755 src/kde/kioslave/kio_recoll/kio_recoll.la create mode 100644 src/kde/kioslave/kio_recoll/notes.txt create mode 100644 src/kde/kioslave/kio_recoll/recoll.protocol create mode 100644 src/kde/kioslave/kio_recoll/recollf.protocol create mode 100644 src/kde/kioslave/kio_recoll/recollnolist.protocol create mode 100644 src/kde/recoll_applet/0README.Recoll create mode 100644 src/kde/recoll_applet/AUTHORS create mode 100644 src/kde/recoll_applet/COPYING create mode 100644 src/kde/recoll_applet/ChangeLog create mode 100644 src/kde/recoll_applet/Doxyfile create mode 100644 src/kde/recoll_applet/INSTALL create mode 100644 src/kde/recoll_applet/Makefile.am create mode 100644 src/kde/recoll_applet/Makefile.cvs create mode 100644 src/kde/recoll_applet/Makefile.in create mode 100644 src/kde/recoll_applet/NEWS create mode 100644 src/kde/recoll_applet/README create mode 100644 src/kde/recoll_applet/TODO create mode 100644 src/kde/recoll_applet/acinclude.m4 create mode 100644 src/kde/recoll_applet/aclocal.m4 create mode 100644 src/kde/recoll_applet/admin/Doxyfile.am create mode 100755 src/kde/recoll_applet/admin/Doxyfile.global create mode 100644 src/kde/recoll_applet/admin/Makefile.common create mode 100644 src/kde/recoll_applet/admin/acinclude.m4.in create mode 100644 src/kde/recoll_applet/admin/am_edit create mode 100644 src/kde/recoll_applet/admin/bcheck.pl create mode 100755 src/kde/recoll_applet/admin/compile create mode 100644 src/kde/recoll_applet/admin/conf.change.pl create mode 100755 src/kde/recoll_applet/admin/config.guess create mode 100644 src/kde/recoll_applet/admin/config.pl create mode 100755 src/kde/recoll_applet/admin/config.sub create mode 100644 src/kde/recoll_applet/admin/configure.in.bot.end create mode 100644 src/kde/recoll_applet/admin/configure.in.min create mode 100644 src/kde/recoll_applet/admin/cvs.sh create mode 100755 src/kde/recoll_applet/admin/debianrules create mode 100755 src/kde/recoll_applet/admin/depcomp create mode 100644 src/kde/recoll_applet/admin/deps.am create mode 100755 src/kde/recoll_applet/admin/detect-autoconf.pl create mode 100644 src/kde/recoll_applet/admin/doxygen.sh create mode 100755 src/kde/recoll_applet/admin/install-sh create mode 100644 src/kde/recoll_applet/admin/libtool.m4.in create mode 100644 src/kde/recoll_applet/admin/ltmain.sh create mode 100755 src/kde/recoll_applet/admin/missing create mode 100755 src/kde/recoll_applet/admin/mkinstalldirs create mode 100755 src/kde/recoll_applet/admin/nmcheck create mode 100644 src/kde/recoll_applet/admin/oldinclude.m4.in create mode 100644 src/kde/recoll_applet/admin/pkg.m4.in create mode 100755 src/kde/recoll_applet/admin/ylwrap create mode 100644 src/kde/recoll_applet/config.h.in create mode 100755 src/kde/recoll_applet/configure create mode 100644 src/kde/recoll_applet/configure.files create mode 100644 src/kde/recoll_applet/configure.in create mode 100644 src/kde/recoll_applet/configure.in.in create mode 100644 src/kde/recoll_applet/doc/Makefile.am create mode 100644 src/kde/recoll_applet/doc/Makefile.in create mode 100644 src/kde/recoll_applet/doc/en/Makefile.am create mode 100644 src/kde/recoll_applet/doc/en/Makefile.in create mode 100644 src/kde/recoll_applet/doc/en/index.docbook create mode 100644 src/kde/recoll_applet/po/Makefile.am create mode 100644 src/kde/recoll_applet/po/Makefile.in create mode 100644 src/kde/recoll_applet/src/Makefile.am create mode 100644 src/kde/recoll_applet/src/Makefile.in create mode 100644 src/kde/recoll_applet/src/kpixmapcombo.cpp create mode 100644 src/kde/recoll_applet/src/kpixmapcombo.h create mode 100644 src/kde/recoll_applet/src/recoll_applet.cpp create mode 100644 src/kde/recoll_applet/src/recoll_applet.desktop create mode 100644 src/kde/recoll_applet/src/recoll_applet.h create mode 100644 src/kde/recoll_applet/src/recoll_applet.lsm create mode 100644 src/kde/recoll_applet/stamp-h.in create mode 100644 src/kde/recoll_applet/subdirs create mode 100644 src/php/00README.txt create mode 100644 src/php/recoll/config.m4 create mode 100755 src/php/recoll/make.sh create mode 100644 src/php/recoll/php_recoll.h create mode 100644 src/php/recoll/recoll.cpp create mode 100644 src/php/sample/shell.php create mode 100644 src/python/README.txt create mode 100644 src/python/recoll/Makefile create mode 100644 src/python/recoll/pyrclextract.cpp create mode 100644 src/python/recoll/pyrecoll.cpp create mode 100644 src/python/recoll/pyrecoll.h create mode 100644 src/python/recoll/recoll/__init__.py create mode 100755 src/python/recoll/recoll/rclconfig.py create mode 100644 src/python/recoll/setup.py.in create mode 100755 src/python/samples/docdups.py create mode 100755 src/python/samples/mutt-recoll.py create mode 100755 src/python/samples/rcldlkp.py create mode 100644 src/python/samples/rclmbox.py create mode 100644 src/python/samples/recollgui/Makefile create mode 100755 src/python/samples/recollgui/qrecoll.py create mode 100644 src/python/samples/recollgui/rclmain.ui create mode 100755 src/python/samples/recollq.py create mode 100755 src/python/samples/recollqsd.py create mode 100755 src/python/samples/trconfig.py create mode 100644 src/qtgui/advsearch.ui create mode 100644 src/qtgui/advsearch_w.cpp create mode 100644 src/qtgui/advsearch_w.h create mode 100644 src/qtgui/advshist.cpp create mode 100644 src/qtgui/advshist.h create mode 100644 src/qtgui/confgui/confgui.cpp create mode 100644 src/qtgui/confgui/confgui.h create mode 100644 src/qtgui/confgui/confguiindex.cpp create mode 100644 src/qtgui/confgui/confguiindex.h create mode 100644 src/qtgui/confgui/conflinkrcl.h create mode 100644 src/qtgui/confgui/main.cpp create mode 100644 src/qtgui/confgui/trconf.pro create mode 100644 src/qtgui/crontool.cpp create mode 100644 src/qtgui/crontool.h create mode 100644 src/qtgui/crontool.ui create mode 100644 src/qtgui/editdialog.h create mode 100644 src/qtgui/editdialog.ui create mode 100644 src/qtgui/firstidx.h create mode 100644 src/qtgui/firstidx.ui create mode 100644 src/qtgui/fragbuts.cpp create mode 100644 src/qtgui/fragbuts.h create mode 100644 src/qtgui/guiutils.cpp create mode 100644 src/qtgui/guiutils.h create mode 100644 src/qtgui/i18n/recoll_cs.qm create mode 100644 src/qtgui/i18n/recoll_cs.ts create mode 100644 src/qtgui/i18n/recoll_da.qm create mode 100644 src/qtgui/i18n/recoll_da.ts create mode 100644 src/qtgui/i18n/recoll_de.qm create mode 100644 src/qtgui/i18n/recoll_de.ts create mode 100644 src/qtgui/i18n/recoll_el.qm create mode 100644 src/qtgui/i18n/recoll_el.ts create mode 100644 src/qtgui/i18n/recoll_es.qm create mode 100644 src/qtgui/i18n/recoll_es.ts create mode 100644 src/qtgui/i18n/recoll_fr.qm create mode 100644 src/qtgui/i18n/recoll_fr.ts create mode 100644 src/qtgui/i18n/recoll_it.qm create mode 100644 src/qtgui/i18n/recoll_it.ts create mode 100644 src/qtgui/i18n/recoll_lt.qm create mode 100644 src/qtgui/i18n/recoll_lt.ts create mode 100644 src/qtgui/i18n/recoll_pl.qm create mode 100644 src/qtgui/i18n/recoll_pl.ts create mode 100644 src/qtgui/i18n/recoll_ru.qm create mode 100644 src/qtgui/i18n/recoll_ru.ts create mode 100644 src/qtgui/i18n/recoll_tr.qm create mode 100644 src/qtgui/i18n/recoll_tr.ts create mode 100644 src/qtgui/i18n/recoll_uk.qm create mode 100644 src/qtgui/i18n/recoll_uk.ts create mode 100644 src/qtgui/i18n/recoll_xx.qm create mode 100644 src/qtgui/i18n/recoll_xx.ts create mode 100644 src/qtgui/i18n/recoll_zh.qm create mode 100644 src/qtgui/i18n/recoll_zh.ts create mode 100644 src/qtgui/i18n/recoll_zh_CN.qm create mode 100644 src/qtgui/i18n/recoll_zh_CN.ts create mode 100644 src/qtgui/idxsched.h create mode 100644 src/qtgui/idxsched.ui create mode 100644 src/qtgui/images/asearch.png create mode 100644 src/qtgui/images/cancel.png create mode 100644 src/qtgui/images/close.png create mode 100644 src/qtgui/images/code-block.png create mode 100644 src/qtgui/images/down.png create mode 100644 src/qtgui/images/firstpage.png create mode 100644 src/qtgui/images/history.png create mode 100644 src/qtgui/images/nextpage.png create mode 100644 src/qtgui/images/prevpage.png create mode 100644 src/qtgui/images/recoll.icns create mode 100644 src/qtgui/images/recoll.png create mode 100644 src/qtgui/images/sortparms.png create mode 100644 src/qtgui/images/spell.png create mode 100644 src/qtgui/images/table.png create mode 100644 src/qtgui/images/up.png create mode 100644 src/qtgui/listdialog.h create mode 100644 src/qtgui/listdialog.ui create mode 100644 src/qtgui/main.cpp create mode 100644 src/qtgui/mtpics/License_sidux.txt create mode 100644 src/qtgui/mtpics/README create mode 100644 src/qtgui/mtpics/aptosid-book.png create mode 100644 src/qtgui/mtpics/aptosid-manual-copyright.txt create mode 100644 src/qtgui/mtpics/aptosid-manual.png create mode 100644 src/qtgui/mtpics/archive.png create mode 100644 src/qtgui/mtpics/book.png create mode 100644 src/qtgui/mtpics/bookchap.png create mode 100644 src/qtgui/mtpics/document.png create mode 100644 src/qtgui/mtpics/drawing.png create mode 100644 src/qtgui/mtpics/emblem-symbolic-link.png create mode 100644 src/qtgui/mtpics/folder.png create mode 100644 src/qtgui/mtpics/html.png create mode 100644 src/qtgui/mtpics/image.png create mode 100644 src/qtgui/mtpics/message.png create mode 100644 src/qtgui/mtpics/mozilla_doc.png create mode 100644 src/qtgui/mtpics/pdf.png create mode 100644 src/qtgui/mtpics/pidgin.png create mode 100644 src/qtgui/mtpics/postscript.png create mode 100644 src/qtgui/mtpics/presentation.png create mode 100644 src/qtgui/mtpics/sidux-book.png create mode 100644 src/qtgui/mtpics/soffice.png create mode 100644 src/qtgui/mtpics/source.png create mode 100644 src/qtgui/mtpics/sownd.png create mode 100644 src/qtgui/mtpics/spreadsheet.png create mode 100644 src/qtgui/mtpics/text-x-python.png create mode 100644 src/qtgui/mtpics/txt.png create mode 100644 src/qtgui/mtpics/video.png create mode 100644 src/qtgui/mtpics/wordprocessing.png create mode 100644 src/qtgui/multisave.cpp create mode 100644 src/qtgui/multisave.h create mode 100644 src/qtgui/preview_w.cpp create mode 100644 src/qtgui/preview_w.h create mode 100644 src/qtgui/ptrans.ui create mode 100644 src/qtgui/ptrans_w.cpp create mode 100644 src/qtgui/ptrans_w.h create mode 100644 src/qtgui/rclhelp.cpp create mode 100644 src/qtgui/rclhelp.h create mode 100644 src/qtgui/rclm_idx.cpp create mode 100644 src/qtgui/rclm_preview.cpp create mode 100644 src/qtgui/rclm_saveload.cpp create mode 100644 src/qtgui/rclm_view.cpp create mode 100644 src/qtgui/rclm_wins.cpp create mode 100644 src/qtgui/rclmain.ui create mode 100644 src/qtgui/rclmain_w.cpp create mode 100644 src/qtgui/rclmain_w.h create mode 100644 src/qtgui/rclzg.cpp create mode 100644 src/qtgui/rclzg.h create mode 100644 src/qtgui/recoll.h create mode 100644 src/qtgui/recoll.pro.in create mode 100644 src/qtgui/recoll.qrc create mode 100644 src/qtgui/reslist.cpp create mode 100644 src/qtgui/reslist.h create mode 100644 src/qtgui/respopup.cpp create mode 100644 src/qtgui/respopup.h create mode 100644 src/qtgui/restable.cpp create mode 100644 src/qtgui/restable.h create mode 100644 src/qtgui/restable.ui create mode 100644 src/qtgui/rtitool.cpp create mode 100644 src/qtgui/rtitool.h create mode 100644 src/qtgui/rtitool.ui create mode 100644 src/qtgui/searchclause_w.cpp create mode 100644 src/qtgui/searchclause_w.h create mode 100644 src/qtgui/snippets.ui create mode 100644 src/qtgui/snippets_w.cpp create mode 100644 src/qtgui/snippets_w.h create mode 100644 src/qtgui/spell.ui create mode 100644 src/qtgui/spell_w.cpp create mode 100644 src/qtgui/spell_w.h create mode 100644 src/qtgui/ssearch_w.cpp create mode 100644 src/qtgui/ssearch_w.h create mode 100644 src/qtgui/ssearchb.ui create mode 100644 src/qtgui/systray.cpp create mode 100644 src/qtgui/systray.h create mode 100644 src/qtgui/ui_rclmain.h-4.5 create mode 100644 src/qtgui/uiprefs.ui create mode 100644 src/qtgui/uiprefs_w.cpp create mode 100644 src/qtgui/uiprefs_w.h create mode 100644 src/qtgui/viewaction.ui create mode 100644 src/qtgui/viewaction_w.cpp create mode 100644 src/qtgui/viewaction_w.h create mode 100644 src/qtgui/xmltosd.cpp create mode 100644 src/qtgui/xmltosd.h create mode 100644 src/query/docseq.cpp create mode 100644 src/query/docseq.h create mode 100644 src/query/docseqdb.cpp create mode 100644 src/query/docseqdb.h create mode 100644 src/query/docseqdocs.h create mode 100644 src/query/docseqhist.cpp create mode 100644 src/query/docseqhist.h create mode 100644 src/query/dynconf.cpp create mode 100644 src/query/dynconf.h create mode 100644 src/query/filtseq.cpp create mode 100644 src/query/filtseq.h create mode 100644 src/query/location.hh create mode 100644 src/query/plaintorich.cpp create mode 100644 src/query/plaintorich.h create mode 100644 src/query/position.hh create mode 100644 src/query/recollq.cpp create mode 100644 src/query/recollq.h create mode 100644 src/query/recollqmain.cpp create mode 100644 src/query/reslistpager.cpp create mode 100644 src/query/reslistpager.h create mode 100644 src/query/sortseq.cpp create mode 100644 src/query/sortseq.h create mode 100644 src/query/stack.hh create mode 100644 src/query/wasaparse.cpp create mode 100644 src/query/wasaparse.hpp create mode 100644 src/query/wasaparse.ypp create mode 100644 src/query/wasaparseaux.cpp create mode 100644 src/query/wasaparserdriver.h create mode 100644 src/query/wasatorcl.h create mode 100644 src/query/xadump.cpp create mode 100644 src/rcldb/Makefile create mode 100644 src/rcldb/daterange.cpp create mode 100644 src/rcldb/daterange.h create mode 100644 src/rcldb/expansiondbs.cpp create mode 100644 src/rcldb/expansiondbs.h create mode 100644 src/rcldb/rclabstract.cpp create mode 100644 src/rcldb/rcldb.cpp create mode 100644 src/rcldb/rcldb.h create mode 100644 src/rcldb/rcldb_p.h create mode 100644 src/rcldb/rcldoc.cpp create mode 100644 src/rcldb/rcldoc.h create mode 100644 src/rcldb/rcldups.cpp create mode 100644 src/rcldb/rclquery.cpp create mode 100644 src/rcldb/rclquery.h create mode 100644 src/rcldb/rclquery_p.h create mode 100644 src/rcldb/rclterms.cpp create mode 100644 src/rcldb/searchdata.cpp create mode 100644 src/rcldb/searchdata.h create mode 100644 src/rcldb/searchdatatox.cpp create mode 100644 src/rcldb/searchdataxml.cpp create mode 100644 src/rcldb/stemdb.cpp create mode 100644 src/rcldb/stemdb.h create mode 100644 src/rcldb/stoplist.cpp create mode 100644 src/rcldb/stoplist.h create mode 100644 src/rcldb/synfamily.cpp create mode 100644 src/rcldb/synfamily.h create mode 100644 src/rcldb/termproc.h create mode 100644 src/rcldb/xmacros.h create mode 100644 src/sampleconf/fields create mode 100644 src/sampleconf/fragbuts.xml create mode 100644 src/sampleconf/mimeconf create mode 100644 src/sampleconf/mimemap create mode 100644 src/sampleconf/mimeview create mode 100644 src/sampleconf/mimeview.mac create mode 100644 src/sampleconf/recoll.conf create mode 100644 src/sampleconf/recoll.qss create mode 100644 src/unac/AUTHORS create mode 100644 src/unac/COPYING create mode 100644 src/unac/README create mode 100644 src/unac/README.recoll create mode 100644 src/unac/unac.c create mode 100644 src/unac/unac.cpp create mode 100644 src/unac/unac.h create mode 100644 src/unac/unac_version.h create mode 100644 src/utils/Makefile create mode 100644 src/utils/appformime.cpp create mode 100644 src/utils/appformime.h create mode 100644 src/utils/base64.cpp create mode 100644 src/utils/base64.h create mode 100644 src/utils/cancelcheck.h create mode 100644 src/utils/circache.cpp create mode 100644 src/utils/circache.h create mode 100644 src/utils/closefrom.cpp create mode 100644 src/utils/closefrom.h create mode 100644 src/utils/conftree.cpp create mode 100644 src/utils/conftree.h create mode 100644 src/utils/copyfile.cpp create mode 100644 src/utils/copyfile.h create mode 100644 src/utils/cpuconf.cpp create mode 100644 src/utils/cpuconf.h create mode 100644 src/utils/debuglog.cpp create mode 100644 src/utils/debuglog.h create mode 100644 src/utils/ecrontab.cpp create mode 100644 src/utils/ecrontab.h create mode 100644 src/utils/execmd.cpp create mode 100644 src/utils/execmd.h create mode 100644 src/utils/fileudi.cpp create mode 100644 src/utils/fileudi.h create mode 100644 src/utils/fstreewalk.cpp create mode 100644 src/utils/fstreewalk.h create mode 100644 src/utils/hldata.h create mode 100644 src/utils/idfile.cpp create mode 100644 src/utils/idfile.h create mode 100644 src/utils/md5.cpp create mode 100644 src/utils/md5.h create mode 100644 src/utils/md5ut.cpp create mode 100644 src/utils/md5ut.h create mode 100644 src/utils/mimeparse.cpp create mode 100644 src/utils/mimeparse.h create mode 100644 src/utils/netcon.cpp create mode 100644 src/utils/netcon.h create mode 100644 src/utils/pathut.cpp create mode 100644 src/utils/pathut.h create mode 100644 src/utils/ptmutex.cpp create mode 100644 src/utils/ptmutex.h create mode 100644 src/utils/pxattr.cpp create mode 100644 src/utils/pxattr.h create mode 100644 src/utils/rclionice.cpp create mode 100644 src/utils/rclionice.h create mode 100644 src/utils/readfile.cpp create mode 100644 src/utils/readfile.h create mode 100644 src/utils/refcntr.h create mode 100644 src/utils/smallut.cpp create mode 100644 src/utils/smallut.h create mode 100644 src/utils/strmatcher.cpp create mode 100644 src/utils/strmatcher.h create mode 100644 src/utils/transcode.cpp create mode 100644 src/utils/transcode.h create mode 100644 src/utils/trexecmd.cpp create mode 100644 src/utils/utf8iter.cpp create mode 100644 src/utils/utf8iter.h create mode 100644 src/utils/utf8testin.txt create mode 100644 src/utils/utmkdefs.mk create mode 100644 src/utils/wipedir.cpp create mode 100644 src/utils/wipedir.h create mode 100644 src/utils/workqueue.cpp create mode 100644 src/utils/workqueue.h create mode 100644 src/utils/x11mon.cpp create mode 100644 src/utils/x11mon.h create mode 100644 src/windows/SolutionSettings/SolutionSettings.props create mode 100644 src/windows/SolutionSettings/SolutionSettings.vcxproj create mode 100644 src/windows/SolutionSettings/SolutionSettings.vcxproj.filters create mode 100644 src/windows/Win32ProjectRecoll.sln create mode 100644 src/windows/Win32ProjectRecoll.vcxproj create mode 100644 src/windows/Win32ProjectRecoll.vcxproj.filters create mode 100644 src/windows/Win32ProjectRecoll.vcxproj.user create mode 100644 src/windows/dirent.c create mode 100644 src/windows/dirent.h create mode 100644 src/windows/execmd_w.cpp create mode 100644 src/windows/fnmatch.c create mode 100644 src/windows/fnmatch.h create mode 100644 src/windows/mkinstdir.sh create mode 100644 src/windows/recollindex/recollindex.vcxproj create mode 100644 src/windows/recollindex/recollindex.vcxproj.filters create mode 100644 src/windows/recollindex/recollindex.vcxproj.user create mode 100644 src/windows/recollq/recollq.vcxproj create mode 100644 src/windows/recollq/recollq.vcxproj.filters create mode 100644 src/windows/strptime.cpp create mode 100644 src/windows/strptime.h create mode 100644 src/windows/targetver.h create mode 100644 src/windows/trexe/trexecmd/trexecmd.sln create mode 100644 src/windows/trexe/trexecmd/trexecmd.vcxproj create mode 100644 src/windows/trexe/trexecmd/trexecmd.vcxproj.filters create mode 100644 src/xaposix/config.h create mode 100644 src/xaposix/realtime.h create mode 100644 src/xaposix/safe.cc create mode 100644 src/xaposix/safeerrno.h create mode 100644 src/xaposix/safefcntl.h create mode 100644 src/xaposix/safesysstat.h create mode 100644 src/xaposix/safesyswait.h create mode 100644 src/xaposix/safeunistd.h create mode 100644 src/xaposix/safewindows.h create mode 100755 src/ylwrap create mode 100755 tests/7zip/7zip.sh create mode 100644 tests/7zip/7zip.txt create mode 100755 tests/Maildir/Maildir.sh create mode 100644 tests/Maildir/Maildir.txt create mode 100755 tests/Maildir1/Maildir1.sh create mode 100644 tests/Maildir1/Maildir1.txt create mode 100755 tests/abiword/abiword.sh create mode 100644 tests/abiword/abiword.txt create mode 100755 tests/anchor/anchor.sh create mode 100644 tests/anchor/anchor.txt create mode 100755 tests/andor/andor.sh create mode 100644 tests/andor/andor.txt create mode 100755 tests/badsuffs/badsuffs.sh create mode 100644 tests/badsuffs/badsuffs.txt create mode 100755 tests/badsuffs1/badsuffs1.sh create mode 100644 tests/badsuffs1/badsuffs1.txt create mode 100755 tests/boolean/boolean.sh create mode 100644 tests/boolean/boolean.txt create mode 100644 tests/casediac/casediac.sh create mode 100644 tests/casediac/casediac.txt create mode 100755 tests/chm/chm.sh create mode 100644 tests/chm/chm.txt create mode 100755 tests/cjk/cjk.sh create mode 100644 tests/cjk/cjk.txt create mode 100755 tests/compressed/compressed.sh create mode 100644 tests/compressed/compressed.txt create mode 100644 tests/config/fields create mode 100644 tests/config/mimeconf create mode 100644 tests/config/mimemap create mode 100644 tests/config/mimeview create mode 100644 tests/config/recoll.conf create mode 100755 tests/dates/dates.sh create mode 100644 tests/dates/dates.txt create mode 100755 tests/delete/delete.sh create mode 100644 tests/delete/delete.txt create mode 100755 tests/dia/dia.sh create mode 100644 tests/dia/dia.txt create mode 100755 tests/dir/dir.sh create mode 100644 tests/dir/dir.txt create mode 100755 tests/dirwithblanks/dirwithblanks.sh create mode 100644 tests/dirwithblanks/dirwithblanks.txt create mode 100755 tests/djvu/djvu.sh create mode 100644 tests/djvu/djvu.txt create mode 100755 tests/dvi/dvi.sh create mode 100644 tests/dvi/dvi.txt create mode 100755 tests/embed/embed.sh create mode 100644 tests/embed/embed.txt create mode 100755 tests/empty/empty.sh create mode 100644 tests/empty/empty.txt create mode 100755 tests/epub/epub.sh create mode 100644 tests/epub/epub.txt create mode 100755 tests/gnumeric/gnumeric.sh create mode 100644 tests/gnumeric/gnumeric.txt create mode 100755 tests/html/html.sh create mode 100644 tests/html/html.txt create mode 100755 tests/ics/ics.sh create mode 100644 tests/ics/ics.txt create mode 100755 tests/images/images.sh create mode 100644 tests/images/images.txt create mode 100755 tests/incexcl/incexcl.sh create mode 100644 tests/incexcl/incexcl.txt create mode 100644 tests/indexedmimetypes/indexedmimetypes.sh create mode 100644 tests/indexedmimetypes/indexedmimetypes.txt create mode 100755 tests/info/info.sh create mode 100644 tests/info/info.txt create mode 100755 tests/kar/kar.sh create mode 100644 tests/kar/kar.txt create mode 100755 tests/koi8r/koi8r.sh create mode 100644 tests/koi8r/koi8r.txt create mode 100755 tests/langparser/langparser.sh create mode 100644 tests/langparser/langparser.txt create mode 100755 tests/lyx/lyx.sh create mode 100644 tests/lyx/lyx.txt create mode 100755 tests/mail/mail.sh create mode 100644 tests/mail/mail.txt create mode 100755 tests/man/man.sh create mode 100644 tests/man/man.txt create mode 100755 tests/media/media.sh create mode 100644 tests/media/media.txt create mode 100755 tests/msword/msword.sh create mode 100644 tests/msword/msword.txt create mode 100644 tests/non-auto/testmbox.sh create mode 100755 tests/notypes/notypes.sh create mode 100644 tests/notypes/notypes.txt create mode 100755 tests/okular-notes/okular-notes.sh create mode 100644 tests/okular-notes/okular-notes.txt create mode 100755 tests/ooff/ooff.sh create mode 100644 tests/ooff/ooff.txt create mode 100755 tests/partialpurge/partialpurge.sh create mode 100644 tests/partialpurge/partialpurge.txt create mode 100755 tests/pdf/pdf.sh create mode 100644 tests/pdf/pdf.txt create mode 100755 tests/postscript/postscript.sh create mode 100644 tests/postscript/postscript.txt create mode 100755 tests/ppt/ppt.sh create mode 100644 tests/ppt/ppt.txt create mode 100755 tests/program/program.sh create mode 100644 tests/program/program.txt create mode 100755 tests/purple/purple.sh create mode 100644 tests/purple/purple.txt create mode 100644 tests/pythonapi/doc.py create mode 100644 tests/pythonapi/extract.py create mode 100755 tests/pythonapi/pythonapi.sh create mode 100644 tests/pythonapi/pythonapi.txt create mode 100644 tests/pythonapi/simple.py create mode 100644 tests/pythonapi/url.py create mode 100755 tests/rar/rar.sh create mode 100644 tests/rar/rar.txt create mode 100755 tests/rfc2231/rfc2231.sh create mode 100644 tests/rfc2231/rfc2231.txt create mode 100755 tests/rtf/rtf.sh create mode 100644 tests/rtf/rtf.txt create mode 100644 tests/runtests.sh create mode 100755 tests/scribus/scribus.sh create mode 100644 tests/scribus/scribus.txt create mode 100644 tests/shared.sh create mode 100755 tests/skipped/skipped.sh create mode 100644 tests/skipped/skipped.txt create mode 100755 tests/special/special.sh create mode 100644 tests/special/special.txt create mode 100755 tests/stemming/stemming.sh create mode 100644 tests/stemming/stemming.txt create mode 100755 tests/tar/tar.sh create mode 100644 tests/tar/tar.txt create mode 100755 tests/txt/txt.sh create mode 100644 tests/txt/txt.txt create mode 100755 tests/unacex/unacex.sh create mode 100644 tests/unacex/unacex.txt create mode 100755 tests/utf8/utf8.sh create mode 100644 tests/utf8/utf8.txt create mode 100755 tests/utfInPath/utfInPath.sh create mode 100644 tests/utfInPath/utfInPath.txt create mode 100644 tests/xattr/fields create mode 100755 tests/xattr/xattr.sh create mode 100644 tests/xattr/xattr.txt create mode 100755 tests/xls/xls.sh create mode 100644 tests/xls/xls.txt create mode 100755 tests/xml/xml.sh create mode 100644 tests/xml/xml.txt create mode 100755 tests/zip/zip.sh create mode 100644 tests/zip/zip.txt create mode 100644 unac/.version create mode 100644 unac/AUTHORS create mode 100644 unac/COPYING create mode 100644 unac/CaseFolding-5.1.0.txt create mode 100644 unac/CaseFolding-6.3.0.txt create mode 100644 unac/ChangeLog create mode 100644 unac/INSTALL create mode 100644 unac/Makefile.am create mode 100644 unac/Makefile.in create mode 100644 unac/NEWS create mode 100644 unac/README create mode 100644 unac/THANKS create mode 100644 unac/UnicodeData-5.1.0.txt create mode 100644 unac/UnicodeData-6.3.0.txt create mode 100644 unac/acinclude.m4 create mode 100644 unac/aclocal.m4 create mode 100644 unac/builder.in create mode 120000 unac/compile create mode 100755 unac/config.guess create mode 100644 unac/config.h.in create mode 100644 unac/config.rpath create mode 100755 unac/config.sub create mode 100755 unac/configure create mode 100644 unac/configure.ac create mode 100755 unac/depcomp create mode 100644 unac/getopt.c create mode 100644 unac/getopt.h create mode 100755 unac/install-sh create mode 100755 unac/ltconfig create mode 100644 unac/ltmain.sh create mode 100755 unac/missing create mode 100755 unac/mkinstalldirs create mode 100644 unac/stamp-h create mode 100644 unac/stamp-h.in create mode 100755 unac/t_unac.in create mode 100644 unac/test-driver create mode 100644 unac/unac.3 create mode 100644 unac/unac.c create mode 100644 unac/unac.h create mode 100644 unac/unac.pc.in create mode 100644 unac/unac.spec.in create mode 100644 unac/unac_version.h create mode 100644 unac/unaccent.1 create mode 100644 unac/unaccent.c create mode 100644 unac/unactest.c create mode 100644 unac/unactest1.c create mode 100644 website/BUGS.html create mode 100644 website/CHANGES.html create mode 100755 website/copydocs create mode 100644 website/credits.html create mode 100644 website/custom.html create mode 100644 website/devel.html create mode 100644 website/doc.html create mode 100644 website/download.html create mode 100644 website/favicon.ico create mode 100644 website/features.html create mode 100644 website/filters/filters.html create mode 100644 website/fr/features.html create mode 100644 website/helpernotes.html create mode 100644 website/id3lib.html create mode 100644 website/idxthreads/Makefile create mode 100644 website/idxthreads/assembly.dia create mode 100644 website/idxthreads/assembly.png create mode 100644 website/idxthreads/forkingRecoll.txt create mode 100644 website/idxthreads/multipara.dia create mode 100644 website/idxthreads/multipara.png create mode 100644 website/idxthreads/nothreads.dia create mode 100644 website/idxthreads/nothreads.png create mode 100644 website/idxthreads/threadingRecoll.html create mode 100644 website/idxthreads/threadingRecoll.txt create mode 100644 website/idxthreads/xapDocCopyCrash.txt create mode 100644 website/index.html.en create mode 100644 website/index.html.fr create mode 100644 website/perfs.html create mode 100644 website/pics/00REMAKEALB.sh create mode 100644 website/pics/index.html create mode 100644 website/pics/index.html.head create mode 100644 website/pics/mario.png create mode 100644 website/pics/piclist.txt create mode 100644 website/pics/recoll-HTML_search_results-thumb.png create mode 100644 website/pics/recoll-HTML_search_results.html create mode 100644 website/pics/recoll-HTML_search_results.png create mode 100644 website/pics/recoll-HTML_search_results.txt create mode 100644 website/pics/recoll0-thumb.png create mode 100644 website/pics/recoll0.html create mode 100644 website/pics/recoll0.png create mode 100644 website/pics/recoll0.txt create mode 100644 website/pics/recoll1-thumb.png create mode 100644 website/pics/recoll1.html create mode 100644 website/pics/recoll1.png create mode 100644 website/pics/recoll1.txt create mode 100644 website/pics/recoll2-thumb.png create mode 100644 website/pics/recoll2.html create mode 100644 website/pics/recoll2.png create mode 100644 website/pics/recoll2.txt create mode 100644 website/pics/recoll3-thumb.png create mode 100644 website/pics/recoll3.html create mode 100644 website/pics/recoll3.png create mode 100644 website/pics/recoll3.txt create mode 100644 website/pics/recoll4-thumb.png create mode 100644 website/pics/recoll4.html create mode 100644 website/pics/recoll4.png create mode 100644 website/pics/recoll4.txt create mode 100644 website/pics/recoll5-thumb.png create mode 100644 website/pics/recoll5.html create mode 100644 website/pics/recoll5.png create mode 100644 website/pics/recoll5.txt create mode 100644 website/pics/recoll64.png create mode 100644 website/pics/recoll_chinese-thumb.png create mode 100644 website/pics/recoll_chinese.html create mode 100644 website/pics/recoll_chinese.png create mode 100644 website/pics/recoll_chinese.txt create mode 100644 website/pics/result-table-thumb.png create mode 100644 website/pics/result-table.html create mode 100644 website/pics/result-table.png create mode 100644 website/pics/smile.png create mode 100644 website/rclidxfmt.html create mode 100644 website/recoll_XMP/index.html create mode 100644 website/recoll_XMP/jabref_metadata.png create mode 100644 website/recoll_XMP/recoll_query.png create mode 100644 website/release-1.14.4.html create mode 100644 website/release-1.15.html create mode 100644 website/release-1.16.html create mode 100644 website/release-1.17.html create mode 100644 website/release-1.18.html create mode 100644 website/release-1.19.html create mode 100644 website/release-1.20.html create mode 100644 website/release-1.21.html create mode 100644 website/release-history.html create mode 100644 website/resparpics/christopher.png create mode 100644 website/resparpics/clean.png create mode 100644 website/resparpics/default.png create mode 100644 website/resparpics/detailSmallGreyTable.png create mode 100644 website/resparpics/issue73+table.png create mode 100644 website/resparpics/issue73.png create mode 100644 website/resparpics/pip.png create mode 100644 website/resparpics/pz3.png create mode 100644 website/resparpics/structuredTable.png create mode 100644 website/resparpics/weblike.png create mode 100644 website/styles/style.css create mode 100644 website/support.html.en create mode 100644 website/usermanual/README-dir.txt create mode 100644 website/xapUpg100.html diff --git a/.hgignore b/.hgignore new file mode 100644 index 00000000..ecbfebe5 --- /dev/null +++ b/.hgignore @@ -0,0 +1,122 @@ +syntax: glob +*.dep +*.dep.stamp +*.o +.libs +*.la +stamp-h1 +.dirstamp +libtool +.deps +*.lo +*~ +\#* +*.obj +*.sdf +*.tlog +*.lib +*.idb +*.log +*.pdb +.vs +*.exe +*.ilk +ptrans +src/aclocal.m4 +src/compile +src/config.guess +src/config.sub +src/depcomp +src/install-sh +src/Makefile.in +src/ltmain.sh +src/m4/libtool.m4 +src/m4/ltoptions.m4 +src/m4/ltsugar.m4 +src/m4/ltversion.m4 +src/m4/lt~obsolete.m4 +src/missing +src/config.log +src/config.status +src/configure +src/Makefile +src/autom4te.cache +src/common/autoconfig.h +src/common/rclversion.h +src/doc/user/RCL.INDEXING.CONFIG.html +src/doc/user/RCL.INDEXING.EXTATTR.html +src/doc/user/RCL.INDEXING.EXTTAGS.html +src/doc/user/RCL.INDEXING.MONITOR.html +src/doc/user/RCL.INDEXING.PERIODIC.html +src/doc/user/RCL.INDEXING.STORAGE.html +src/doc/user/RCL.INDEXING.WEBQUEUE.html +src/doc/user/RCL.INDEXING.html +src/doc/user/RCL.INSTALL.BUILDING.html +src/doc/user/RCL.INSTALL.CONFIG.html +src/doc/user/RCL.INSTALL.EXTERNAL.html +src/doc/user/RCL.INSTALL.html +src/doc/user/RCL.INTRODUCTION.RECOLL.html +src/doc/user/RCL.INTRODUCTION.SEARCH.html +src/doc/user/RCL.INTRODUCTION.html +src/doc/user/RCL.PROGRAM.API.html +src/doc/user/RCL.PROGRAM.FIELDS.html +src/doc/user/RCL.PROGRAM.html +src/doc/user/RCL.SEARCH.ANCHORWILD.html +src/doc/user/RCL.SEARCH.CASEDIAC.html +src/doc/user/RCL.SEARCH.COMMANDLINE.html +src/doc/user/RCL.SEARCH.DESKTOP.html +src/doc/user/RCL.SEARCH.KIO.html +src/doc/user/RCL.SEARCH.LANG.html +src/doc/user/RCL.SEARCH.PTRANS.html +src/doc/user/RCL.SEARCH.html +src/doc/user/index.html +src/doc/user/usermanual.html +src/doc/user/usermanual.pdf +src/filters/rclexecm.pyc +src/filters/rcllatinclass.pyc +src/recollindex +src/recollq +src/xadump +src/kde/kioslave/kio_recoll/builddir +src/python/recoll/build +src/python/recoll/recoll/__init__.pyc +src/python/recoll/setup.py +src/python/samples/recollgui/rclmain.py +src/python/samples/recollgui/rclmain.pyc +src/qtgui/.moc/* +src/qtgui/.obj/* +src/qtgui/.ui/* +src/qtgui/Makefile +src/qtgui/qrc_recoll.cpp +src/qtgui/recoll +src/qtgui/recoll.app +src/qtgui/recoll.pro +src/query/alldeps +src/query/recollq +src/sampleconf/rclmon.sh +src/sampleconf/recoll.conf +src/utils/alldeps +tests/casediac/aspdict.en.rws +tests/casediac/idxstatus.txt +tests/casediac/index.pid +tests/casediac/mimeview +tests/casediac/missing +tests/casediac/recoll.conf +tests/casediac/xapiandb +tests/config/aspdict.en.rws +tests/config/history +tests/config/idxstatus.txt +tests/config/index.pid +tests/config/missing +tests/config/xapiandb +tests/indexedmimetypes/aspdict.en.rws +tests/indexedmimetypes/idxstatus.txt +tests/indexedmimetypes/index.pid +tests/indexedmimetypes/mimeview +tests/indexedmimetypes/missing +tests/indexedmimetypes/recoll.conf +tests/indexedmimetypes/xapiandb +tests/xattr/mimeview +website/usermanual/* +website/idxthreads/forkingRecoll.html +website/idxthreads/xapDocCopyCrash.html diff --git a/packaging/FreeBSD/recoll/Makefile b/packaging/FreeBSD/recoll/Makefile new file mode 100644 index 00000000..a2ecc56d --- /dev/null +++ b/packaging/FreeBSD/recoll/Makefile @@ -0,0 +1,34 @@ +# New ports collection makefile for: recoll +# Date created: 5 December 2005 +# Whom: J.F. Dockes +# +# $FreeBSD: ports/deskutils/recoll/Makefile,v 1.44 2010/10/09 17:52:42 makc Exp $ +# + +PORTNAME= recoll +PORTVERSION= 1.16.2 +CATEGORIES= deskutils +MASTER_SITES= http://www.lesbonscomptes.com/recoll/ + +MAINTAINER= jf@dockes.org +COMMENT= A personal full text search package, based on QT and Xapian + +BUILD_DEPENDS= xapian-core>=1.0.12:${PORTSDIR}/databases/xapian-core +RUN_DEPENDS:= ${BUILD_DEPENDS} + +USE_QT_VER= 4 +QT_COMPONENTS= gui qmake_build uic_build moc_build rcc_build +GNU_CONFIGURE= yes +USE_GMAKE= yes +USE_ICONV= yes +INSTALLS_ICONS= yes +USE_FAM= yes + +MAN1= recoll.1 recollindex.1 +MAN5= recoll.conf.5 + +post-patch: + ${REINPLACE_CMD} -e 's/^CXXFLAGS =/CXXFLAGS ?=/' \ + ${WRKSRC}/mk/localdefs.in + +.include diff --git a/packaging/FreeBSD/recoll/distinfo b/packaging/FreeBSD/recoll/distinfo new file mode 100644 index 00000000..305b0c06 --- /dev/null +++ b/packaging/FreeBSD/recoll/distinfo @@ -0,0 +1,2 @@ +SHA256 (recoll-1.16.2.tar.gz) = f0f29dff2d82ef8541c51963870f31daf28472f3c8822c81c17c346769b77355 +SIZE (recoll-1.16.2.tar.gz) = 1422148 diff --git a/packaging/FreeBSD/recoll/pkg-descr b/packaging/FreeBSD/recoll/pkg-descr new file mode 100644 index 00000000..1aa20b03 --- /dev/null +++ b/packaging/FreeBSD/recoll/pkg-descr @@ -0,0 +1,24 @@ +Recoll is a personal full text search package with a QT graphical +interface. It is based on a very strong backend (Xapian), for which it +provides an easy to use and feature-rich interface. + +Features: + * Free, GPL license. + * QT-based GUI. + * Supports the following document types (and their compressed versions): + - Natively: text, html, OpenOffice files, maildir and mailbox + (Mozilla and Thunderbird mail ok) with attachments, gaim log files. + - With external helpers: pdf (pdftotext), postscript (ghostscript), + msword (antiword), excel, ppt (catdoc), rtf (unrtf), + * Powerful query facilities, with boolean searches, phrases, filter on + file types and directory tree. + * Support for multiple charsets. Internal processing and storage uses + Unicode UTF-8. + * Stemming performed at query time (can switch stemming language after + indexing) + * Easy installation. No database daemon, web server or exotic language + necessary. + * An indexer which runs either as a thread inside the GUI or as an + external, cron'able program. + +WWW: http://www.lesbonscomptes.com/recoll/ diff --git a/packaging/FreeBSD/recoll/pkg-plist b/packaging/FreeBSD/recoll/pkg-plist new file mode 100644 index 00000000..bfcd9397 --- /dev/null +++ b/packaging/FreeBSD/recoll/pkg-plist @@ -0,0 +1,100 @@ +bin/recoll +bin/recollindex +share/applications/recoll-searchgui.desktop +share/icons/hicolor/48x48/apps/recoll.png +share/pixmaps/recoll.png +%%DATADIR%%/doc/docbook.css +%%DATADIR%%/doc/usermanual.html +%%DATADIR%%/examples/fields +%%DATADIR%%/examples/mimeconf +%%DATADIR%%/examples/mimemap +%%DATADIR%%/examples/mimeview +%%DATADIR%%/examples/rclmon.sh +%%DATADIR%%/examples/recoll.conf +%%DATADIR%%/filters/hotrecoll.py +%%DATADIR%%/filters/rclabw +%%DATADIR%%/filters/rclaptosidman +%%DATADIR%%/filters/rclaudio +%%DATADIR%%/filters/rclchm +%%DATADIR%%/filters/rcldjvu +%%DATADIR%%/filters/rcldoc +%%DATADIR%%/filters/rcldvi +%%DATADIR%%/filters/rclexecm.py +%%DATADIR%%/filters/rclfb2 +%%DATADIR%%/filters/rclflac +%%DATADIR%%/filters/rclgaim +%%DATADIR%%/filters/rclics +%%DATADIR%%/filters/rclid3 +%%DATADIR%%/filters/rclimg +%%DATADIR%%/filters/rclinfo +%%DATADIR%%/filters/rclkar +%%DATADIR%%/filters/rclkwd +%%DATADIR%%/filters/rcllatinclass.py +%%DATADIR%%/filters/rcllatinstops.zip +%%DATADIR%%/filters/rcllyx +%%DATADIR%%/filters/rclman +%%DATADIR%%/filters/rclnull +%%DATADIR%%/filters/rclogg +%%DATADIR%%/filters/rclopxml +%%DATADIR%%/filters/rclpdf +%%DATADIR%%/filters/rclppt +%%DATADIR%%/filters/rclps +%%DATADIR%%/filters/rclpurple +%%DATADIR%%/filters/rclpython +%%DATADIR%%/filters/rclrar +%%DATADIR%%/filters/rclrtf +%%DATADIR%%/filters/rclscribus +%%DATADIR%%/filters/rclshowinfo +%%DATADIR%%/filters/rclsiduxman +%%DATADIR%%/filters/rclsoff +%%DATADIR%%/filters/rclsvg +%%DATADIR%%/filters/rcltex +%%DATADIR%%/filters/rcltext +%%DATADIR%%/filters/rcluncomp +%%DATADIR%%/filters/rclwar +%%DATADIR%%/filters/rclwpd +%%DATADIR%%/filters/rclxls +%%DATADIR%%/filters/rclzip +%%DATADIR%%/filters/rcl7z +%%DATADIR%%/filters/xdg-open +%%DATADIR%%/images/aptosid-book.png +%%DATADIR%%/images/aptosid-manual.png +%%DATADIR%%/images/document.png +%%DATADIR%%/images/drawing.png +%%DATADIR%%/images/folder.png +%%DATADIR%%/images/html.png +%%DATADIR%%/images/image.png +%%DATADIR%%/images/message.png +%%DATADIR%%/images/mozilla_doc.png +%%DATADIR%%/images/pdf.png +%%DATADIR%%/images/pidgin.png +%%DATADIR%%/images/postscript.png +%%DATADIR%%/images/presentation.png +%%DATADIR%%/images/sidux-book.png +%%DATADIR%%/images/source.png +%%DATADIR%%/images/sownd.png +%%DATADIR%%/images/soffice.png +%%DATADIR%%/images/spreadsheet.png +%%DATADIR%%/images/text-x-python.png +%%DATADIR%%/images/txt.png +%%DATADIR%%/images/wordprocessing.png +%%DATADIR%%/translations/recoll_cs.qm +%%DATADIR%%/translations/recoll_fr.qm +%%DATADIR%%/translations/recoll_it.qm +%%DATADIR%%/translations/recoll_lt.qm +%%DATADIR%%/translations/recoll_de.qm +%%DATADIR%%/translations/recoll_uk.qm +%%DATADIR%%/translations/recoll_ru.qm +%%DATADIR%%/translations/recoll_tr.qm +%%DATADIR%%/translations/recoll_xx.qm +@dirrm %%DATADIR%%/doc +@dirrm %%DATADIR%%/examples +@dirrm %%DATADIR%%/filters +@dirrm %%DATADIR%%/images +@dirrm %%DATADIR%%/translations +@dirrm %%DATADIR%% +@dirrmtry share/applications +@dirrmtry share/icons/hicolor/48x48/apps +@dirrmtry share/icons/hicolor/48x48 +@dirrmtry share/icons/hicolor +@dirrmtry share/icons diff --git a/packaging/debian/buildppa.sh b/packaging/debian/buildppa.sh new file mode 100644 index 00000000..521a3dc2 --- /dev/null +++ b/packaging/debian/buildppa.sh @@ -0,0 +1,180 @@ +#!/bin/sh +# Packages needed +# sudo apt-get install g++ gnupg dput lintian mini-dinstall yaclc bzr devscripts +# For the kio: (and kdesdk?) +# sudo apt-get install pkg-kde-tools cdbs + +RCLVERS=1.21.0 +LENSVERS=1.19.10.3543 +SCOPEVERS=1.20.2.4 +PPAVERS=1 + +# +RCLSRC=/y/home/dockes/projets/fulltext/recoll/src +SCOPESRC=/y/home/dockes/projets/fulltext/unity-scope-recoll +RCLDOWNLOAD=/y/home/dockes/projets/lesbonscomptes/recoll + +case $RCLVERS in + [23]*) PPANAME=recollexp-ppa;; + 1.14*) PPANAME=recoll-ppa;; + *) PPANAME=recoll15-ppa;; +esac +PPANAME=recollexp-ppa +echo "PPA: $PPANAME. Type CR if Ok, else ^C" +read rep + +fatal() +{ + echo $*; exit 1 +} + +check_recoll_orig() +{ + if test ! -f recoll_${RCLVERS}.orig.tar.gz ; then + cp -p $RCLDOWNLOAD/recoll-${RCLVERS}.tar.gz \ + recoll_${RCLVERS}.orig.tar.gz || \ + fatal "Can find neither recoll_${RCLVERS}.orig.tar.gz nor " \ + "recoll-${RCLVERS}.tar.gz" + fi +} + +####### QT4 +debdir=debian +# Note: no new releases for lucid: no webkit. Or use old debianrclqt4 dir. +#series="precise trusty utopic vivid" +series= + +if test "X$series" != X ; then + check_recoll_orig + test -d recoll-${RCLVERS} || tar xvzf recoll_${RCLVERS}.orig.tar.gz +fi + +for series in $series ; do + + rm -rf recoll-${RCLVERS}/debian + cp -rp ${debdir}/ recoll-${RCLVERS}/debian || exit 1 + + if test -f $debdir/control-$series ; then + cp -f -p $debdir/control-$series recoll-${RCLVERS}/debian/control + else + cp -f -p $debdir/control recoll-${RCLVERS}/debian/control + fi + + sed -e s/SERIES/${series}/g \ + -e s/PPAVERS/${PPAVERS}/g \ + < ${debdir}/changelog > recoll-${RCLVERS}/debian/changelog + + (cd recoll-${RCLVERS};debuild -S -sa) || break + + dput $PPANAME recoll_${RCLVERS}-1~ppa${PPAVERS}~${series}1_source.changes +done + +### KIO +series="precise trusty utopic vivid" +series=vivid + +debdir=debiankio +topdir=kio-recoll-${RCLVERS} +if test "X$series" != X ; then + check_recoll_orig + if test ! -f kio-recoll_${RCLVERS}.orig.tar.gz ; then + cp -p recoll_${RCLVERS}.orig.tar.gz \ + kio-recoll_${RCLVERS}.orig.tar.gz || exit 1 + fi + if test ! -d $topdir ; then + mkdir temp + cd temp + tar xvzf ../recoll_${RCLVERS}.orig.tar.gz || exit 1 + mv recoll-${RCLVERS} ../$topdir || exit 1 + cd .. + fi +fi +for series in $series ; do + + rm -rf $topdir/debian + cp -rp ${debdir}/ $topdir/debian || exit 1 + + sed -e s/SERIES/$series/g \ + -e s/PPAVERS/${PPAVERS}/g \ + < ${debdir}/changelog > $topdir/debian/changelog ; + + (cd $topdir;debuild -S -sa) || exit 1 + + dput $PPANAME kio-recoll_${RCLVERS}-0~ppa${PPAVERS}~${series}1_source.changes + +done + +### Unity Lens +series="precise" +series= + +debdir=debianunitylens +topdir=recoll-lens-${LENSVERS} +if test "X$series" != X ; then + if test ! -f recoll-lens_${LENSVERS}.orig.tar.gz ; then + if test -f recoll-lens-${LENSVERS}.tar.gz ; then + mv recoll-lens-${LENSVERS}.tar.gz \ + recoll-lens_${LENSVERS}.orig.tar.gz + else + fatal "Can find neither recoll-lens_${LENSVERS}.orig.tar.gz nor " \ + "recoll-lens-${LENSVERS}.tar.gz" + fi + fi + test -d $topdir || tar xvzf recoll-lens_${LENSVERS}.orig.tar.gz || exit 1 +fi + +for series in $series ; do + + rm -rf $topdir/debian + cp -rp ${debdir}/ $topdir/debian || exit 1 + + sed -e s/SERIES/$series/g \ + -e s/PPAVERS/${PPAVERS}/g \ + < ${debdir}/changelog > $topdir/debian/changelog ; + + (cd $topdir;debuild -S -sa) || break + + dput $PPANAME \ + recoll-lens_${LENSVERS}-1~ppa${PPAVERS}~${series}1_source.changes + +done + +### Unity Scope +series="trusty utopic vivid" +series= + +debdir=debianunityscope +if test ! -d ${debdir}/ ; then + rm -f ${debdir} + ln -s ${SCOPESRC}/debian $debdir +fi +topdir=unity-scope-recoll-${SCOPEVERS} +if test "X$series" != X ; then + if test ! -f unity-scope-recoll_${SCOPEVERS}.orig.tar.gz ; then + if test -f unity-scope-recoll-${SCOPEVERS}.tar.gz ; then + mv unity-scope-recoll-${SCOPEVERS}.tar.gz \ + unity-scope-recoll_${SCOPEVERS}.orig.tar.gz + else + fatal "Can find neither " \ + "unity-scope-recoll_${SCOPEVERS}.orig.tar.gz nor " \ + "unity-scope-recoll-${SCOPEVERS}.tar.gz" + fi + fi + test -d $topdir || tar xvzf unity-scope-recoll_${SCOPEVERS}.orig.tar.gz \ + || exit 1 +fi +for series in $series ; do + + rm -rf $topdir/debian + cp -rp ${debdir}/ $topdir/debian || exit 1 + + sed -e s/SERIES/$series/g \ + -e s/PPAVERS/${PPAVERS}/g \ + < ${debdir}/changelog > $topdir/debian/changelog ; + + (cd $topdir;debuild -S -sa) || break + + dput $PPANAME \ + unity-scope-recoll_${SCOPEVERS}-1~ppa${PPAVERS}~${series}1_source.changes + +done diff --git a/packaging/debian/debian/README.Debian b/packaging/debian/debian/README.Debian new file mode 100644 index 00000000..3866c0a6 --- /dev/null +++ b/packaging/debian/debian/README.Debian @@ -0,0 +1,23 @@ +README for Debian +----------------- + + Installing over an older version: 1.18 introduces significant index formats + changes to support optional character case and diacritics sensitivity, and it + will be advisable to reset the index in most cases. This will be best done by + destroying the index directory (rm -rf ~/.recoll/xapiandb). + + If 1.18 is not configured for case and diacritics sensitivity, it is mostly + compatible with 1.17 indexes. + + -- Kartik Mistry Tue, 13 Nov 2012 12:33:00 +0530 + + Installing over an older version: 1.16 is mostly compatible with 1.15 indexes, + except for a few differences for weird terms containing punctuation signs. + Perform a full index pass if installing over an older version. The simplest + way to do this is to quit all recoll programs and just delete the index + directory (rm -rf ~/.recoll/xapiandb), then start recoll or recollindex. + recollindex -z will do the same in most cases. + + Also, using the anchored search feature requires a full reindex. + + -- Kartik Mistry Thu, 22 Sep 2011 21:30:05 +0530 diff --git a/packaging/debian/debian/changelog b/packaging/debian/debian/changelog new file mode 100644 index 00000000..d76e1075 --- /dev/null +++ b/packaging/debian/debian/changelog @@ -0,0 +1,579 @@ +recoll (1.21.0-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * New bison-based query parser. + * Improves filter execution performance + * Save/reload queries + + -- Jean-Francois Dockes Tue, 16 Jun 2015 18:10:00 +0200 + +recoll (1.20.6-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * Fix some decompression issues with serious performance and + system load consequences in some cases (depending on data): minimum + checking that enough temp space is available before uncompressing, no + need to uncompress tar.gz files, set a default of 20 MBs for + maxcompressedfilekbs. + * rclscribus fixes. + * GUI messages: Danish translation and fix 2 dialogs which were not + translated improvements. + + -- Jean-Francois Dockes Sat, 25 Apr 2015 14:36:00 +0200 + +recoll (1.20.4-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * Should have been in 1.20.3: skip compressed fs image files like xxx.img.gz + by default (mimemap:recoll_noindex). + + -- Jean-Francois Dockes Mon, 30 Mar 2015 10:06:00 +0200 + +recoll (1.20.3-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * fixes a bug where the real time indexer did not process the web queue + * miscellaneous usability improvements in the GUI. + * Copy sample fragbuts.xml file if it does not exist + + -- Jean-Francois Dockes Sat, 28 Mar 2015 09:40:00 +0200 + +recoll (1.20.1-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.20.1 brings improved indexing of compound words like email addresses + and miscellaneous usability improvements in the GUI. + + -- Jean-Francois Dockes Fri, 19 Dec 2014 08:14:00 +0200 + +recoll (1.19.14p2-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.14p2 fixes Bengali diacritics processing, a memory leak in the + Python module, and a few minor issues in the filters. + + -- Jean-Francois Dockes Thu, 11 Sep 2014 07:47:00 +0200 + +recoll (1.19.14p1-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.14p1 fixes a descriptor and memory leak in the Python module. The + main programs and library are unchanged. + + -- Jean-Francois Dockes Thu, 26 Jun 2014 13:14:00 +0200 + +recoll (1.19.14-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.14 fixes two relatively minor but ennoying issues in indexing: + + - The use of a separate readonly Database object for querying the index + while indexing would trigger Xapian errors, (bad block reads), and + subsequent up-to-date check failures (leading to unnecessary + reindexing). The jury is out as to the cause, but using the same + object for reading and writing seems to eliminate the problem. + + - A spurious log message in the child process between forking and + executing the filter could block on a mutex, and lead to a 20 mn + timeout for the affected father process thread (happened only in + multithread mode). + + -- Jean-Francois Dockes Sat, 07 Jun 2014 18:56:00 +0200 + +recoll (1.19.13-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.13 hopefully fixes the multithreaded indexing crashes and silences + the noisy ppt extractor failures. + + -- Jean-Francois Dockes Thu, 06 May 2014 14:22:00 +0200 + +recoll (1.19.12p2-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.12 p1 + restable doubleclick + + -- Jean-Francois Dockes Sun, 07 Apr 2014 16:17:00 +0200 + +recoll (1.19.12p1-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * 1.19.12 install forgot the xls filter + + -- Jean-Francois Dockes Sun, 06 Apr 2014 06:57:00 +0200 + +recoll (1.19.12-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * Minor fixes to 1.19.11. Make metadata stored length a parameter. + * New xls dumper based on mso-dumper removes catdoc dependancy + * Move out the code for the Ubuntu Unity lens and scope + + -- Jean-Francois Dockes Mon, 02 Apr 2014 15:12:00 +0200 + +recoll (1.19.11p1-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * minor fixes to 1.19.10 + + -- Jean-Francois Dockes Mon, 27 Nov 2013 09:54:00 +0200 + +recoll (1.19.10-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * Support for saucy in 1.19. Separate python and python3 packages + + -- Jean-Francois Dockes Sat, 23 Nov 2013 16:01:46 +0100 + +recoll (1.18.1-1) experimental; urgency=low + + * New upstream version: + + Please read README.Debian for changes in index db format. + * debian/patches/txtcsvopen.diff: + + Dropped. Merged upstream. + * debian/patches/fix-manpage-typos.patch: + + Added patch to fix manpage typos and groff errors. + * debian/control: + + Added VCS-* fields. + + -- Kartik Mistry Tue, 13 Nov 2012 12:29:46 +0530 + +recoll (1.17.3-2) unstable; urgency=medium + + * debian/rules: + + Call dh_python2 for python-recoll. (Closes: #681586) + * debian/control: + + Added X-Python-Version field for correct Python version dependency. + + -- Kartik Mistry Sat, 14 Jul 2012 20:20:56 +0530 + +recoll (1.17.3-1) unstable; urgency=low + + * New upstream release. + * debian/patches/txtcsvopen.diff: + + Added patch to fix opening of compressed text-files with gnumeric. + (Closes: #674756) + + -- Kartik Mistry Fri, 08 Jun 2012 11:46:57 +0530 + +recoll (1.17.2-1) unstable; urgency=low + + * New upstream release: + + Dropped patches: fix-kFreeBSD-ftbfs.patch, recoll_ionice_getpid.patch. + These are merged with upstream. + + Refreshed patch: fix-python-install.patch. + * debian/rules, debian/control: + + Added hardening support. + * debian/copyright: + + Fixed duplicate Copyright sections. + + -- Kartik Mistry Fri, 18 May 2012 10:59:21 +0530 + +recoll (1.17.1-2) unstable; urgency=low + + * debian/patches: + + fix-kFreeBSD-ftbfs.patch: Added patch to fix FTBFS on kFreeBSD from + upstream (Closes: #667083) + + recoll_ionice_getpid.patch: Added patch to fix FTBFS with gcc-4.7 from + upstream (Closes: #667352) + + -- Kartik Mistry Wed, 04 Apr 2012 12:16:48 +0530 + +recoll (1.17.1-1) unstable; urgency=low + + * New upstream release. + * Enable Python module resulting into new binary: python-recoll. + * debian/control: + + Updated Build-Deps: libqtwebkit-dev, python-all-dev. + + Added python-recoll binary. + + Updated Standards-Version to 3.9.3 + * debian/rules: + + Build Python module by default. + * debian/recoll.menu, debian/python-recoll.install, debian/recoll.install: + + Changes for new binary package. + * debian/copyright: + + Updated to copyright-format 1.0 + + Updated upstream and Debian copyright. + + Fixed unicode.org/copyright.html URL. + + -- Kartik Mistry Tue, 27 Mar 2012 12:15:51 +0530 + +recoll (1.16.2-1) unstable; urgency=low + + * New upstream release. + * debian/copyright: + + Updated as per DEP-5 format, simplying copyright file. + * debian/control: + + Dropped: flac, vorbis-tools and libid3-tools from Suggests, as + python-mutagen handles audio now. + + Dropped: lyx from Suggests, as it will be too heavy for most of users as + discussed with upstream. + * debian/rules: + + Use STRIP variable to strip during install phase. This makes patch + 01_nostrip_final_binaries_437901.diff obsolete, removed this patch. + + -- Kartik Mistry Wed, 09 Nov 2011 20:35:16 +0530 + +recoll (1.16.1-1) unstable; urgency=low + + * New upstream release. + * debian/copyright: + + Added missing GPL-3 URL in debian/* copyright section. + + -- Kartik Mistry Thu, 29 Sep 2011 10:06:54 +0530 + +recoll (1.16.0-1) unstable; urgency=low + + * New upstream release: + + See README.Debian for upgrade note and information. + * debian/copyright: + + Updated as per latest DEP-5 format. + * debian/control: + + Recommends: xdg-utils now. + * debian/rules: + + Added recommends build targets. + + -- Kartik Mistry Thu, 22 Sep 2011 21:30:25 +0530 + +recoll (1.15.9-1) unstable; urgency=low + + * New upstream release: + + Dropped patch 02_recoll_staticfix_626882.diff, merged upstream + + -- Kartik Mistry Wed, 15 Jun 2011 09:20:20 +0530 + +recoll (1.15.8-2) unstable; urgency=low + + * debian/patches/02_recoll_staticfix_626882.diff: + + Added patch to fix segfault in 1.15.8. Patch from Jean-Francois Dockes + (Closes: #626882) + + -- Kartik Mistry Tue, 17 May 2011 09:57:50 +0530 + +recoll (1.15.8-1) unstable; urgency=low + + * New upstream release. + * debian/patches/02_kfreebsd-ftbfs.diff: + + Removed. Merged with upstream. + * debian/control: + + Updated to Standards-Version 3.9.2 (no changes needed) + + -- Kartik Mistry Thu, 12 May 2011 09:47:21 +0530 + +recoll (1.15.7-2) unstable; urgency=low + + * Applied patch 02_kfreebsd-ftbfs.diff from upstream to fix FTBFS + on kFreeBSD-* (Closes: #618796) + * debian/copyright: + + Updated to latest DEP-5 specification + + -- Kartik Mistry Fri, 15 Apr 2011 18:38:54 +0530 + +recoll (1.15.7-1) unstable; urgency=low + + * New upstream release: + + Fixed: Segmentation fault when file type radio button clicked. + (Closes: #617353) + * debian/patches/02_manpage_fix.diff: + + Removed. Merged with upstream. + + -- Kartik Mistry Sun, 13 Mar 2011 09:07:57 +0530 + +recoll (1.15.2-1) unstable; urgency=low + + * Upload to unstable + * New upstream release + * debian/patches: + + Refreshed 01_nostrip_final_binaries_437901.diff + + Added 02_manpage_fix.diff to fix manpage groff issues + + -- Kartik Mistry Tue, 15 Feb 2011 11:25:58 +0530 + +recoll (1.14.4-1) experimental; urgency=low + + * New upstream release + * debian/copyright: + + Updated for DEP-5 format specification + + -- Kartik Mistry Thu, 02 Dec 2010 00:29:06 +0530 + +recoll (1.14.2-1) experimental; urgency=low + + * New upstream release + * debian/control: + + Added xlstproc as Recommends (Closes: #587684) + + Added python-mutagen as Suggests + * debian/patches: + + Refreshed 01_nostrip_final_binaries_437901.diff + + Removed 02_recoll-prepare-for-xapian-1.2.diff, merged with upstream + + -- Kartik Mistry Mon, 27 Sep 2010 17:52:17 +0530 + +recoll (1.13.04-3) unstable; urgency=low + + * Added patch for xapian 1.2 compatibility from Olly Betts + (Closes: #579929) + + -- Kartik Mistry Mon, 03 May 2010 09:47:16 +0530 + +recoll (1.13.04-2) unstable; urgency=low + + * debian/control: + + Added missing packages to Suggests: flac, libid3-tools, lyx, pstotext, + python-chm, untex, vorbis-tools Thanks to Ivan Vilata i Balaguer + (Closes: #578441) + + -- Kartik Mistry Fri, 23 Apr 2010 11:07:00 +0530 + +recoll (1.13.04-1) unstable; urgency=low + + * New upstream release + + -- Kartik Mistry Fri, 16 Apr 2010 10:39:02 +0530 + +recoll (1.13.02-2) unstable; urgency=low + + * debian/control: + + Don't suggest xpdf (Closes: #569333) + * debian/copyright: + + Updated Debian package copyright year + * Removed unused README.source file + + -- Kartik Mistry Fri, 19 Feb 2010 10:42:53 +0530 + +recoll (1.13.02-1) unstable; urgency=low + + * New upstream release + * debian/control: + + Updated to Standards-Version 3.8.4 (no changes needed) + + -- Kartik Mistry Wed, 03 Feb 2010 11:00:53 +0530 + +recoll (1.13.01-1) unstable; urgency=low + + * New upstream release + + Fixed bug that causes field values ignored for Capitalized words and + phrases + + -- Kartik Mistry Fri, 08 Jan 2010 10:09:15 +0530 + +recoll (1.13.00-1) unstable; urgency=low + + * New upstream release + * debian/control: + + Fixed package descriptions, replaced QT->Qt (Closes: #563725) + * debian/patches/01_nostrip_final_binaries_437901.diff: + + Refreshed patch for upstream changes + * Converted package to new source format '3.0 (quilt)' + + -- Kartik Mistry Tue, 05 Jan 2010 23:23:30 +0530 + +recoll (1.12.4-1) unstable; urgency=low + + * New upstream release: + + Fixed FTBFS with binutils-gold (Closes: #556315) + + -- Kartik Mistry Fri, 11 Dec 2009 00:08:37 +0530 + +recoll (1.12.3-1) unstable; urgency=low + + * New upstream release + * debian/control: + + Updated Build-Depends on libqt4-dev as we are building Qt4 ui now + * debian/rules: + + Make sure that we call qmake-qt4 + + -- Kartik Mistry Thu, 29 Oct 2009 22:44:50 +0530 + +recoll (1.12.2-1) unstable; urgency=low + + * New upstream release: + + Dropped patch 02_manpage_fixes.diff, merged with upstream + * Added debian/README.source file to confirm with latest policy + * Removed debian/docs, we are using dh_installdocs in debian/rules + * debian/control: + + Wrapped up Build-Depends + + Depends on quilt, since patch system is using quilt now + + Updated to Standards-Version 3.8.3 + + Updated dependency on libxapian-dev (>= 1.0.15) + * debian/rules: + + Changes for quilt migration + + -- Kartik Mistry Fri, 23 Oct 2009 10:14:05 +0530 + +recoll (1.12.1-1) unstable; urgency=low + + * New upstream release + * debian/control: + + Updated to Standards-Version 3.8.2 (no changes needed) + * debian/copyright: + + [Lintian] Removed licenses URL links to symlink + + -- Kartik Mistry Sat, 27 Jun 2009 20:08:28 +0530 + +recoll (1.12.0-1) unstable; urgency=low + + * New upstream release + * debian/copyright: + + [Lintian] Updated for use of correct copyright symbol © instead of (C) + + Updated Debian packaging copyright year + * debian/rules: + + Used dh_prep instead of deprecated dh_clean -k + * debian/control: + + Updated debhelper dependency to 7 + * debian/patches: + + Dropped 02_gcc-snapshot-missing-headers-fix.dpatch, merged with upstream + + Added patch 02_manpage_fixes.dpatch for groff warnings + + -- Kartik Mistry Sat, 28 Feb 2009 14:33:53 +0530 + +recoll (1.11.0-2) unstable; urgency=low + + * debian/control: + + Added versioned build-dep on libxapian-dev, Thanks to Brad Sawatzky + for catch (Closes: #507473) + + Add libimage-exiftool-perl as Suggests in which I forgot in + previous upload + * debian/changelog: + + Fixed typo from previous upload entry + + -- Kartik Mistry Wed, 03 Dec 2008 15:05:55 +0530 + +recoll (1.11.0-1) unstable; urgency=low + + * New upstream release: + + Remembers missing filters in first run (Closes: #500690) + * debian/control: + + Added libimage-exiftool-perl as Suggests (Closes: #502427) + + Added Python as recommaded due to filters/rclpython script + although, its not necessary as it will be installed only + when Python is present + * debian/patches: + + Refreshed patch for gcc 4.4 FTBFS (Closes: #505376) + * debian/copyright: + + Updated for newly added filter and image files + + -- Kartik Mistry Thu, 13 Nov 2008 21:18:15 +0530 + +recoll (1.10.6-1) unstable; urgency=low + + * New upstream release + + Fixed typo in tooltip in indexing configuration (Closes: #486689) + + Dropped patch 03_manpage_fixes.dpatch, merged with upstream + * debian/control: + + Updated to Standards-Version 3.8.0 (no changes needed) + + Updated my maintainer email address + * debian/copyright: + + Updated my maintainer email address + + Updated license text to proposed license format + + Updated upstream copyright year + + -- Kartik Mistry Thu, 11 Sep 2008 16:06:48 +0530 + +recoll (1.10.2-1) unstable; urgency=low + + * New upstream release + + Updated patch debian/patches/02_gcc-snapshot-missing-headers-fix.dpatch + Some portions are now merged with upstream + * debian/copyright: + + Fixed indentation to 80 characters + + Updated Debian package copyright year + + -- Kartik Mistry Thu, 29 May 2008 23:25:40 +0530 + +recoll (1.10.1-1) unstable; urgency=low + + * New upstream release + + Updated debian/patches/02_gcc-snapshot-missing-headers-fix.dpatch + Some portions are merged with upstream + * debian/control: + + Fixed short description, Thanks to Mohammed Adnène Trojette + + * debian/patches/03_manpage_fixes.dpatch: + + Added patch to fix manpage groff warnings + + -- Kartik Mistry Wed, 27 Feb 2008 18:41:25 +0530 + +recoll (1.10.0-5) unstable; urgency=low + + * debian/patches/02_gcc-snapshot-missing-headers-fix.dpatch: + + Really fixed the FTBFS with gcc-4.3/g++-4.3 (Closes: #455652) + + -- Kartik Mistry Sun, 27 Jan 2008 14:37:53 +0530 + +recoll (1.10.0-4) unstable; urgency=low + + * debian/patches/02_gcc-snapshot-missing-headers-fix.dpatch: + + Updated patch to fix missing include header in qtgui/main.cpp + (Closes: #455652) + * debian/copyright: + + Updated missing license for qtgui/q3richtext_p.h + + Moved other copyright holders for GPL above license + to make it readable + + -- Kartik Mistry Wed, 23 Jan 2008 10:42:20 +0530 + +recoll (1.10.0-3) unstable; urgency=low + + * debian/control: + + Added external helper programs and utilities to Suggests field + (Closes: #441629, #457033) + + -- Kartik Mistry Fri, 28 Dec 2007 08:12:52 +0530 + +recoll (1.10.0-2) unstable; urgency=low + + * debian/control: + + Updated Standards-Version to 3.7.3 + * debian/patches/02_gcc-snapshot-missing-headers-fix.dpatch: + + Added patch to fix compilation with gcc-snapshot due to + missing headers (Closes: #455652) + * debian/rules: + + Fixed clean target + + -- Kartik Mistry Tue, 11 Dec 2007 14:42:47 +0530 + +recoll (1.10.0-1) unstable; urgency=low + + * New upstream release + * debian/control: + + Moved Homepage: entry to control field + + Dropped unnecessary dependency on qt3-dev-tools + + -- Kartik Mistry Wed, 28 Nov 2007 19:54:58 +0530 + +recoll (1.9.0-1) unstable; urgency=low + + * New upstream release + * debian/patches: dropped 02_desktop_entry_fixes.dpatch, merged with + upstream, rewrote 01_nostrip_final_binary_437901.dpatch after upstream + changes + * debian/menu: used Data Management since it is better and appropriate + * debian/copyright: added missing copyright from index/csguess.cpp + + -- Kartik Mistry Wed, 12 Sep 2007 14:05:39 +0530 + +recoll (1.8.2-3) unstable; urgency=low + + * debian/rules: added better clean target, better configure flags, + separated LDFLAGS + * Added dpatch support + * debian/patches/01_nostrip_final_binary_437901.dpatch: added patch to not + strip binary from upstream (Closes: #437901) + * debian/patches/02_desktop_entry_fixes.dpatch: added patch to fix desktop + menu entry according to freedesktop standards + * debian/menu: fixed according to latest menu policy, changed subsection to + Tools from Databases (hint taken from beagle) + * debian/copyright: moved copyright out of license section, adjusted + copyrights portions under proper license + + -- Kartik Mistry Sat, 18 Aug 2007 20:28:49 +0530 + +recoll (1.8.2-2) unstable; urgency=low + + * debian/rules: xapian is dynamically linked now, Thanks to + Jean-Francois Dockes (Closes: #427783) + * Fixed debian/watch file, Thanks to Vincent Fourmond + + -- Kartik Mistry Fri, 08 Jun 2007 10:51:01 +0530 + +recoll (1.8.2-1) unstable; urgency=low + + * New upstream release + * debian/watch: fixed now + * debian/control: fixed long descriptions + + -- Kartik Mistry Tue, 22 May 2007 15:24:54 +0530 + +recoll (1.8.1-1) unstable; urgency=low + + * Initial release (Closes: #422039) + * Based on package prepared by Jean-Francois Dockes + + -- Kartik Mistry Thu, 3 May 2007 12:15:02 +0530 diff --git a/packaging/debian/debian/compat b/packaging/debian/debian/compat new file mode 100644 index 00000000..7ed6ff82 --- /dev/null +++ b/packaging/debian/debian/compat @@ -0,0 +1 @@ +5 diff --git a/packaging/debian/debian/control b/packaging/debian/debian/control new file mode 100644 index 00000000..2b89bd8c --- /dev/null +++ b/packaging/debian/debian/control @@ -0,0 +1,85 @@ +Source: recoll +Section: x11 +Priority: optional +Maintainer: Jean-Francois Dockes +Build-Depends: autotools-dev, + debhelper (>= 7), + hardening-wrapper, + bison, + libqt4-dev, + libqtwebkit-dev, + libx11-dev, + libxapian-dev (>= 1.2.0), + libz-dev, + python-all-dev (>= 2.6.6-3~), + python3-all-dev, +Standards-Version: 3.9.4 +X-Python-Version: >= 2.7 +Homepage: http://www.lesbonscomptes.com/recoll +Vcs-Git: git://anonscm.debian.org/collab-maint/recoll.git +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/recoll.git;a=summary + +Package: recoll +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends} +Recommends: python-recoll, aspell, python, xdg-utils, xsltproc +Suggests: antiword, + catdoc, + ghostscript, + libimage-exiftool-perl, + poppler-utils, + pstotext, + python-chm, + python-mutagen, + unrtf, + untex +Description: Personal full text search package with a Qt GUI + This package is a personal full text search package is based on a very strong + backend (Xapian), for which it provides an easy to use and feature-rich + interface. + . + Features: + * Qt-based GUI + * Supports the following document types (and their compressed versions) + - Natively: text, html, OpenOffice files, maildir and mailbox (Mozilla and + IceDove mail) with attachments, pidgin log files + - With external helpers: pdf (pdftotext), postscript (ghostscript), msword + (antiword), excel, ppt (catdoc), rtf (unrtf) + * Powerful query facilities, with boolean searches, phrases, filter on file + types and directory tree + * Support for multiple charsets, Internal processing and storage uses Unicode + UTF-8 + * Stemming performed at query time (can switch stemming language after + indexing) + * Easy installation. No database daemon, web server or exotic language + necessary + * An indexer which runs either as a thread inside the GUI or as an external, + cron'able program + +Package: python-recoll +Architecture: any +Section: python +Depends: recoll (= ${binary:Version}), + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends} +Description: Python extension for recoll + Personal full text search package which is based on a very strong backend + (Xapian), for which it provides an easy to use and feature-rich interface. + . + This package provides Python extension module for recoll which can be use to + extend recoll such as an Ubuntu Unity Lens. + +Package: python3-recoll +Architecture: any +Section: python +Depends: recoll (= ${binary:Version}), + ${misc:Depends}, + ${python3:Depends}, + ${shlibs:Depends} +Description: Python extension for recoll + Personal full text search package which is based on a very strong backend + (Xapian), for which it provides an easy to use and feature-rich interface. + . + This package provides Python extension module for recoll which can be use to + extend recoll such as an Ubuntu Unity Lens. diff --git a/packaging/debian/debian/copyright b/packaging/debian/debian/copyright new file mode 100644 index 00000000..f5811875 --- /dev/null +++ b/packaging/debian/debian/copyright @@ -0,0 +1,219 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: recoll +Upstream-Contact: Jean-Francois Dockes +Source: http://www.lesbonscomptes.com/recoll/ + +Files: * +Copyright: 2005-2012, Jean-Francois Dockes +License: GPL-2+ + +Files: Binc IMAP project (bincimapmime/*) +Copyright: 2002-2005, Andreas Aardal Hanssen +License: GPL-2+ + +Files: filters/rcl* files index/csguess.cpp internfile/htmlparse.cpp +Copyright: 2000-2004, Mikio Hirabayashi +License: GPL-2+ + +Files: filters/rclpython +Copyright: J\xfcrgen Hermann, Mike Brown, Christopher Arndt + +License: GPL-2+ + +Files: internfile/htmlparse.cpp mh_html.cpp +Copyright: 1999-2001, BrightStation PLC, + 2001, Ananova Ltd, + 2002-2004, Olly Betts. +License: GPL-2+ + +Files: unac/* +Copyright: 2000-2002, Loic Dachary +License: GPL-2+ + +Files: common/* +Copyright: 2004-2005, J.F.Dockes +License: GPL-2+ + +Files: debian/* +Copyright: 2007-2012, Kartik Mistry +License: GPL-2+ + +License: GPL-2+ + This package is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any later + version. + . + This package is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License along with + this package; if not, write to the Free Software Foundation, Inc., 51 Franklin + St, Fifth Floor, Boston, MA 02110-1301 USA + . + On Debian systems, the complete text of the GNU General Public License can be + found in `/usr/share/common-licenses/GPL-2' and + `/usr/share/common-licenses/GPL-3'. + +Files: aspell/* +Copyright: 2001-2002, by Kevin Atkinson +License: LGPL-2+ + +Files: images/text-x-python.png +Copyright: David Vignoni +License: LGPL-2+ + +License: LGPL-2+ + This package is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. + . + This package is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + . + You should have received a copy of the GNU Lesser General Public License along + with this package; if not, write to the Free Software Foundation, Inc., 51 + Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + On Debian systems, the complete text of the GNU Lesser General Public License + can be found in `/usr/share/common-licenses/LGPL-2' and + `/usr/share/common-licenses/LGPL-2.1' and `/usr/share/common-licenses/LGPL-3'. + +Files: qtgui/q3richtext_p.h +Copyright: 1992-2007, Trolltech ASA. All rights reserved +License: + This file is part of the Qt3Support module of the Qt Toolkit. + . + This file may be used under the terms of the GNU General Public License + version 2.0 as published by the Free Software Foundation and appearing in the + file LICENSE.GPL included in the packaging of this file. Please review the + following information to ensure GNU General Public Licensing requirements will + be met: http://trolltech.com/products/qt/licenses/licensing/opensource/ + . + If you are unsure which license is appropriate for your use, please review the + following information: + http://trolltech.com/products/qt/licenses/licensing/licensingoverview + or contact the sales department at sales@trolltech.com. + . + In addition, as a special exception, Trolltech gives you certain additional + rights. These rights are described in the Trolltech GPL Exception version 1.0, + which can be found at http://www.trolltech.com/products/qt/gplexception/ + and in the file GPL_EXCEPTION.txt in this package. + . + In addition, as a special exception, Trolltech, as the sole copyright + holder for Qt Designer, grants users of the Qt/Eclipse Integration + plug-in the right for the Qt/Eclipse Integration to link to + functionality provided by Qt Designer and its related libraries. + . + Trolltech reserves all rights not expressly granted herein. + . + Trolltech ASA (c) 2007 + . + This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +Files: common/uproplist.h +Copyright: 1991-2006, Unicode, Inc. +License: + All rights reserved. Distributed under the Terms of Use in + http://www.unicode.org/copyright.html + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of the Unicode data files and any associated documentation (the "Data Files") + or Unicode software and any associated documentation (the "Software") to deal + in the Data Files or Software without restriction, including without + limitation the rights to use, copy, modify, merge, publish, distribute, and/or + sell copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that (a) the above + copyright notice(s) and this permission notice appear with all copies of the + Data Files or Software, (b) both the above copyright notice(s) and this + permission notice appear in associated documentation, and (c) there is clear + notice in each modified Data File or in the Software as well as in the + documentation associated with the Data File(s) or Software that the data or + software has been modified. + . + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD + PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN + THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE + DATA FILES OR SOFTWARE. + . + Except as contained in this notice, the name of a copyright holder shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in these Data Files or Software without prior written authorization of the + copyright holder. + +Files: utils/md5.* +Copyright: 1991-1992, RSA Data Security, Inc. All rights reserved. +License: + MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + . + License to copy and use this software is granted provided that it is + identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in + all material mentioning or referencing this software or this function. + . + License is also granted to make and use derivative works provided that such + works are identified as "derived from the RSA Data Security, Inc. MD5 + Message-Digest Algorithm" in all material mentioning or referencing the + derived work. + . + RSA Data Security, Inc. makes no representations concerning either the + merchantability of this software or the suitability of this software for any + particular purpose. It is provided "as is" without express or implied warranty + of any kind. + . + These notices must be retained in any copies of any part of this documentation + and/or software. + +Files: desktop/xdg-utils-1.0.1/* +Copyright: 2006, Kevin Krammer , + Jeremy White . +License: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Files: index/csguess.cpp +Copyright: 2000-2004, Mikio Hirabayashi +License: LGPL-2.1+ + This file is part of QDBM, Quick Database Manager. + . + QDBM is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2.1 of the License or any later + version. + . + QDBM is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + . + You should have received a copy of the GNU Lesser General Public License + along with QDBM; if not, write to the Free Software Foundation, Inc., + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + . + On Debian systems, the complete text of the GNU Lesser General Public License + can be found in `/usr/share/common-licenses/LGPL-2.1' and + `/usr/share/common-licenses/LGPL-3'. diff --git a/packaging/debian/debian/patches/fix-python-install.patch b/packaging/debian/debian/patches/fix-python-install.patch new file mode 100644 index 00000000..e025a811 --- /dev/null +++ b/packaging/debian/debian/patches/fix-python-install.patch @@ -0,0 +1,10 @@ +--- a/recollinstall.in ++++ b/recollinstall.in +@@ -149,5 +149,5 @@ + ${datadir}/recoll/translations/recoll_zh.qm || exit 1 + + +-@NOPYTHON@(cd python/recoll;python setup.py install \ +-@NOPYTHON@ --prefix=${REALPREFIX} ${ROOTFORPYTHON} ${OPTSFORPYTHON}) ++#@NOPYTHON@(cd python/recoll;python setup.py install \ ++#@NOPYTHON@ --prefix=${REALPREFIX} ${ROOTFORPYTHON} ${OPTSFORPYTHON}) diff --git a/packaging/debian/debian/patches/series b/packaging/debian/debian/patches/series new file mode 100644 index 00000000..977d94d2 --- /dev/null +++ b/packaging/debian/debian/patches/series @@ -0,0 +1 @@ +fix-python-install.patch diff --git a/packaging/debian/debian/python-recoll.install b/packaging/debian/debian/python-recoll.install new file mode 100644 index 00000000..ae42f11b --- /dev/null +++ b/packaging/debian/debian/python-recoll.install @@ -0,0 +1,2 @@ +usr/lib/python2*/*-packages/*.egg-info +usr/lib/python2*/*-packages/recoll/* diff --git a/packaging/debian/debian/python3-recoll.install b/packaging/debian/debian/python3-recoll.install new file mode 100644 index 00000000..b0bb287d --- /dev/null +++ b/packaging/debian/debian/python3-recoll.install @@ -0,0 +1,2 @@ +usr/lib/python3*/*-packages/*.egg-info +usr/lib/python3*/*-packages/recoll/* diff --git a/packaging/debian/debian/recoll.install b/packaging/debian/debian/recoll.install new file mode 100644 index 00000000..e423a69c --- /dev/null +++ b/packaging/debian/debian/recoll.install @@ -0,0 +1,12 @@ +usr/bin +usr/lib/recoll +usr/share/applications +usr/share/icons +usr/share/man +usr/share/pixmaps +usr/share/recoll/doc +usr/share/recoll/examples +usr/share/recoll/filters +usr/share/recoll/filters +usr/share/recoll/images +usr/share/recoll/translations diff --git a/packaging/debian/debian/recoll.menu b/packaging/debian/debian/recoll.menu new file mode 100644 index 00000000..f0abea35 --- /dev/null +++ b/packaging/debian/debian/recoll.menu @@ -0,0 +1,2 @@ +?package(recoll):needs="X11" section="Applications/Data Management" \ + title="Personal Search Tool" command="/usr/bin/recoll" diff --git a/packaging/debian/debian/rules b/packaging/debian/debian/rules new file mode 100755 index 00000000..5daf527d --- /dev/null +++ b/packaging/debian/debian/rules @@ -0,0 +1,86 @@ +#!/usr/bin/make -f + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export DEB_BUILD_HARDENING=1 + +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS = -Wall -g +#LDFLAGS = -Wl,-z,defs + +#build qt4 UI only +#export QMAKE=qmake-qt4 + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + ./configure CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --mandir=\$${prefix}/share/man \ + --prefix=/usr + +build: build-arch build-indep +build-arch: build-stamp +build-indep: build-stamp +build-stamp: config.status + dh_testdir + $(MAKE) + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp config.log + [ ! -f Makefile ] || $(MAKE) distclean + dh_clean Makefile + +install: + dh_testdir + dh_testroot + dh_prep + dh_installdirs + $(MAKE) STRIP=ls prefix=$(CURDIR)/debian/tmp/usr install + # Work around recollinstall forgetting the PPT text-extract utility + install -m 0444 filters/msodump.zip $(CURDIR)/debian/tmp/usr/share/recoll/filters + install -m 0555 filters/ppt-dump.py $(CURDIR)/debian/tmp/usr/share/recoll/filters + (cd python/recoll; python setup.py install \ + --install-layout=deb \ + --prefix=$(CURDIR)/debian/tmp/usr ) + (cd python/recoll; python3 setup.py install \ + --install-layout=deb \ + --prefix=$(CURDIR)/debian/tmp/usr ) + +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs ChangeLog + dh_installdocs README + dh_installmenu + dh_installman + dh_install --sourcedir=debian/tmp + dh_makeshlibs + dh_python2 -p python-recoll + dh_python3 -p python3-recoll + dh_link + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary-indep: build install + +binary: binary-indep binary-arch +.PHONY: build build-arch build-indep clean binary-indep binary-arch binary install diff --git a/packaging/debian/debian/source/format b/packaging/debian/debian/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/packaging/debian/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/packaging/debian/debian/watch b/packaging/debian/debian/watch new file mode 100644 index 00000000..e5daae09 --- /dev/null +++ b/packaging/debian/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://www.lesbonscomptes.com/recoll/download.html recoll-(.*)\.tar\.gz diff --git a/packaging/debian/debiankio/changelog b/packaging/debian/debiankio/changelog new file mode 100644 index 00000000..1cf089c0 --- /dev/null +++ b/packaging/debian/debiankio/changelog @@ -0,0 +1,92 @@ +kio-recoll (1.21.0-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * No changes specific to the KIO, just use the 1.21 lib. + + -- Jean-Francois Dockes Tue, 16 Jun 2015 18:21:00 +0200 + +kio-recoll (1.20.6-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + + * Increase the default maximum number of entries displayed in a directory + window (can be adjusted with the kio_max_direntries configuration + variable). + * Display entries incrementally instead of sending the whole + list at once. + + -- Jean-Francois Dockes Sat, 25 Apr 2015 14:47:00 +0200 + +kio-recoll (1.20.1-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to version 1.20.1 + -- Jean-Francois Dockes Fri, 19 Dec 2014 08:14:00 +0200 + +kio-recoll (1.19.14p2-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * No changes, build for Ubuntu Utopic + -- Jean-Francois Dockes Sat, 06 Dec 2014 08:44:00 +0200 + +kio-recoll (1.19.12-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.19.12 + -- Jean-Francois Dockes Wed, 02 Apr 2014 15:50:00 +0200 + +kio-recoll (1.19.10-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.19.10 + -- Jean-Francois Dockes Sat, 25 Nov 2013 18:00:00 +0100 + +kio-recoll (1.19.2-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.19.2 + -- Jean-Francois Dockes Mon, 13 May 2013 12:09:00 +0100 + +kio-recoll (1.18.2-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.18.2 + -- Jean-Francois Dockes Mon, 18 Apr 2013 18:05:00 +0100 + +kio-recoll (1.18.1-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.18.1 + -- Jean-Francois Dockes Mon, 05 Nov 2012 13:25:00 +0100 + +kio-recoll (1.17.0-0~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.17.0 + -- Jean-Francois Dockes Sun, 25 Mar 2012 18:05:00 +0200 + +kio-recoll (1.16.2-0~ppa1~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.16.2 + -- Jean-Francois Dockes Mon, 07 Nov 2011 17:57:00 +0200 + +kio-recoll (1.16.1-0~ppa1~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.16.1 + -- Jean-Francois Dockes Wed, 28 Sep 2011 15:07:00 +0200 + +kio-recoll (1.16.0-0~ppa1~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.16.0 + -- Jean-Francois Dockes Wed, 07 Sep 2011 18:30:00 +0200 + +kio-recoll (1.15.8-0~ppa1~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.15.8 + -- Jean-Francois Dockes Mon, 02 May 2011 17:27:00 +0200 + +kio-recoll (1.15.5-0~ppa1~SERIES1) SERIES; urgency=low + * Update to recoll version 1.15.5 + -- Jean-Francois Dockes Fri, 04 Mar 2011 13:54:00 +0200 + +kio-recoll (1.15.2-0~ppa1~SERIES1) SERIES; urgency=low + * Update to recoll version 1.15.2 + -- Jean-Francois Dockes Thu, 15 Feb 2011 08:43:00 +0200 + +kio-recoll (1.15.0-0~ppa1~SERIES1) SERIES; urgency=low + * Update to recoll version 1.15.0 + -- Jean-Francois Dockes Wed, 02 Feb 2011 09:48:00 +0200 + +kio-recoll (1.14.3-0~ppa1~SERIES1) SERIES; urgency=low + * Update to recoll version 1.14.3 + -- Jean-Francois Dockes Thu, 25 Nov 2010 10:25:00 +0200 + +kio-recoll (1.14.2-0~ppa1~SERIES1) SERIES; urgency=low + * Update to recoll version 1.14.2 + -- Jean-Francois Dockes Sat, 25 Sep 2010 09:37:20 +0200 + +kio-recoll (1.13.01-0~ppa4~SERIES1) SERIES; urgency=low + * Update to recoll version 1.13.01 + -- Jean-Francois Dockes Thu, 07 Jan 2010 11:26:00 +0100 + +kio-recoll (1.12.3-0~ppa4~jaunty1) jaunty; urgency=low + * Initial release + -- Jean-Francois Dockes Tue, 24 Nov 2009 08:55:00 +0100 + diff --git a/packaging/debian/debiankio/compat b/packaging/debian/debiankio/compat new file mode 100644 index 00000000..7f8f011e --- /dev/null +++ b/packaging/debian/debiankio/compat @@ -0,0 +1 @@ +7 diff --git a/packaging/debian/debiankio/control b/packaging/debian/debiankio/control new file mode 100644 index 00000000..a86b79f8 --- /dev/null +++ b/packaging/debian/debiankio/control @@ -0,0 +1,32 @@ +Source: kio-recoll +Section: kde +Priority: extra +Maintainer: Jean-Francois Dockes +Build-Depends: cdbs, + cmake, + debhelper (>= 7), + bison, + kdelibs5-dev (>= 4:4.2.2), + pkg-kde-tools (>= 0.4.0), + libxapian-dev, + libz-dev +Standards-Version: 3.9.5 +Homepage: http://www.recoll.org/ + +Package: kio-recoll +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, recoll +Description: A Recoll KIO slave for KDE 4 + A Recoll KIO slave for KDE 4, allows performing a Recoll search by + entering an appropriate URL in a KDE open dialog, or with an HTML-based + interface displayed in Konqueror. + The HTML-based interface is similar to the Recoll GUI QT-based interface, + slightly less powerful. It allows performing a search while staying fully + within the KDE framework: drag and drop from the result list works + normally and you have your normal choice of applications for opening files. + An alternative interface uses a directory view of search results. Due to + limitations in the current KIO slave interface, it is currently not + obviously useful. + The interface is described in more detail inside a help file which you can + access by entering recoll:/ inside the konqueror URL line (this works only + if the recoll KIO slave has been previously installed). diff --git a/packaging/debian/debiankio/copyright b/packaging/debian/debiankio/copyright new file mode 100644 index 00000000..3cb35945 --- /dev/null +++ b/packaging/debian/debiankio/copyright @@ -0,0 +1,113 @@ +This package was debianized by Jean-Francois Dockes on +Wed, 10 Jan 2007 16:04:13 +0100. + +It was downloaded from http://www.recoll.org + +Upstream Author: Jean-Francois Dockes + +Copyright: (C) 2005,2006, Jean-Francois Dockes + +License: + + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. + +The Debian packaging is (C) 2007, Jean-Francois Dockes and +is licensed under the GPL, see above. + +Portions of the software are: + +Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL: +/* This file is part of The New Aspell + * Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL + * license version 2.0 or 2.1. You should have received a copy of the + * LGPL license along with this library if you did not you can find it + * at http://www.gnu.org/. + +On Debian systems, the complete text of the GNU LGPL +can be found in `/usr/share/common-licenses/LGPL-2'. + + +Copyright 2002-2005 Andreas Aardal Hanssen +Copyright (C) 2000-2004 Mikio Hirabayashi +Copyright 1999,2000,2001 BrightStation PLC +Copyright 2001 Ananova Ltd +Copyright 2002 Olly Betts +Copyright (C) 2000, 2001, 2002 Loic Dachary + - GPL V2 or later, same license text as above + +Copyright (c) 1991-2004 Unicode, Inc. + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2006 Unicode, Inc. All rights reserved. Distributed under + the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of the Unicode data files and any associated documentation (the "Data + Files") or Unicode software and any associated documentation (the + "Software") to deal in the Data Files or Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, and/or sell copies of the Data Files or Software, and + to permit persons to whom the Data Files or Software are furnished to do + so, provided that (a) the above copyright notice(s) and this permission + notice appear with all copies of the Data Files or Software, (b) both the + above copyright notice(s) and this permission notice appear in associated + documentation, and (c) there is clear notice in each modified Data File or + in the Software as well as in the documentation associated with the Data + File(s) or Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR + CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. + +Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +/* + * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD5 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD5 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + */ diff --git a/packaging/debian/debiankio/dirs b/packaging/debian/debiankio/dirs new file mode 100644 index 00000000..ec620536 --- /dev/null +++ b/packaging/debian/debiankio/dirs @@ -0,0 +1,2 @@ +usr/lib/kde4 +usr/share/kde4/services diff --git a/packaging/debian/debiankio/docs b/packaging/debian/debiankio/docs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/packaging/debian/debiankio/docs @@ -0,0 +1 @@ + diff --git a/packaging/debian/debiankio/patches/fix-cmake-build-parser.patch b/packaging/debian/debiankio/patches/fix-cmake-build-parser.patch new file mode 100644 index 00000000..81e01f48 --- /dev/null +++ b/packaging/debian/debiankio/patches/fix-cmake-build-parser.patch @@ -0,0 +1,21 @@ +diff -r 1e9d7ca73884 src/kde/kioslave/kio_recoll/CMakeLists.txt +--- a/kde/kioslave/kio_recoll/CMakeLists.txt Tue Jun 16 15:06:07 2015 +0200 ++++ b/kde/kioslave/kio_recoll/CMakeLists.txt Wed Jun 17 09:08:36 2015 +0200 +@@ -57,11 +57,16 @@ + + kde4_add_plugin(kio_recoll ${kio_recoll_SRCS}) + ++add_custom_target(parser ++ COMMAND make wasaparse.tab.cpp ++ WORKING_DIRECTORY ${rcltop}/query ++) + add_custom_target(rcllib + COMMAND make librecoll.a + WORKING_DIRECTORY ${rcltop}/lib + ) +-add_dependencies(kio_recoll rcllib) ++add_dependencies(rcllib parser) ++add_dependencies(kio_recoll parser rcllib) + + target_link_libraries(kio_recoll recoll xapian z ${EXTRA_LIBS} ${KDE4_KIO_LIBS}) + diff --git a/packaging/debian/debiankio/patches/series b/packaging/debian/debiankio/patches/series new file mode 100644 index 00000000..2782ff1c --- /dev/null +++ b/packaging/debian/debiankio/patches/series @@ -0,0 +1 @@ +fix-cmake-build-parser.patch diff --git a/packaging/debian/debiankio/rules b/packaging/debian/debiankio/rules new file mode 100755 index 00000000..8d9a454d --- /dev/null +++ b/packaging/debian/debiankio/rules @@ -0,0 +1,6 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/pkg-kde-tools/makefiles/1/cdbs/kde.mk + +DEB_SRCDIR = kde/kioslave/kio_recoll diff --git a/packaging/debian/debiankio/source/format b/packaging/debian/debiankio/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/packaging/debian/debiankio/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/packaging/debian/debiankio/watch b/packaging/debian/debiankio/watch new file mode 100644 index 00000000..6963245c --- /dev/null +++ b/packaging/debian/debiankio/watch @@ -0,0 +1,4 @@ +version=3 + + +http://www.recoll.org/download.html recoll-(.*)\.tar\.gz diff --git a/packaging/debian/debianunitylens/changelog b/packaging/debian/debianunitylens/changelog new file mode 100644 index 00000000..301b6eb6 --- /dev/null +++ b/packaging/debian/debianunitylens/changelog @@ -0,0 +1,30 @@ +recoll-lens (1.19.10.3543-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to release 1.19.10 + -- Jean-Francois Dockes Sat, 23 Nov 2013 18:00:00 +0100 + +recoll-lens (1.19.2.3328-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to release 1.19.2, for consistency, same as 1.19.0 in fact + -- Jean-Francois Dockes Mon, 14 May 2013 08:22:00 +0100 + +recoll-lens (1.19.0.3315-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.19.0 + -- Jean-Francois Dockes Sun, 12 May 2013 14:43:00 +0100 + +recoll-lens (1.18.1.2997-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.18.1 + -- Jean-Francois Dockes Mon, 05 Nov 2012 13:31:00 +0100 +recoll-lens (1.17.2.2697-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.17.1.2697 : display thumbnails when they exist + -- Jean-Francois Dockes Tue, 15 May 2012 13:51:00 +0200 +recoll-lens (1.17.1.2654-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.17.1.2654 : display/open results for embedded files + -- Jean-Francois Dockes Tue, 27 Mar 2012 16:22:00 +0200 +recoll-lens (1.17.0.2648-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.17.0.2648 : don't use app shortcut 'a' + -- Jean-Francois Dockes Mon, 26 Mar 2012 22:05:00 +0200 +recoll-lens (1.17.0.2646-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated lens to vers. 1.17.0.2646 : Unity 5.0/Ubuntu 12.04 compatibility + -- Jean-Francois Dockes Sun, 25 Mar 2012 16:42:00 +0200 +recoll-lens (1.17.0.2645-1~ppaPPAVERS~SERIES1) SERIES; urgency=low + * Updated package to recoll version 1.17.0 + -- Jean-Francois Dockes Sun, 25 Mar 2012 16:42:00 +0200 diff --git a/packaging/debian/debianunitylens/compat b/packaging/debian/debianunitylens/compat new file mode 100644 index 00000000..7ed6ff82 --- /dev/null +++ b/packaging/debian/debianunitylens/compat @@ -0,0 +1 @@ +5 diff --git a/packaging/debian/debianunitylens/control b/packaging/debian/debianunitylens/control new file mode 100644 index 00000000..706ce5e4 --- /dev/null +++ b/packaging/debian/debianunitylens/control @@ -0,0 +1,18 @@ +Source: recoll-lens +Section: x11 +Priority: optional +Maintainer: Jean-Francois Dockes +Build-Depends: debhelper (>= 7), + autotools-dev, + recoll, + python-recoll, + python +Standards-Version: 3.9.3 + +Package: recoll-lens +Architecture: all +Depends: ${misc:Depends}, python, recoll, unity +Description:Unity Lens for searching the Recoll index. + Allows querying the Recoll index from the Unity Dash, optionally + filtering on file category. +Homepage: http://www.recoll.org diff --git a/packaging/debian/debianunitylens/copyright b/packaging/debian/debianunitylens/copyright new file mode 100644 index 00000000..47810ee9 --- /dev/null +++ b/packaging/debian/debianunitylens/copyright @@ -0,0 +1,20 @@ +This package was debianized by Jean-Francois Dockes on +Sun, 25 Mar 2012 16:31:00 +0200. + +It was downloaded from http://www.recoll.org + +Upstream Author: Jean-Francois Dockes + +Copyright: (C) 2012 Jean-Francois Dockes + +License: GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. + +Debian packaging is (C) 2012, Jean-Francois Dockes, same license. + +Derived from Original bliss apps lens by Mikkel Kamstrup Erlandsen: + Copyright 2011, Canonical Ltd + Authored by Mikkel Kamstrup Erlandsen + Distribute under the terms of the GNU General Public License v3 diff --git a/packaging/debian/debianunitylens/docs b/packaging/debian/debianunitylens/docs new file mode 100644 index 00000000..e845566c --- /dev/null +++ b/packaging/debian/debianunitylens/docs @@ -0,0 +1 @@ +README diff --git a/packaging/debian/debianunitylens/rules b/packaging/debian/debianunitylens/rules new file mode 100755 index 00000000..0b244d33 --- /dev/null +++ b/packaging/debian/debianunitylens/rules @@ -0,0 +1,52 @@ +#!/usr/bin/make -f + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +config.status: configure + dh_testdir + ./configure --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --mandir=\$${prefix}/share/man \ + --prefix=/usr \ + --sysconfdir=/etc + +build: build-stamp +build-stamp: config.status + dh_testdir + $(MAKE) + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp config.log + [ ! -f Makefile ] || $(MAKE) distclean + dh_clean Makefile + +install: + dh_testdir + dh_testroot + dh_prep + dh_installdirs + $(MAKE) prefix=$(CURDIR)/debian/recoll-lens/usr install + +binary-indep: build install + dh_testdir + dh_testroot + dh_installchangelogs ChangeLog + dh_installdocs README + dh_python2 + dh_link + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep +.PHONY: build clean binary-indep binary-arch binary install diff --git a/packaging/debian/debianunitylens/watch b/packaging/debian/debianunitylens/watch new file mode 100644 index 00000000..708fd568 --- /dev/null +++ b/packaging/debian/debianunitylens/watch @@ -0,0 +1,12 @@ +# Example watch control file for uscan +# Rename this file to "watch" and then you can run the "uscan" command +# to check for upstream updates and more. +# See uscan(1) for format + +# Compulsory line, this is a version 3 file +version=3 + +# Uncomment to examine a Webpage +# +http://www.recoll.org/download.html recoll-lens-(.*)\.tar\.gz + diff --git a/packaging/homebrew/00README.txt b/packaging/homebrew/00README.txt new file mode 100644 index 00000000..c76b25d6 --- /dev/null +++ b/packaging/homebrew/00README.txt @@ -0,0 +1,10 @@ + + +Package building file for Mac homebrew: http://brew.sh/ + +Install homebrew following the instructions on the home page, then copy +recoll.rb to /usr/local/Library/Formula/, then "brew install recoll" should +just work. + +Also see: https://github.com/medoc92/homebrew/tree/recoll + diff --git a/packaging/homebrew/recoll.rb b/packaging/homebrew/recoll.rb new file mode 100644 index 00000000..bc2b2b9a --- /dev/null +++ b/packaging/homebrew/recoll.rb @@ -0,0 +1,35 @@ +require 'formula' + +class Recoll < Formula + homepage 'http://www.recoll.org' + url 'http://www.recoll.org/recoll-1.19.11p1.tar.gz' + sha1 'f4259c21faff9f30882d0bf1e8f952c19ed9936b' + + depends_on 'xapian' + depends_on 'qt' + def patches + DATA + end + def install + system "./configure", "--prefix=#{prefix}" + system "make", "install" + end + + test do + system "#{bin}/recollindex", "-h" + end +end + +__END__ +--- a/configure.orig 2014-01-07 12:39:40.606718201 +0100 ++++ b/configure 2014-01-07 12:39:58.574599715 +0100 +@@ -5120,7 +5120,7 @@ + # basically to enable using a Macbook for development + if test X$sys = XDarwin ; then + # The default is xcode +- QMAKE="${QMAKE} -spec macx-g++" ++ QMAKE="${QMAKE}" + fi + + # Discriminate qt3/4. Qt3 qmake prints its version on stderr but we don't + diff --git a/packaging/macports/README.txt b/packaging/macports/README.txt new file mode 100644 index 00000000..90ab3922 --- /dev/null +++ b/packaging/macports/README.txt @@ -0,0 +1,24 @@ +To use/test the port out of the official macports tree: + +- Edit sources.conf /opt/local/etc/macports/sources.conf, and insert a URL + pointing to your local repository before the rsync one: + file:///Users/dockes/projets/fulltext/recoll/packaging/macports + rsync://rsync.macports.org/release/ports [default] + + (inserting before ensures it's used before the macports one) + +- The port should live under category/portname (ie: textproc/ + +- After you create or update your Portfile, use the MacPorts portindex + command in the local repository's directory to create or update the index + of the ports in your local repository. + + %% cd ~/path/to/macports + %% portindex + + Once the local port is added to the PortIndex, it becomes available for + searching or installation as with any other Portfile in the MacPorts + tree + +http://guide.macports.org/#development.local-repositories + diff --git a/packaging/macports/textproc/recoll/Portfile b/packaging/macports/textproc/recoll/Portfile new file mode 100644 index 00000000..850d19fe --- /dev/null +++ b/packaging/macports/textproc/recoll/Portfile @@ -0,0 +1,45 @@ +# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4 +# $Id: Portfile 111989 2013-10-08 17:10:55Z ryandesign@macports.org $ + +PortSystem 1.0 +PortGroup app 1.0 + +name recoll +version 1.19.11p1 +categories textproc +platforms darwin +license GPL-2+ +maintainers dockes.org:jf openmaintainer + +description Desktop full text search + +long_description Recoll is a desktop search tool based on Xapian + +homepage http://www.recoll.org/ +master_sites ${homepage} + +checksums rmd160 de98039d80174a5da6e3cdbcc8b7bc0f4407e44a \ + sha256 8d1d040b8de1f65f01bc0a56053a6df7677360031bf9a6779d3496ced4a61186 + +depends_lib port:xapian-core \ + port:qt4-mac \ + port:aspell \ + port:libiconv \ + port:zlib + +depends_run port:antiword \ + port:catdoc \ + port:libxslt \ + port:poppler \ + port:unrtf \ + port:unzip + +patchfiles patch-sampleconf-mimeview.diff + +configure.args --without-x \ + --disable-x11mon + +build.args CC=${configure.cc} CXX=${configure.cxx} + +# g++-4.2: -E, -S, -save-temps and -M options are not allowed with multiple -arch flags +universal_variant no diff --git a/packaging/macports/textproc/recoll/files/patch-sampleconf-mimeview.diff b/packaging/macports/textproc/recoll/files/patch-sampleconf-mimeview.diff new file mode 100644 index 00000000..6db66d5b --- /dev/null +++ b/packaging/macports/textproc/recoll/files/patch-sampleconf-mimeview.diff @@ -0,0 +1,147 @@ +--- sampleconf/mimeview 2013-09-30 18:45:06.000000000 +0200 ++++ sampleconf/mimeview.mac 2013-09-30 18:45:06.000000000 +0200 +@@ -2,7 +2,8 @@ + + ## ########################################## + # External viewers, launched by the recoll GUI when you click on a result +-# 'edit' link ++# 'Open' link - MAC version ++# On the MAC, we use "open" for everything... + + # Mime types which we should not uncompress if they are found gzipped or + # bzipped because the native viewer knows how to handle. These would be +@@ -16,20 +17,17 @@ + # search string + # - For pages of CHM and EPUB documents where we can choose to open the + # parent document instead of a temporary html file. +-xallexcepts = application/pdf application/postscript application/x-dvi \ +- text/html|gnuinfo text/html|chm text/html|epub \ +- application/x-fsdirectory|parentopen inode/directory|parentopen ++#xallexcepts = application/pdf application/postscript application/x-dvi \ ++# text/html|gnuinfo text/html|chm text/html|epub + + [view] + # Pseudo entry used if the 'use desktop' preference is set in the GUI +-application/x-all = xdg-open %u ++application/x-all = open %f + + application/epub+zip = ebook-viewer %f +-# Open the parent epub document for epub parts instead of opening them as +-# html documents. This is almost always what we want. +-text/html|epub = ebook-viewer %F;ignoreipath=1 +- +-application/x-gnote = gnote %f ++# If you want to open the parent epub document for epub parts instead of ++# opening them as html documents: ++#text/html|epub = ebook-viewer %F;ignoreipath=1 + + application/x-mobipocket-ebook = ebook-viewer %f + +@@ -76,13 +74,9 @@ + application/vnd.wordperfect = libreoffice %f + text/rtf = libreoffice %f + ++application/x-chm = kchmviewer %f + application/x-dia-diagram = dia %f +- + application/x-fsdirectory = dolphin %f +-inode/directory = dolphin %f +-application/x-fsdirectory|parentopen = dolphin --select %(childurl) %f +-inode/directory|parentopen = dolphin --select %(childurl) %f +- + application/x-gnuinfo = xterm -e "info -f %f" + application/x-gnumeric = gnumeric %f + +@@ -102,11 +96,6 @@ + image/x-ms-bmp = gwenview %f + image/x-xpmi = gwenview %f + +-# Opening mail messages not always works. +-# - Thunderbird will only open a single-message file if it has an .emf +-# extension +-# - "sylpheed %f" seems to work ok as of version 3.3 +-# - "kmail --view %u" works + message/rfc822 = thunderbird -file %f + text/x-mail = thunderbird -file %f + application/x-mimehtml = thunderbird -file %f +@@ -119,11 +108,11 @@ + application/x-tar = ark %f + application/zip = ark %f + +-application/x-awk = emacsclient --no-wait %f +-application/x-perl = emacsclient --no-wait %f +-text/x-perl = emacsclient --no-wait %f +-application/x-shellscript = emacsclient --no-wait %f +-text/x-shellscript = emacsclient --no-wait %f ++application/x-awk = emacsclient %f ++application/x-perl = emacsclient %f ++text/x-perl = emacsclient %f ++application/x-shellscript = emacsclient %f ++text/x-shellscript = emacsclient %f + + # Or firefox -remote "openFile(%u)" + text/html = firefox %u +@@ -135,41 +124,39 @@ + + application/x-webarchive = konqueror %f + text/x-fictionbook = ebook-viewer %f +-application/x-tex = emacsclient --no-wait %f +-application/xml = emacsclient --no-wait %f +-text/xml = emacsclient --no-wait %f +-text/x-tex = emacsclient --no-wait %f +-text/plain = emacsclient --no-wait %f +-text/x-awk = emacsclient --no-wait %f +-text/x-c = emacsclient --no-wait %f +-text/x-c+ = emacsclient --no-wait %f +-text/x-c++ = emacsclient --no-wait %f ++application/x-tex = emacsclient %f ++application/xml = emacsclient %f ++text/xml = emacsclient %f ++text/x-tex = emacsclient %f ++text/plain = emacsclient %f ++text/x-awk = emacsclient %f ++text/x-c = emacsclient %f ++text/x-c+ = emacsclient %f ++text/x-c++ = emacsclient %f + text/x-csv = libreoffice %f + text/x-html-sidux-man = konqueror %f + text/x-html-aptosid-man = iceweasel %f + +-application/x-chm = kchmviewer %f + # Html pages inside a chm have a chm rclaptg set by the filter. Kchmviewer + # knows how to use the ipath (which is the internal chm path) to open the + # file at the right place + text/html|chm = kchmviewer --url %i %F + +-text/x-ini = emacsclient --no-wait %f ++text/x-ini = emacsclient %f + text/x-man = xterm -u8 -e "groff -T ascii -man %f | more" + text/x-python = idle %f +-text/x-gaim-log = emacsclient --no-wait %f +-text/x-purple-html-log = emacsclient --no-wait %f +-text/x-purple-log = emacsclient --no-wait %f ++text/x-gaim-log = emacsclient %f ++text/x-purple-html-log = emacsclient %f ++text/x-purple-log = emacsclient %f + + # The video types will usually be handled by the desktop default, but they + # need entries here to get an "Open" link +-video/3gpp = vlc %f +-video/mp2p = vlc %f +-video/mp2t = vlc %f +-video/mp4 = vlc %f +-video/mpeg = vlc %f +-video/quicktime = vlc %f +-video/x-matroska = vlc %f +-video/x-ms-asf = vlc %f +-video/x-msvideo = vlc %f +- ++video/3gpp = open %f ++video/mp2p = open %f ++video/mp2t = open %f ++video/mp4 = open %f ++video/mpeg = open %f ++video/quicktime = open %f ++video/x-matroska = open %f ++video/x-ms-asf = open %f ++video/x-msvideo = open %f diff --git a/packaging/rpm/kio_recoll.spec b/packaging/rpm/kio_recoll.spec new file mode 100644 index 00000000..38626e3e --- /dev/null +++ b/packaging/rpm/kio_recoll.spec @@ -0,0 +1,77 @@ +%define name kio_recoll +%define version 1.17.0 +%define release 0 + +Name: %{name} +Version: %{version} +Release: %{release} + +Summary: KIO slave for the Recoll full text search tool +Source0: http://www.recoll.org/recoll-%{version}.tar.gz +URL: http://www.recoll.org/ +Group: Applications/Databases + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +License: GPL + +BuildRequires: libkde4-devel zlib-devel xapian-core-devel libuuid-devel +Requires: recoll + +%description +Recoll is a personal full text search package for Linux, FreeBSD and +other Unix systems. It is based on a very strong backend (Xapian), for +which it provides an easy to use, feature-rich, easy administration +interface. + +# --------------------------------------------------------------------------- + +%prep +%setup -q -n recoll-%{version} + +# --------------------------------------------------------------------------- + +%build + +%cmake_kde4 kde/kioslave/kio_recoll +pwd +make %{?_smp_mflags} + +# --------------------------------------------------------------------------- + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall + +# --------------------------------------------------------------------------- + +%clean +rm -rf $RPM_BUILD_ROOT + +# --------------------------------------------------------------------------- + +%files +%defattr(-,root,root,-) +%{_libdir}/kde4/kio_recoll.so +%{_datadir}/kde4/apps/kio_recoll +%{_datadir}/kde4/apps/kio_recoll/help.html +%{_datadir}/kde4/apps/kio_recoll/welcome.html +%{_datadir}/kde4/services/recoll.protocol +%{_datadir}/kde4/services/recollf.protocol +%if 0%{?suse_version} > 1120 +%dir %{_datadir}/kde4/apps +%dir %{_datadir}/kde4/services +%dir %{_libdir}/kde4 +%endif + +# --------------------------------------------------------------------------- + +%changelog +* Sun Mar 18 2012 Jean-Francois Dockes 1.17.0-0 +- 1.17.0 +* Mon May 02 2011 Jean-Francois Dockes 1.16.2-0 +- 1.16.2 +* Mon May 02 2011 Jean-Francois Dockes 1.15.8-0 +- 1.15.8 +* Sun Mar 06 2011 Jean-Francois Dockes 1.15.5-0 +- Initial spec file for kio + diff --git a/packaging/rpm/recoll-mageia.spec b/packaging/rpm/recoll-mageia.spec new file mode 100644 index 00000000..b44ac0ce --- /dev/null +++ b/packaging/rpm/recoll-mageia.spec @@ -0,0 +1,75 @@ +Name: recoll +Version: 1.19.9 +Release: %mkrel 1 +Summary: Desktop full text search tool with a Qt GUI +URL: http://www.lesbonscomptes.com/recoll/ +Group: Databases +License: GPLv2 + +Source0: http://www.lesbonscomptes.com/recoll/%{name}-%{version}.tar.gz + +BuildRequires: xapian-devel +BuildRequires: pkgconfig(QtCore) +BuildRequires: pkgconfig(QtWebKit) + +Requires: xapian + + +%description +Recoll is a personal full text search package for Linux, FreeBSD and +other Unix systems. It is based on a very strong backend (Xapian), for +which it provides an easy to use, feature-rich, easy administration +interface. + + +%package -n kio-%{name} +Summary: Kioslave for %{name} +Group: Graphical desktop/KDE +BuildRequires: cmake +BuildRequires: kdelibs4-devel +Requires: %{name} = %{version}-%{release} +Requires: kdebase4-workspace + +%description -n kio-%{name} +Kioslave for %{name}. Enables to perform querries and extract +results in konqueror and dolphin. + + + +%prep +%setup -q + +%build +%configure2_5x --disable-python-module +%make + + +%install +%makeinstall_std + +rm lib/librecoll.so* +pushd kde/kioslave/kio_recoll +%cmake_kde4 +%make +%makeinstall_std +popd + + +%files +%doc README +%{_bindir}/* +%{_datadir}/applications/recoll-searchgui.desktop +%{_datadir}/icons/hicolor/48x48/apps/recoll.png +%{_datadir}/pixmaps/recoll.png +%{_datadir}/%{name} +%{_mandir}/man1/recoll* +%{_mandir}/man5/recoll* +%{_kde_libdir}/%name/librecoll.so.%version + + +%files -n kio-%{name} +%{_kde_libdir}/kde4/kio_recoll.so +%{_kde_datadir}/apps/kio_recoll/help.html +%{_kde_datadir}/apps/kio_recoll/welcome.html +%{_kde_datadir}/kde4/services/recoll.protocol +%{_kde_datadir}/kde4/services/recollf.protocol diff --git a/packaging/rpm/recoll.spec b/packaging/rpm/recoll.spec new file mode 100644 index 00000000..0f266295 --- /dev/null +++ b/packaging/rpm/recoll.spec @@ -0,0 +1,224 @@ +Summary: Desktop full text search tool with Qt GUI +Name: recoll +Version: 1.20.6 +Release: 1%{?dist} +Group: Applications/Databases +License: GPLv2+ +URL: http://www.lesbonscomptes.com/recoll/ +Source0: http://www.lesbonscomptes.com/recoll/recoll-%{version}.tar.gz +BuildRequires: qt-devel +BuildRequires: qtwebkit-devel +BuildRequires: python-devel +BuildRequires: zlib-devel +BuildRequires: aspell-devel +BuildRequires: xapian-core-devel +BuildRequires: desktop-file-utils +Requires: xdg-utils + +%description +Recoll is a personal full text search package for Linux, FreeBSD and +other Unix systems. It is based on a very strong back end (Xapian), for +which it provides an easy to use, feature-rich, easy administration +interface. +%global __provides_exclude_from ^%{_libdir}/recoll/librecoll\\.so.*$ +%global __requires_exclude ^librecoll\\.so.*$ + +%prep +%setup -q -n %{name}-%{version} +chmod 0644 utils/{conftree.cpp,conftree.h,debuglog.cpp,debuglog.h} + +%build +export QMAKE=qmake-qt4 +%configure +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} STRIP=/bin/true INSTALL='install -p' + +desktop-file-install --delete-original \ + --dir=%{buildroot}/%{_datadir}/applications \ + %{buildroot}/%{_datadir}/applications/%{name}-searchgui.desktop + +# use /usr/bin/xdg-open +rm -f %{buildroot}/usr/share/recoll/filters/xdg-open + +# fix perms +chmod 0755 %{buildroot}/usr/share/recoll/filters/rclexecm.py +chmod 0755 %{buildroot}%{_libdir}/recoll/librecoll.so.* + +%post +touch --no-create %{_datadir}/icons/hicolor +if [ -x %{_bindir}/gtk-update-icon-cache ] ; then + %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor +fi +if [ -x %{_bindir}/update-desktop-database ] ; then + %{_bindir}/update-desktop-database &> /dev/null +fi +exit 0 + +%postun +touch --no-create %{_datadir}/icons/hicolor +if [ -x %{_bindir}/gtk-update-icon-cache ] ; then + %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor +fi +if [ -x %{_bindir}/update-desktop-database ] ; then + %{_bindir}/update-desktop-database &> /dev/null +fi +exit 0 + +%files +%doc COPYING ChangeLog README +%{_bindir}/%{name} +%{_bindir}/%{name}index +%{_datadir}/%{name} +%{_datadir}/appdata/%{name}.appdata.xml +%{_datadir}/applications/%{name}-searchgui.desktop +%{_datadir}/icons/hicolor/48x48/apps/%{name}.png +%{_datadir}/pixmaps/%{name}.png +%{_libdir}/recoll +%{python_sitearch}/recoll +%{python_sitearch}/Recoll*.egg-info +%{_mandir}/man1/%{name}.1* +%{_mandir}/man1/recollq.1* +%{_mandir}/man1/%{name}index.1* +%{_mandir}/man5/%{name}.conf.5* + +%changelog +* Sat Apr 25 2015 Jean-Francois Dockes - 1.20.6-1 +- 1.20.6 + +* Fri Dec 19 2014 Jean-Francois Dockes - 1.20.1-1 +- 1.20.1 + +* Sun Nov 09 2014 Jean-Francois Dockes - 1.19.14p2-1 +- 1.19.14p2 + +* Sun Aug 17 2014 Fedora Release Engineering - 1.19.13-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 1.19.13-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue May 06 2014 Terje Rosten - 1.19.13-1 +- 1.19.13 + +* Mon Jan 20 2014 Terje Rosten - 1.19.11-1 +- 1.19.11 + +* Mon Nov 11 2013 Terje Rosten - 1.19.9-1 +- 1.19.9 + +* Tue Nov 05 2013 Terje Rosten - 1.19.8-1 +- 1.19.8 + +* Sun Aug 04 2013 Fedora Release Engineering - 1.19.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jun 12 2013 Terje Rosten - 1.19.4-2 +- Fix filter setup + +* Mon Jun 10 2013 Terje Rosten - 1.19.4-1 +- 1.19.4 + +* Thu Feb 14 2013 Fedora Release Engineering - 1.18.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Mon Nov 19 2012 Terje Rosten - 1.18.1-1 +- 1.18.1 + +* Sat Jul 21 2012 Fedora Release Engineering - 1.17.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed May 30 2012 Terje Rosten - 1.17.3-1 +- 1.17.3 + +* Sat Mar 31 2012 Terje Rosten - 1.17.1-1 +- 1.17.1 + +* Sun Mar 25 2012 Terje Rosten - 1.17-1 +- 1.17 + +* Tue Feb 28 2012 Fedora Release Engineering - 1.16.2-3 +- Rebuilt for c++ ABI breakage + +* Wed Feb 15 2012 Terje Rosten - 1.16.2-2 +- Add patch to build with gcc 4.7 + +* Wed Feb 01 2012 Terje Rosten - 1.16.2-1 +- 1.16.2 + +* Sat Jan 14 2012 Fedora Release Engineering - 1.16.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Oct 24 2011 Terje Rosten - 1.16.1-2 +- Add patch to fix crash (bz #747472) + +* Tue Oct 18 2011 Terje Rosten - 1.16.1-1 +- 1.16.1 + +* Tue May 24 2011 Terje Rosten - 1.15.8-2 +- add patch from upstream to fix crash. + +* Sun May 08 2011 Terje Rosten - 1.15.8-1 +- 1.15.8 + +* Wed Feb 09 2011 Fedora Release Engineering - 1.14.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Jan 28 2011 Terje Rosten - 1.14.4-1 +- 1.14.4 + +* Mon Nov 15 2010 Terje Rosten - 1.14.2-2 +- Add patch to fix #631704 + +* Sun Nov 7 2010 Terje Rosten - 1.14.2-1 +- 1.14.2 + +* Thu Jul 15 2010 Terje Rosten - 1.13.04-6 +- add patch to build with xapian 1.2 (from J.F. Dockes, thanks) + +* Sat Jul 10 2010 Terje Rosten - 1.13.04-5 +- use system xdg-open +- trim chagenlog + +* Fri Jul 9 2010 Terje Rosten - 1.13.04-4 +- fix some review comments + +* Mon May 10 2010 Terje Rosten - 1.13.04-3 +- use version macro in source url +- don't strip bins, giving non empty debuginfo package +- more explicit file listing +- try to preserve timestamps +- use proper name for spec file +- fix changelog +- license seems to be GPLv2+ +- include some %%doc files +- add buildroot tag +- some source add execute bit set +- explicit enable inotify +- add aspell-devel to bulldreq +- make with _smp_mflags seems to work +- add post scripts +- add patch to build gui with correct flags (ref: 338791) + +* Sun May 9 2010 J.F. Dockes 1.13.04-2 +- bumped the release number to issue new rpms for fc10 + +* Sun May 9 2010 J.F. Dockes 1.13.04 +- updated to recoll release 1.13.04 + +* Fri Feb 12 2010 Terry Duell 1.13.02 +- updated to release 1.13.02 + +* Tue Jan 12 2010 Terry Duell 1.13.01-3 +- updated to fix Fedora desktop-file-install and install icon + +* Sun Jan 10 2010 Jean-Francois Dockes 1.13.01-2 +- updated for recent fedoras: depend on xapian packages, use qt4 + +* Thu Jan 07 2010 Jean-Francois Dockes 1.13.01-1 +- update to release 1.13.01 + +* Wed Feb 1 2006 Jean-Francois Dockes 1.2.0-1 +- initial packaging + diff --git a/packaging/rpm/recollCooker.spec b/packaging/rpm/recollCooker.spec new file mode 100644 index 00000000..9e81496a --- /dev/null +++ b/packaging/rpm/recollCooker.spec @@ -0,0 +1,88 @@ +Summary: Desktop full text search tool with a qt gui +Name: recoll +Version: 1.12.0 +Release: %mkrel 1 +License: GPL +Group: Databases +URL: http://www.recoll.org/ +Source0: http://www.lesbonscomptes.com/recoll/%{name}-%{version}.tar.bz2 +Patch1: %{name}-configure.patch +BuildRequires: libxapian-devel +BuildRequires: libfam-devel +BuildRequires: libqt-devel >= 3.3.7 +BuildRequires: libaspell-devel +Requires: xapian +BuildRoot: %{_tmppath}/%{name}-%{version}--buildroot + +%description +Recoll is a personal full text search tool for Unix/Linux. +It is based on the very strong Xapian backend, for which +it provides an easy to use, feature-rich, easy administration, +QT graphical interface. + +%prep +%setup -q +%patch1 -p0 + +%build +%configure2_5x \ + --with-fam \ + --with-aspell + +%make + +%install +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} + +%makeinstall_std +desktop-file-install --vendor="" \ + --add-category="X-MandrivaLinux-MoreApplications-Databases" \ + --dir %{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/* + +%clean +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} + +%files +%defattr(644,root,root,755) +%doc %{_datadir}/%{name}/doc +%attr(755,root,root) %{_bindir}/%{name}* +%{_datadir}/applications/recoll-searchgui.desktop +%{_datadir}/icons/hicolor/48x48/apps/recoll-searchgui.png +%dir %{_datadir}/%{name} +%dir %{_datadir}/%{name}/examples +%dir %{_datadir}/%{name}/filters +%dir %{_datadir}/%{name}/images +%dir %{_datadir}/%{name}/translations +%{_datadir}/%{name}/examples/mime* +%{_datadir}/%{name}/examples/*.conf +%attr(755,root,root) %{_datadir}/%{name}/examples/rclmon.sh +%attr(755,root,root) %{_datadir}/%{name}/filters/rc* +%{_datadir}/%{name}/filters/xdg-open +%{_datadir}/%{name}/images/*png +%{_mandir}/man1/recoll* +%{_mandir}/man5/recoll* +%{_datadir}/%{name}/translations/*.qm + + +%changelog +* Fri Apr 20 2007 Tomasz Pawel Gajc 1.12.1-1mdv2008.0 ++ Revision: 16093 +- new version +- drop P0 + + + Mandriva + + +* Tue Mar 06 2007 Tomasz Pawel Gajc 1.7.5-2mdv2007.0 ++ Revision: 134128 +- rebuild + +* Tue Jan 30 2007 Tomasz Pawel Gajc 1.7.5-1mdv2007.1 ++ Revision: 115423 +- add patch 1 - fix build on x86_64 +- add patch 0 - fix menu entry +- fix group +- add buildrequires +- set correct bits on files +- Import recoll + diff --git a/packaging/rpm/recollfedora.spec b/packaging/rpm/recollfedora.spec new file mode 100644 index 00000000..0f266295 --- /dev/null +++ b/packaging/rpm/recollfedora.spec @@ -0,0 +1,224 @@ +Summary: Desktop full text search tool with Qt GUI +Name: recoll +Version: 1.20.6 +Release: 1%{?dist} +Group: Applications/Databases +License: GPLv2+ +URL: http://www.lesbonscomptes.com/recoll/ +Source0: http://www.lesbonscomptes.com/recoll/recoll-%{version}.tar.gz +BuildRequires: qt-devel +BuildRequires: qtwebkit-devel +BuildRequires: python-devel +BuildRequires: zlib-devel +BuildRequires: aspell-devel +BuildRequires: xapian-core-devel +BuildRequires: desktop-file-utils +Requires: xdg-utils + +%description +Recoll is a personal full text search package for Linux, FreeBSD and +other Unix systems. It is based on a very strong back end (Xapian), for +which it provides an easy to use, feature-rich, easy administration +interface. +%global __provides_exclude_from ^%{_libdir}/recoll/librecoll\\.so.*$ +%global __requires_exclude ^librecoll\\.so.*$ + +%prep +%setup -q -n %{name}-%{version} +chmod 0644 utils/{conftree.cpp,conftree.h,debuglog.cpp,debuglog.h} + +%build +export QMAKE=qmake-qt4 +%configure +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} STRIP=/bin/true INSTALL='install -p' + +desktop-file-install --delete-original \ + --dir=%{buildroot}/%{_datadir}/applications \ + %{buildroot}/%{_datadir}/applications/%{name}-searchgui.desktop + +# use /usr/bin/xdg-open +rm -f %{buildroot}/usr/share/recoll/filters/xdg-open + +# fix perms +chmod 0755 %{buildroot}/usr/share/recoll/filters/rclexecm.py +chmod 0755 %{buildroot}%{_libdir}/recoll/librecoll.so.* + +%post +touch --no-create %{_datadir}/icons/hicolor +if [ -x %{_bindir}/gtk-update-icon-cache ] ; then + %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor +fi +if [ -x %{_bindir}/update-desktop-database ] ; then + %{_bindir}/update-desktop-database &> /dev/null +fi +exit 0 + +%postun +touch --no-create %{_datadir}/icons/hicolor +if [ -x %{_bindir}/gtk-update-icon-cache ] ; then + %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor +fi +if [ -x %{_bindir}/update-desktop-database ] ; then + %{_bindir}/update-desktop-database &> /dev/null +fi +exit 0 + +%files +%doc COPYING ChangeLog README +%{_bindir}/%{name} +%{_bindir}/%{name}index +%{_datadir}/%{name} +%{_datadir}/appdata/%{name}.appdata.xml +%{_datadir}/applications/%{name}-searchgui.desktop +%{_datadir}/icons/hicolor/48x48/apps/%{name}.png +%{_datadir}/pixmaps/%{name}.png +%{_libdir}/recoll +%{python_sitearch}/recoll +%{python_sitearch}/Recoll*.egg-info +%{_mandir}/man1/%{name}.1* +%{_mandir}/man1/recollq.1* +%{_mandir}/man1/%{name}index.1* +%{_mandir}/man5/%{name}.conf.5* + +%changelog +* Sat Apr 25 2015 Jean-Francois Dockes - 1.20.6-1 +- 1.20.6 + +* Fri Dec 19 2014 Jean-Francois Dockes - 1.20.1-1 +- 1.20.1 + +* Sun Nov 09 2014 Jean-Francois Dockes - 1.19.14p2-1 +- 1.19.14p2 + +* Sun Aug 17 2014 Fedora Release Engineering - 1.19.13-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 1.19.13-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue May 06 2014 Terje Rosten - 1.19.13-1 +- 1.19.13 + +* Mon Jan 20 2014 Terje Rosten - 1.19.11-1 +- 1.19.11 + +* Mon Nov 11 2013 Terje Rosten - 1.19.9-1 +- 1.19.9 + +* Tue Nov 05 2013 Terje Rosten - 1.19.8-1 +- 1.19.8 + +* Sun Aug 04 2013 Fedora Release Engineering - 1.19.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jun 12 2013 Terje Rosten - 1.19.4-2 +- Fix filter setup + +* Mon Jun 10 2013 Terje Rosten - 1.19.4-1 +- 1.19.4 + +* Thu Feb 14 2013 Fedora Release Engineering - 1.18.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Mon Nov 19 2012 Terje Rosten - 1.18.1-1 +- 1.18.1 + +* Sat Jul 21 2012 Fedora Release Engineering - 1.17.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed May 30 2012 Terje Rosten - 1.17.3-1 +- 1.17.3 + +* Sat Mar 31 2012 Terje Rosten - 1.17.1-1 +- 1.17.1 + +* Sun Mar 25 2012 Terje Rosten - 1.17-1 +- 1.17 + +* Tue Feb 28 2012 Fedora Release Engineering - 1.16.2-3 +- Rebuilt for c++ ABI breakage + +* Wed Feb 15 2012 Terje Rosten - 1.16.2-2 +- Add patch to build with gcc 4.7 + +* Wed Feb 01 2012 Terje Rosten - 1.16.2-1 +- 1.16.2 + +* Sat Jan 14 2012 Fedora Release Engineering - 1.16.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Oct 24 2011 Terje Rosten - 1.16.1-2 +- Add patch to fix crash (bz #747472) + +* Tue Oct 18 2011 Terje Rosten - 1.16.1-1 +- 1.16.1 + +* Tue May 24 2011 Terje Rosten - 1.15.8-2 +- add patch from upstream to fix crash. + +* Sun May 08 2011 Terje Rosten - 1.15.8-1 +- 1.15.8 + +* Wed Feb 09 2011 Fedora Release Engineering - 1.14.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Jan 28 2011 Terje Rosten - 1.14.4-1 +- 1.14.4 + +* Mon Nov 15 2010 Terje Rosten - 1.14.2-2 +- Add patch to fix #631704 + +* Sun Nov 7 2010 Terje Rosten - 1.14.2-1 +- 1.14.2 + +* Thu Jul 15 2010 Terje Rosten - 1.13.04-6 +- add patch to build with xapian 1.2 (from J.F. Dockes, thanks) + +* Sat Jul 10 2010 Terje Rosten - 1.13.04-5 +- use system xdg-open +- trim chagenlog + +* Fri Jul 9 2010 Terje Rosten - 1.13.04-4 +- fix some review comments + +* Mon May 10 2010 Terje Rosten - 1.13.04-3 +- use version macro in source url +- don't strip bins, giving non empty debuginfo package +- more explicit file listing +- try to preserve timestamps +- use proper name for spec file +- fix changelog +- license seems to be GPLv2+ +- include some %%doc files +- add buildroot tag +- some source add execute bit set +- explicit enable inotify +- add aspell-devel to bulldreq +- make with _smp_mflags seems to work +- add post scripts +- add patch to build gui with correct flags (ref: 338791) + +* Sun May 9 2010 J.F. Dockes 1.13.04-2 +- bumped the release number to issue new rpms for fc10 + +* Sun May 9 2010 J.F. Dockes 1.13.04 +- updated to recoll release 1.13.04 + +* Fri Feb 12 2010 Terry Duell 1.13.02 +- updated to release 1.13.02 + +* Tue Jan 12 2010 Terry Duell 1.13.01-3 +- updated to fix Fedora desktop-file-install and install icon + +* Sun Jan 10 2010 Jean-Francois Dockes 1.13.01-2 +- updated for recent fedoras: depend on xapian packages, use qt4 + +* Thu Jan 07 2010 Jean-Francois Dockes 1.13.01-1 +- update to release 1.13.01 + +* Wed Feb 1 2006 Jean-Francois Dockes 1.2.0-1 +- initial packaging + diff --git a/packaging/rpm/recollmdk.spec b/packaging/rpm/recollmdk.spec new file mode 100644 index 00000000..3b4d1168 --- /dev/null +++ b/packaging/rpm/recollmdk.spec @@ -0,0 +1,130 @@ +%define name recoll +%define version 1.18.1 +%define release %mkrel 1 + +Name: %{name} +Version: %{version} +Release: %{release} + +Summary: Desktop full text search tool with a qt gui +Source0: http://www.recoll.org/%{name}-%{version}.tar.gz +URL: http://www.recoll.org/ +Group: Applications/Databases + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +License: GPL +BuildRequires: libqt4-devel +BuildRequires: libqtwebkit2.2-devel +BuildRequires: libpython-devel +BuildRequires: libxapian-devel + +%description +Recoll is a personal full text search package for Linux, FreeBSD and +other Unix systems. It is based on a very strong backend (Xapian), for +which it provides an easy to use, feature-rich, easy administration +interface. + +# --------------------------------------------------------------------------- + +%prep +%setup -q + +# --------------------------------------------------------------------------- + +%build +[ -n "$QTDIR" ] || . %{_sysconfdir}/profile.d/60qt4.sh +%configure +make %{?_smp_mflags} + +# --------------------------------------------------------------------------- + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall + +# --------------------------------------------------------------------------- + +%clean +rm -rf $RPM_BUILD_ROOT + +# --------------------------------------------------------------------------- + +%files +%defattr(-,root,root,-) +%{_bindir}/* +%{_datadir}/applications/recoll-searchgui.desktop +%{_datadir}/icons/hicolor/48x48/apps/recoll.png +%{_datadir}/pixmaps/recoll.png +%{_datadir}/%{name} +%{_mandir}/man1/recoll* +%{_mandir}/man5/recoll* +%{python_sitearch}/Recoll*.egg-info +%{python_sitearch}/recoll.so + +# --------------------------------------------------------------------------- + +%changelog +* Mon Nov 05 2012 Jean-Francois Dockes 1.18.1-1 +- Update to release 1.18.1 +* Thu May 17 2012 Jean-Francois Dockes 1.17.2-1 +- Update to release 1.17.2 +* Mon Nov 07 2011 Jean-Francois Dockes 1.16.2-1 +- Update to release 1.16.2 +* Wed Sep 28 2011 Jean-Francois Dockes 1.16.1-1 +- Update to release 1.16.1 +* Wed Sep 21 2011 Jean-Francois Dockes 1.16.0-1 +- Update to release 1.16.0 +* Tue May 03 2011 Jean-Francois Dockes 1.15.8-1 +- Update to release 1.15.8 +* Fri Mar 04 2011 Jean-Francois Dockes 1.15.5-1 +- Update to release 1.15.5 +* Thu Feb 15 2011 Jean-Francois Dockes 1.15.2-1 +- Update to release 1.15.2 +* Wed Feb 02 2011 Jean-Francois Dockes 1.15.0-1 +- Update to release 1.15.0 +* Thu Nov 25 2010 Jean-Francois Dockes 1.14.3-1 +- Update to release 1.14.2 +* Sat Sep 24 2010 Jean-Francois Dockes 1.14.2-1 +- Update to release 1.14.2 +* Mon Sep 13 2010 Jean-Francois Dockes 1.14.0-1 +- Update to release 1.14.0 +* Thu Apr 14 2010 Jean-Francois Dockes 1.13.04-1 +- Update to release 1.13.01 +* Thu Jan 07 2010 Jean-Francois Dockes 1.13.01-1 +- Update to release 1.13.01 +* Thu Dec 10 2009 Jean-Francois Dockes 1.12.4-1 +- Update to release 1.12.2 +* Mon Oct 19 2009 Jean-Francois Dockes 1.12.2-1 +- Update to release 1.12.2 +* Thu Jan 29 2009 Jean-Francois Dockes 1.12.0-1 +- Update to release 1.12.0 +* Mon Oct 13 2008 Jean-Francois Dockes 1.11.0-1 +- Update to release 1.11.0 +* Thu May 27 2008 Jean-Francois Dockes 1.10.2-1 +- Update to release 1.10.2 +* Thu Jan 31 2008 Jean-Francois Dockes 1.10.1-1 +- Update to release 1.10.1 +* Wed Nov 21 2007 Jean-Francois Dockes 1.10.0-1 +- Update to release 1.10.0 +* Tue Sep 11 2007 Jean-Francois Dockes 1.9.0-1 +- Update to release 1.9.0 +* Tue Mar 6 2007 Jean-Francois Dockes 1.8.1-1 +- Update to release 1.8.1 +* Mon Jan 15 2007 Jean-Francois Dockes 1.7.5-1 +- Update to release 1.7.5 +* Mon Jan 08 2007 Jean-Francois Dockes 1.7.3-1 +- Update to release 1.7.3 +* Tue Nov 28 2006 Jean-Francois Dockes 1.6.1-1 +- Update to release 1.6.1 +* Mon Nov 20 2006 Jean-Francois Dockes 1.5.11-1 +- Update to release 1.5.11 +* Mon Oct 2 2006 Jean-Francois Dockes 1.5.2-1 +- Update to release 1.5.2 +* Sun May 7 2006 Jean-Francois Dockes 1.4.3-1 +- Update to release 1.4.3 +* Fri Mar 31 2006 Jean-Francois Dockes 1.3.3-1 +- Update to release 1.3.3 +* Thu Feb 2 2006 Jean-Francois Dockes 1.2.2-1 +- Update to release 1.2.2 +* Thu Jan 10 2006 Jean-Francois Dockes 1.1.0-1 +- Initial packaging diff --git a/src/COPYING b/src/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/src/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/ChangeLog b/src/ChangeLog new file mode 100644 index 00000000..dd186d2d --- /dev/null +++ b/src/ChangeLog @@ -0,0 +1,10552 @@ +2010-02-02 15:33 +0100 Jean-Francois Dockes (d11da0283f03 [tip]) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/query/plaintorich.cpp, src/query/recollq.cpp, + src/query/wasatorcl.cpp, src/rcldb/rcldb.cpp, + src/rcldb/searchdata.cpp, src/rcldb/stoplist.cpp, + src/rcldb/stoplist.h: + cosmetics: use derived class for actual splitter instead of callback + +2010-02-02 10:24 +0100 Jean-Francois Dockes (a8caf709bcd3) + + * src/qt4gui/rclmain.ui, src/qtgui/rclmain.ui, + src/qtgui/rclmain_w.cpp: + QT GUI: define accelerators for res list page movements + +2010-02-02 08:20 +0100 Jean-Francois Dockes (ec31e285a553) + + * src/qtgui/reslist.cpp, src/query/reslistpager.h: + Qt GUI: ensure that new page size is taken into account ASAP (no + need for restarting app) + +2010-02-01 17:51 +0100 Jean-Francois Dockes (db953bb94c7f) + + * src/qt4gui/rclmain.ui, src/qtgui/preview_w.cpp, + src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h: + QT GUI: add fullscreen mode + +2010-02-01 10:31 +0100 Jean-Francois Dockes (1eda55ae3be9) + + * src/mk/manifest.txt: new file. + * src/excludefile, src/makesrcdist.sh, src/mk/manifest.txt: + Making a source dist: check the new list against old reference + + other checks + +2010-01-31 19:53 +0100 Israel G. Lugo (74d4e25d43c2) + + * src/recollinstall.in: + Install recollq and its manpage when in cmdline mode. Don't install + the recoll.1 manpage when in cmdline mode. + +2010-01-31 19:47 +0100 Jean-Francois Dockes (c88b0ef40512) + + * src/common/autoconfig.h.in: + use 3-arg version of ac_define as the 1-arg one is being obsoleted + +2010-01-31 19:45 +0100 Jean-Francois Dockes (1960435ccb68) + + * src/configure.ac: + Dispense with the x11-monitoring when neither fam nor inotify are + configured + +2010-01-31 19:35 +0100 Jean-Francois Dockes (08e6abfc5fdf) + + * src/configure.ac: + use 3-arg version of ac_define as the 1-arg one is being obsoleted + +2010-01-31 19:34 +0100 Jean-Francois Dockes (c0add9dd8ad4) + + * website/download.html: + none + +2010-01-30 17:47 +0100 Jean-Francois Dockes (5ed138ff2230) + + * src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: + QT GUI: fix small problems in newly native qt4 term expander + +2010-01-30 17:31 +0100 Jean-Francois Dockes (6ecf959a8e01) + + * src/qt4gui/spell.ui: new file. + * src/qt4gui/recollmain.ui: deleted file. + * .hgignore, src/qt4gui/recollmain.ui, src/qt4gui/spell.ui, + src/qt4gui/uifrom3, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: + QT GUI: converted the qt4 term expander dialog to native qt4 + +2010-01-30 14:09 +0100 Jean-Francois Dockes (df8a91aaff88) + + * src/qt4gui/rclmain.ui: new file. + * .hgignore, src/qt4gui/rclmain.ui, src/qt4gui/uifrom3, + src/qtgui/confgui/confguiindex.h, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h: + Qt GUI: made the Qt4 main window native Qt4 (no more use of + Q3MainWindow) + +2010-01-30 08:23 +0100 Jean-Francois Dockes (ed18703563b7) + + * .hgignore, src/ChangeLog, website/BUGS.html, website/devel.html, + website/doc.html, website/download.html, website/index.html.en: + none + +2010-01-30 08:23 +0100 Jean-Francois Dockes (22044a3b2e2c) + + * src/qtgui/rclmain_w.h: + Qt 4.6.1 Uic bug: change qt version test from == to <= as bug still + here in 4.6.2 + +2010-01-30 08:21 +0100 Jean-Francois Dockes (b1cb8c664953) + + * src/common/autoconfig.h.in, src/configure, src/configure.ac, + src/index/recollindex.cpp, src/utils/x11mon.cpp: + Renamed WITHOUT_X11 to DISABLE_X11MON for clarification + +2010-01-30 08:18 +0100 Israel G. Lugo (be03b72e1258) + + * src/configure.ac: + Rename option without-gui to disable-qtgui. New option disable- + x11mon. Separate control of creation of the gui and X11 session + monitoring. + +2010-01-29 19:00 +0100 Jean-Francois Dockes (d95c21312a15) + + * src/kde/kioslave/recoll/CMakeLists.txt: + KIO slave: fixed CMakeList to configure Recoll with --enable-pic + +2010-01-29 17:22 +0100 Jean-Francois Dockes (266941720a99) + + * src/python/README.txt: new file. + * src/configure, src/configure.ac, src/doc/user/usermanual.sgml, + src/lib/Makefile, src/lib/mkMake, src/mk/commondefs, + src/mk/localdefs.in, src/php/00README.txt, src/python/README.txt, + src/python/recoll/setup.py: + Implemented configure --enable-pic flag to build the main lib with + position-independant objects. This avoids having to edit localdefs + by hand to build the new php extension, and voids the need for the + Python module to recompile Recoll source files. + +2010-01-29 15:47 +0100 Jean-Francois Dockes (69c42078b8d3) + + * src/php/00README.txt: new file. + * src/php/00README.txt, src/php/recoll/make.sh, + src/php/recoll/recoll.cpp: + PHP extension by Wenqiang Song : make ready for external use. + - added minimal doc + - fixed build script to work around php/libtool issue + - have the module default to Query Language (instead of AND) + +2010-01-28 18:22 +0100 Jean-Francois Dockes (45e7ec5e16c5) + + * .hgignore, website/usermanual/README-dir.txt: new file. + * packaging/debian/changelog, packaging/debian/compat, + packaging/debian/control, packaging/debian/copyright, + packaging/debian/docs, packaging/debian/menu, + packaging/debian/rules, packaging/debian/watch: deleted file. + * .hgignore, packaging/debian/changelog, packaging/debian/compat, + packaging/debian/control, packaging/debian/copyright, + packaging/debian/docs, packaging/debian/menu, + packaging/debian/rules, packaging/debian/watch, src/makesrcdist.sh, + website/usermanual/README-dir.txt: + svn->mercurial modifications + +2010-01-28 16:13 +0000 convert-repo (e85c82d42126) + + * .hgtags: new file. + * .hgtags: + update tags + +2010-01-26 13:23 +0000 dockes (c0cb63a2702a) + + * last before trial switch to mercurial. really. Yeah + +2010-01-26 13:22 +0000 dockes (c40e044c63dd) + + * tests/chm/chm.sh, tests/chm/chm.txt, tests/ics/ics.sh, + tests/ics/ics.txt, tests/zip/mcKee.zip, tests/zip/zip.sh, + tests/zip/zip.txt, website/download-1.12.html: new file. + * tests/chm/chm.sh, tests/chm/chm.txt, tests/ics/ics.sh, + tests/ics/ics.txt, tests/zip/mcKee.zip, tests/zip/zip.sh, + tests/zip/zip.txt, website/download-1.12.html: + last before trial switch to mercurial. really + +2010-01-26 13:21 +0000 dockes (7918f7073757) + + * website/BUGS.html, website/CHANGES.html, website/download.html, + website/index.html.en, website/index.html.fr: + last before trial switch to mercurial + +2010-01-26 07:06 +0000 dockes (0b5ec08c2ba2) + + * src/INSTALL, src/README: + + +2010-01-26 07:06 +0000 dockes (f6a420527382) + + * src/VERSION: + 1.13.02 + +2010-01-26 06:50 +0000 dockes (b223f221578a [RECOLL_1_13_02]) + + * src/doc/user/usermanual.sgml: + clarified --prefix et al + +2010-01-25 20:43 +0000 dockes (7d69ae778654) + + * src/qt4gui/ui_rclmain.h-4.5: new file. + * src/qt4gui/ui_rclmain.h-4.5, src/qtgui/rclmain_w.h: + use older ui include file under qt 4.6.1, the one its uic generates + is broken + +2010-01-25 11:08 +0000 dockes (e2e5a1dd802d) + + * src/php/recoll/recollq.h: deleted file. + * src/php/recoll/recollq.h: + not used? + +2010-01-25 11:06 +0000 dockes (1683475297c1) + + * src/php/recoll/config.m4, src/php/recoll/make.sh, + src/php/recoll/php_recoll.h, src/php/recoll/recoll.cpp, + src/php/recoll/recollq.h, src/php/sample/shell.php: new file. + * src/php/recoll/config.m4, src/php/recoll/make.sh, + src/php/recoll/php_recoll.h, src/php/recoll/recoll.cpp, + src/php/recoll/recollq.h, src/php/sample/shell.php: + initial import from W. Song + +2010-01-20 07:42 +0000 dockes (4df8ebfbb72d) + + * packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec, + packaging/rpm/recollfedora10.spec, packaging/rpm/recollmdk.spec: + change mail address + +2010-01-10 10:18 +0000 dockes (1c62f24a5ca4) + + * packaging/rpm/recollfedora.spec: + updated for fc12: depend on xapian-core, use qt4 + +2010-01-07 15:20 +0000 dockes (01eb4176400c) + + * src/query/recollq.cpp: + add option to print abstracts + +2010-01-07 08:42 +0000 dockes (a41bbccff862) + + * src/VERSION: + 1.13.01 + +2010-01-07 08:41 +0000 dockes (dde7b27846ef) + + * src/Makefile.in: + distclean removes rclexecm.pyc + +2010-01-07 08:34 +0000 dockes (324bea9902a4) + + * src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h: + moved initial db open and possible message boxes from main.cpp to + rclmain_w.cpp first post-init job to avoid random crashes apparently + related to the dialogs being created before app.exec(). Exact cause + not certain, but crashes gone... + +2010-01-07 08:29 +0000 dockes (0629e02f12fe) + + * src/rcldb/searchdata.cpp: + field values were not used in case term expansion was not performed + (phrase or capitalized term) + +2010-01-06 13:29 +0000 dockes (e10bbaeefab5) + + * src/kde/kioslave/recoll/htmlif.cpp, src/query/recollq.cpp, + src/query/xadump.cpp: + adapt kio and recollq to the new internfile interface + +2010-01-06 13:06 +0000 dockes (0f2378be2603) + + * src/kde/kioslave/recoll/CMakeLists.txt: + add libz + +2010-01-05 15:00 +0000 dockes (1ca577447878) + + * src/utils/closefrom.cpp, src/utils/fstreewalk.cpp, + src/utils/fstreewalk.h, tests/Maildir/Maildir.txt, + tests/andor/andor.sh, tests/andor/andor.txt, tests/cjk/cjk.sh, + tests/cjk/cjk.txt, tests/mail/mail.txt, tests/msword/msword.txt, + tests/txt/txt.txt, website/download.html: + 1.13 tests txt mods + solaris port (FNM_LEADING_DIR) + +2010-01-05 13:27 +0000 dockes (0ab6a2dfc2c3) + + * website/BUGS.html, website/CHANGES.html, website/copydocs, + website/credits.html, website/download.html, website/features.html, + website/index.html.en, website/index.html.fr: + web update for 1.13 + +2010-01-05 07:14 +0000 dockes (cb08729afcd2) + + * src/INSTALL, src/README: + + +2010-01-05 07:14 +0000 dockes (a1ba9ba640f7) + + * src/VERSION, src/common/rclconfig.cpp, src/doc/man/recoll.conf.5, + src/doc/user/usermanual.sgml: + 1.13.00: fixed doc ortographic typos + +2009-12-31 08:20 +0000 dockes (c2ae39772161) + + * src/INSTALL, src/README: + + +2009-12-31 08:15 +0000 dockes (851e5b82f3d5) + + * src/VERSION: + 1.13.0 + +2009-12-31 08:15 +0000 dockes (04512125010e) + + * src/recollinstall.in: + handle --without-gui config inside recollinstall.in + +2009-12-20 14:31 +0000 dockes (2cbda11286c5) + + * src/configure, src/configure.ac: + typo in WIHOUT_X11 + +2009-12-17 20:23 +0000 dockes (95eb8a010525) + + * src/doc/user/usermanual.sgml: + There was an error in the mimemap format in the config exemple + +2009-12-14 10:33 +0000 dockes (1e774739395e) + + * src/INSTALL, src/README: + + +2009-12-14 10:33 +0000 dockes (49cdfe826199) + + * src/ChangeLog: + snapshot du jour + +2009-12-14 10:23 +0000 dockes (437be900fa14) + + * src/doc/user/Makefile, src/doc/user/usermanual.sgml: + add --enable-camelcase doc + fix typo in doc Makefile comment + +2009-12-14 10:10 +0000 dockes (009ed00592fd) + + * src/common/autoconfig.h.in, src/common/textsplit.cpp, src/configure, + src/configure.ac: + add --enable-camelcase option to configure + +2009-12-14 09:46 +0000 dockes (1fabd736d16f) + + * src/doc/user/usermanual.sgml, src/index/fsindexer.cpp: + use : as separator in localfields value before parsing as confsimple + +2009-12-14 09:44 +0000 dockes (2b09276dedc8) + + * src/utils/circache.cpp: + fix pointer casting to make gcc happy + +2009-12-14 09:44 +0000 dockes (4ee0085fa59e) + + * src/sampleconf/fields: + typo: keywords->keyword in prefixes + +2009-12-14 09:43 +0000 dockes (87b2caa6ec9c) + + * src/filters/rclabw, src/filters/rcldjvu, src/filters/rcldoc, + src/filters/rcldvi, src/filters/rclflac, src/filters/rclgaim, + src/filters/rclid3, src/filters/rclkwd, src/filters/rcllyx, + src/filters/rclman, src/filters/rclogg, src/filters/rclopxml, + src/filters/rclpdf, src/filters/rclppt, src/filters/rclps, + src/filters/rclpurple, src/filters/rclrtf, src/filters/rclscribus, + src/filters/rclsiduxman, src/filters/rclsoff, src/filters/rclsvg, + src/filters/rcltex, src/filters/rcltext, src/filters/rclwpd, + src/filters/rclxls, src/filters/recfiltcommon: + iscmd: supplement -x with -d test not a dir + +2009-12-14 07:26 +0000 dockes (b8eceb552b3e) + + * src/INSTALL, src/README: + + +2009-12-14 07:25 +0000 dockes (16dc2e0ed9fa) + + * src/makesrcdist.sh: + + +2009-12-14 07:13 +0000 dockes (e5aae08ee26d) + + * src/Makefile.in: + + +2009-12-14 07:07 +0000 dockes (c66c86594b35) + + * src/VERSION: + + +2009-12-14 07:06 +0000 dockes (7229a431d686) + + * src/makesrcdist.sh: + use different release name for beta versions + +2009-12-13 21:40 +0000 dockes (e0033b00df1e) + + * src/doc/user/usermanual.sgml: + anacron + +2009-12-13 16:16 +0000 dockes (e148cd3f92c1) + + * src/sampleconf/recoll.conf.in: + add localfields example + +2009-12-13 16:13 +0000 dockes (89ebf91076d8) + + * src/common/textsplit.cpp, src/internfile/mh_html.cpp, + src/query/plaintorich.cpp, src/utils/base64.cpp: + small amd64 fixes: 64 bits size_type, signed chars + +2009-12-08 07:43 +0000 dockes (026aa6df356f) + + * src/doc/man/recollindex.1, src/doc/man/recollq.1: + clarify stemming options + +2009-12-08 07:43 +0000 dockes (0c698007055e) + + * src/query/recollq.cpp: + add option -s to select stemming language + +2009-12-08 07:42 +0000 dockes (fcb5bca6adf8) + + * src/rcldb/stemdb.cpp: + traces + +2009-12-07 18:47 +0000 dockes (6631c645c9df) + + * src/index/recollindex.cpp: + use setpriority() to be a nice indexer + +2009-12-07 17:43 +0000 dockes (76128d18110e [RECOLL_1_13_0, RECOLL_20091214, RECOLL_1_13_01, RECOLL_1_13_00]) + + * src/qtgui/preview_w.cpp, src/qtgui/preview_w.h: + reimplemented Q3TextDocument::find() to be like the qt3 version + +2009-12-07 14:32 +0000 dockes (b02171ea3078) + + * src/qtgui/preview_w.cpp: + switch preview qtextedit format back to plain text after loading so + that selections copy plain text not html + +2009-12-07 13:27 +0000 dockes (3d37dc441cc9) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp: + Term expansion: handle field issues inside rcldb::termmatch, + ensuring that we take the field name into account for all + expansions. Ensures that File Name searches and filename: query + language searches work the same, + overall better consistency + +2009-12-07 13:24 +0000 dockes (fe625ef90a21) + + * src/configure.ac: + Israel G. Lugo: make sure that only one of inotify or FAM gets + enabled, giving priority to inotify. + +2009-11-30 10:04 +0000 dockes (a75cd5af7c71) + + * src/VERSION, src/internfile/mimehandler.cpp, + src/kde/kioslave/recoll/htmlif.cpp, src/qtgui/preview_w.cpp, + src/qtgui/preview_w.h, src/query/plaintorich.cpp, + src/query/plaintorich.h, src/sampleconf/mimeconf: + add
 tag to text/plain translated into qt html to preserve
+	indentation. Removes need for rcltext (which did just this). Allow
+	specifying any text/xxx as internal (allows having specific editor
+	but no filter)
+
+2009-11-30 06:34 +0000  dockes    (c4fdcda7df89)
+
+	* src/index/rclmonrcv.cpp:
+	compile either fam or inotify not both
+
+2009-11-29 15:00 +0000  dockes    (6b9ed9ae0949)
+
+	* src/doc/user/usermanual.sgml:
+	change defaults for big text params
+
+2009-11-29 12:56 +0000  dockes    (a04f5006fe89)
+
+	* src/sampleconf/recoll.conf.in:
+	add new 1.13 variables and defaults
+
+2009-11-28 09:15 +0000  dockes    (4b56c2068545)
+
+	* src/internfile/mh_execm.cpp, src/internfile/mh_text.cpp,
+	src/query/docseqhist.cpp, src/utils/circache.cpp:
+	new glibc missing includes
+
+2009-11-28 08:45 +0000  dockes    (012b4b63e260)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts:
+	
+
+2009-11-28 08:14 +0000  dockes    (b0e70a20b7f1)
+
+	* src/index/beaglequeue.cpp, src/internfile/mh_text.cpp,
+	src/qtgui/confgui/confguiindex.cpp, src/qtgui/guiutils.cpp:
+	set defaults usedesktoprefs, maxtext 20mb pagesz 1000k webcache 40m
+
+2009-11-28 08:11 +0000  dockes    (ed3a574543f5)
+
+	* src/doc/user/usermanual.sgml:
+	clean-up + documented 1.13 new features
+
+2009-11-28 06:39 +0000  dockes    (c45a690ee533)
+
+	* src/internfile/mh_mbox.cpp:
+	converted iostream to stdio because of mysterious read errors at the
+	last position in the offsets file
+
+2009-11-27 13:23 +0000  dockes    (7fa95cd57200)
+
+	* src/internfile/mh_mail.cpp:
+	add cnf(maildefcharset) to set specific mail default charset (mainly
+	for readpst extracts which are utf-8 but have no charset set)
+
+2009-11-27 13:11 +0000  dockes    (385305ee1820)
+
+	* src/rcldb/rcldb.cpp:
+	loglevel
+
+2009-11-27 13:08 +0000  dockes    (8cc1ab099807)
+
+	* src/internfile/mh_mbox.cpp:
+	include sys/stat
+
+2009-11-27 12:41 +0000  dockes    (c3039d4eab51)
+
+	* src/internfile/Filter.h, src/internfile/internfile.cpp,
+	src/internfile/mh_mbox.cpp, src/internfile/mh_mbox.h,
+	src/internfile/mimehandler.h, src/query/docseqhist.cpp:
+	implemented a cache for mbox message header offsets
+
+2009-11-27 07:07 +0000  dockes    (a1a92e0952dd)
+
+	* src/internfile/mh_mbox.cpp:
+	Support From "bla bla" (quoted) From lines
+
+2009-11-27 07:00 +0000  dockes    (64f09e3ad5a7)
+
+	* src/internfile/internfile.cpp:
+	update test driver
+
+2009-11-26 14:03 +0000  dockes    (023c2a8520de)
+
+	* src/aspell/rclaspell.cpp, src/aspell/rclaspell.h,
+	src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/query/docseq.h,
+	src/query/docseqdb.cpp, src/query/docseqdb.h,
+	src/query/reslistpager.cpp, src/query/reslistpager.h,
+	src/rcldb/rcldb.cpp, src/rcldb/searchdata.cpp,
+	src/rcldb/searchdata.h:
+	suggest alternate spellings if no results
+
+2009-11-26 13:52 +0000  dockes    (4270622aa3e0)
+
+	* src/qtgui/guiutils.cpp:
+	suppressed core dump at exit on unexisting config
+
+2009-11-26 07:17 +0000  dockes    (f02bf2b6ea30)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/rcldb/rclquery.h:
+	use only match terms to build doc abstract, not all query terms
+	(might save a little effort)
+
+2009-11-26 07:15 +0000  dockes    (90776b10554c)
+
+	* src/qtgui/rclmain_w.cpp:
+	spell tool must be created even is USE_ASPELL is undefined
+
+2009-11-25 14:37 +0000  dockes    (e3faedd237b8)
+
+	* src/utils/md5.cpp:
+	suppress unused parm warning
+
+2009-11-25 11:07 +0000  dockes    (f8011c9579c8)
+
+	* packaging/debian/debiankio/changelog,
+	packaging/debian/debiankio/compat,
+	packaging/debian/debiankio/control,
+	packaging/debian/debiankio/copyright,
+	packaging/debian/debiankio/dirs, packaging/debian/debiankio/docs,
+	packaging/debian/debiankio/rules, packaging/debian/debiankio/watch,
+	packaging/debian/debianrecoll/changelog,
+	packaging/debian/debianrecoll/compat,
+	packaging/debian/debianrecoll/control,
+	packaging/debian/debianrecoll/copyright,
+	packaging/debian/debianrecoll/docs,
+	packaging/debian/debianrecoll/menu,
+	packaging/debian/debianrecoll/rules,
+	packaging/debian/debianrecoll/watch: new file.
+	* packaging/debian/debiankio/changelog,
+	packaging/debian/debiankio/compat,
+	packaging/debian/debiankio/control,
+	packaging/debian/debiankio/copyright,
+	packaging/debian/debiankio/dirs, packaging/debian/debiankio/docs,
+	packaging/debian/debiankio/rules, packaging/debian/debiankio/watch,
+	packaging/debian/debianrecoll/changelog,
+	packaging/debian/debianrecoll/compat,
+	packaging/debian/debianrecoll/control,
+	packaging/debian/debianrecoll/copyright,
+	packaging/debian/debianrecoll/docs,
+	packaging/debian/debianrecoll/menu,
+	packaging/debian/debianrecoll/rules,
+	packaging/debian/debianrecoll/watch:
+	added debian dir to build kio-recoll
+
+2009-11-24 10:25 +0000  dockes    (87057b6e2cba)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt:
+	execute minimum recoll config inside cmakelists to create rclversion
+	and autoconfig includes
+
+2009-11-24 10:24 +0000  dockes    (a6e854084ffb)
+
+	* src/utils/smallut.h:
+	gcc4
+
+2009-11-23 19:51 +0000  dockes    (42785e498950)
+
+	* src/index/beaglequeue.cpp:
+	store beagle fields before interning the file
+
+2009-11-23 17:38 +0000  dockes    (aaccb7e813a8)
+
+	* src/qtgui/preview_w.cpp:
+	if text is empty, display fields by default
+
+2009-11-23 17:37 +0000  dockes    (129654f22b3c)
+
+	* src/internfile/internfile.cpp:
+	in FileInterner::FileInterner(Rcl::Doc) (query), declare the
+	BeagleQueue static so that the cache persists between FileInterner
+	objects
+
+2009-11-23 17:36 +0000  dockes    (2292efb797b4)
+
+	* src/internfile/internfile.h:
+	comments
+
+2009-11-23 16:12 +0000  dockes    (a7ed9c85c313)
+
+	* src/query/dynconf.cpp, src/query/dynconf.h: new file.
+	* src/query/history.cpp, src/query/history.h: deleted file.
+	* src/lib/Makefile, src/lib/mkMake, src/qtgui/guiutils.cpp,
+	src/qtgui/main.cpp, src/qtgui/preview_w.cpp,
+	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h,
+	src/query/docseqhist.cpp, src/query/docseqhist.h,
+	src/query/dynconf.cpp, src/query/dynconf.h, src/query/history.cpp,
+	src/query/history.h:
+	revamped history feature to be udi-based while supporting old format
+
+2009-11-23 16:11 +0000  dockes    (8a494a30e71f)
+
+	* src/rcldb/rcldb.cpp:
+	set udi in meta from getDoc(udi)
+
+2009-11-23 16:10 +0000  dockes    (c432dcb83d8f)
+
+	* src/index/beaglequeue.cpp, src/utils/circache.cpp,
+	src/utils/circache.h:
+	Beaglequeue: simplify index from cache now that udi entries are
+	unique in cache
+
+2009-11-22 17:27 +0000  dockes    (112515ddfd1b)
+
+	* src/index/beaglequeue.cpp, src/utils/circache.cpp,
+	src/utils/circache.h:
+	only keep the latest entry for a given udi in the cache
+
+2009-11-22 17:26 +0000  dockes    (c47346e105ac)
+
+	* src/utils/smallut.h:
+	added tempbuf class
+
+2009-11-21 13:36 +0000  dockes    (d497773469db)
+
+	* src/internfile/mimehandler.cpp, src/qtgui/rclmain_w.cpp:
+	allow setting attrs on mimeview defs, factorize some code with
+	mhExecFactory
+
+2009-11-21 13:35 +0000  dockes    (77639dc8a584)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h:
+	added valueSplitAttributes() method
+
+2009-11-21 11:18 +0000  dockes    (50c2c8c764bb)
+
+	* src/internfile/mimehandler.cpp:
+	use a confsimple to parse the additional filter attributes
+
+2009-11-21 11:14 +0000  dockes    (ba1b73290998)
+
+	* src/qtgui/guiutils.h:
+	add ipath to default paragraph format
+
+2009-11-18 15:32 +0000  dockes    (132c512aacde)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt:
+	added beaglequeue/circache to kio build because of internfile
+	dependancy
+
+2009-11-18 14:27 +0000  dockes    (d1587dd98290)
+
+	* src/utils/circache.cpp:
+	warning
+
+2009-11-18 14:26 +0000  dockes    (812296ef15d8)
+
+	* src/rcldb/rclquery.cpp:
+	query::getrescnt() would only work once following 1.13 mods (affects
+	python api)
+
+2009-11-18 14:25 +0000  dockes    (cc1924f2d969)
+
+	* src/python/samples/recollq.py:
+	
+
+2009-11-18 14:03 +0000  dockes    (e60f229404a4)
+
+	* src/python/recoll/pyrecoll.cpp:
+	add some casts to avoid kwargs const warnings
+
+2009-11-18 13:46 +0000  dockes    (0e29576743b0)
+
+	* src/index/rclmonrcv.cpp:
+	typo
+
+2009-11-18 12:33 +0000  dockes    (da553b8d1e93)
+
+	* src/filters/rclchm, src/filters/rclexecm.py, src/filters/rclics,
+	src/internfile/mh_execm.cpp, src/internfile/mh_execm.h:
+	handle REFILTERROR in execm
+
+2009-11-18 10:26 +0000  dockes    (f28392bec173)
+
+	* src/internfile/mh_mail.cpp, src/rcldb/rcldb.cpp:
+	mh_mail: use truncate_to_word to avoid cutting an utf8 char. rcldb:
+	logdeb text_to_word errors
+
+2009-11-18 08:24 +0000  dockes    (c9b8704e7ffa)
+
+	* src/index/beaglequeue.cpp, src/mk/FreeBSD:
+	beaglequeue fully functional, small fixes remaining?
+
+2009-11-18 07:57 +0000  dockes    (0f863324690f)
+
+	* src/index/beaglequeue.cpp:
+	ok with compression
+
+2009-11-18 07:46 +0000  dockes    (7925e58ac0d9)
+
+	* src/utils/circache.cpp, src/utils/circache.h:
+	compression works
+
+2009-11-17 14:52 +0000  dockes    (122d9a523dc7)
+
+	* src/utils/circache.cpp, src/utils/circache.h:
+	circache ok
+
+2009-11-16 16:18 +0000  dockes    (88021fc84abd)
+
+	* src/internfile/internfile.cpp:
+	Lack of error checking after have_document() in preview case could
+	lead to looping, and cancellation was not checked to make things
+	worse
+
+2009-11-16 16:16 +0000  dockes    (22e0540453bc)
+
+	* src/configure:
+	--without-gui
+
+2009-11-16 16:12 +0000  dockes    (d3e16fb089de)
+
+	* src/qt4gui/recoll.pro.in:
+	stupid mistake in previous cosmetic change
+
+2009-11-16 16:11 +0000  dockes    (a422d8f6d6fd)
+
+	* src/index/fsindexer.cpp:
+	make very sure ~/.beagle is in the skippedPaths
+
+2009-11-16 16:10 +0000  dockes    (effac8983ab5)
+
+	* src/internfile/mh_mail.cpp:
+	reason msg
+
+2009-11-16 12:50 +0000  dockes    (bfc0df6ab067)
+
+	* src/Makefile.in, src/common/autoconfig.h.in, src/configure.ac,
+	src/index/Makefile, src/mk/localdefs.in, src/utils/x11mon.cpp:
+	add --without-gui configure option
+
+2009-11-15 16:41 +0000  dockes    (81edb2c4cef7)
+
+	* src/index/beaglequeue.cpp, src/index/fsindexer.cpp,
+	src/utils/circache.cpp:
+	catch cancel exceptions cast by internfile()
+
+2009-11-15 14:39 +0000  dockes    (4539869b5761)
+
+	* src/index/fsindexer.h, src/qtgui/rclmain_w.cpp,
+	src/query/reslistpager.cpp, src/rcldb/rcldoc.cpp,
+	src/rcldb/rcldoc.h, src/sampleconf/fields:
+	changed apptag field name to rclaptg
+
+2009-11-15 14:18 +0000  dockes    (b41678f5ad12)
+
+	* src/qt4gui/recoll.pro.in, src/qtgui/recoll.pro.in:
+	add -ldl -lX11 for binutils-gold
+
+2009-11-15 08:38 +0000  dockes    (3801ee9a51c6)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/index/fsindexer.cpp, src/index/rclmonrcv.cpp,
+	src/utils/fstreewalk.cpp, src/utils/fstreewalk.h,
+	src/utils/smallut.cpp, src/utils/smallut.h:
+	rationalized how we recompute things on setkeydir. recoll_noindex
+	and skippedNames can now be changed at any point in the tree
+
+2009-11-14 11:34 +0000  dockes    (a922eac98d16)
+
+	* src/index/rclmonprc.cpp:
+	monitor: accumulate mods during 30S before indexing
+
+2009-11-14 10:29 +0000  dockes    (ea134de640e0)
+
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
+	src/index/fsindexer.cpp, src/index/indexer.cpp,
+	src/index/rclmonrcv.cpp, src/index/recollindex.cpp,
+	src/utils/circache.cpp:
+	monitor the beagle queue
+
+2009-11-14 10:25 +0000  dockes    (42421f027b94)
+
+	* src/filters/rclchm, src/filters/rclics, src/filters/rcltext:
+	emit helpernotfound
+
+2009-11-14 08:21 +0000  dockes    (93baac7e87ac)
+
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
+	src/index/fsindexer.cpp, src/index/fsindexer.h,
+	src/index/indexer.cpp, src/index/indexer.h,
+	src/index/recollindex.cpp, src/index/recollindex.h,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	beaglequeue indexFiles
+
+2009-11-13 13:29 +0000  dockes    (7d0c4d7a917c)
+
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
+	src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/confgui/confguiindex.cpp, src/qtgui/preview_w.cpp,
+	src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp,
+	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
+	src/sampleconf/fields:
+	1st beagle version with index/preview working
+
+2009-11-13 09:08 +0000  dockes    (71f8c28cbeba)
+
+	* src/qtgui/idxthread.cpp:
+	integrate beaglequeueindexer for indexing. Work remains for
+	indexfiles() at least
+
+2009-11-13 09:08 +0000  dockes    (dda5121a7c45)
+
+	* src/utils/circache.cpp, src/utils/circache.h:
+	integrate beaglequeueindexer for indexing. Work remains for
+	indexfiles() at least
+
+2009-11-13 09:07 +0000  dockes    (364d46e16faf)
+
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
+	src/index/fsindexer.cpp, src/index/fsindexer.h,
+	src/index/indexer.cpp, src/index/indexer.h,
+	src/index/recollindex.cpp:
+	integrate beaglequeueindexer for indexing. Work remains for
+	indexfiles() at least
+
+2009-11-13 09:04 +0000  dockes    (7e32466740a7)
+
+	* src/configure.ac:
+	Israel G. Lugo: give priority to the user's PATH when looking for
+	qmake (fixes detecting the wrong qmake when more than one exists).
+
+2009-11-13 09:01 +0000  dockes    (3503bfba6b70)
+
+	* src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h:
+	make dump const
+
+2009-11-13 09:01 +0000  dockes    (b4c8330037e7)
+
+	* src/lib/Makefile, src/lib/mkMake:
+	add beaglequeue, fsindexer
+
+2009-11-13 08:58 +0000  dockes    (63ee628229e7)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h:
+	add panel for beaglequeue parameters + arrange so that a checkbox
+	can enable/disable other params
+
+2009-11-13 08:54 +0000  dockes    (5edf24b7552e)
+
+	* src/sampleconf/fields:
+	comments
+
+2009-11-13 08:15 +0000  dockes    (a829fce15458)
+
+	* src/filters/rclchm, src/filters/rclexecm.py, src/filters/rclics,
+	src/filters/rclimg, src/filters/rclzip, src/internfile/mh_execm.cpp:
+	dont use 0-sized doc to mean eof now
+
+2009-11-11 18:09 +0000  dockes    (21b6ba1309c7)
+
+	* src/filters/rclimg:
+	send mimetype
+
+2009-11-11 18:07 +0000  dockes    (7f2a7a7214fb)
+
+	* src/internfile/mh_execm.cpp:
+	set mimetype for the non-ipath case
+
+2009-11-11 07:47 +0000  dockes    (75f9d10cf2f3)
+
+	* src/index/fsindexer.cpp, src/index/fsindexer.h,
+	src/index/indexer.cpp, src/index/indexer.h,
+	src/index/recollindex.cpp:
+	moved common db code from fsindexer to confindexer
+
+2009-11-10 18:11 +0000  dockes    (e079c8ce273f)
+
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h: new file.
+	* src/index/beaglequeue.cpp, src/index/beaglequeue.h:
+	
+
+2009-11-10 18:10 +0000  dockes    (698e70099ec0)
+
+	* src/index/fsindexer.cpp, src/index/fsindexer.h,
+	src/index/recollindex.h: new file.
+	* src/index/fsindexer.cpp, src/index/fsindexer.h,
+	src/index/indexer.cpp, src/index/indexer.h, src/index/rclmonprc.cpp,
+	src/index/recollindex.cpp, src/index/recollindex.h:
+	dbindexer->fsindexer, split into its own file
+
+2009-11-10 17:42 +0000  dockes    (ccf674432104)
+
+	* src/ChangeLog:
+	
+
+2009-11-10 17:42 +0000  dockes    (065c40b8964d)
+
+	* src/index/recollindex.cpp:
+	small cleanups and add option to call beaglequeue
+
+2009-11-10 17:41 +0000  dockes    (d4ff290d1615)
+
+	* src/index/indexer.cpp:
+	small cleanups and comments
+
+2009-11-10 17:39 +0000  dockes    (00c5f0c09ef9)
+
+	* src/index/indexer.h:
+	comments
+
+2009-11-10 17:38 +0000  dockes    (02b632bcbeca)
+
+	* src/index/rclmonrcv.cpp:
+	remove indexer.h include
+
+2009-11-10 17:38 +0000  dockes    (ba2255ec8b62)
+
+	* src/common/rclinit.h:
+	comment
+
+2009-11-10 17:37 +0000  dockes    (915bf923b8da)
+
+	* src/utils/fstreewalk.cpp, src/utils/fstreewalk.h:
+	add nocanon option
+
+2009-11-10 17:34 +0000  dockes    (29b753cd1f78)
+
+	* src/utils/circache.cpp, src/utils/circache.h:
+	intermediary checkpoint (things work, no index, no compression)
+
+2009-11-10 17:32 +0000  dockes    (16e0d5965055)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	removed the useless keep_updated flag
+
+2009-11-10 17:31 +0000  dockes    (75878eb08588)
+
+	* src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h:
+	added dump function
+
+2009-11-10 17:30 +0000  dockes    (35b43d00db47)
+
+	* src/query/recollq.cpp:
+	added explicit flag parameter to Internfile constructeur for helping
+	with beagle queue integration
+
+2009-11-10 17:29 +0000  dockes    (75255bb8d7a0)
+
+	* src/sampleconf/fields:
+	add dc:description as keywords alias
+
+2009-11-10 09:39 +0000  dockes    (ee6104876da9)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/kde/kioslave/recoll/htmlif.cpp, src/qtgui/preview_w.cpp:
+	added explicit flag parameter to Internfile constructeur for helping
+	with beagle queue integration
+
+2009-11-09 09:26 +0000  dockes    (7c3c0eed036b)
+
+	* src/utils/circache.cpp, src/utils/circache.h: new file.
+	* src/lib/Makefile, src/lib/mkMake, src/utils/Makefile,
+	src/utils/circache.cpp, src/utils/circache.h:
+	circache
+
+2009-11-09 09:26 +0000  dockes    (877bb76973aa)
+
+	* src/utils/conftree.cpp, src/utils/conftree.h:
+	add some constness
+
+2009-11-06 11:33 +0000  dockes    (944e0b9d1d53)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
+	src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h,
+	src/query/docseqhist.cpp, src/query/docseqhist.h,
+	src/utils/fileudi.h, src/utils/pathut.cpp, src/utils/pathut.h:
+	allow opening parent/enclosing doc with native editor in reslist
+
+2009-11-06 11:26 +0000  dockes    (1d9a5530d7bf)
+
+	* src/sampleconf/mimeview:
+	added okular as chm viewer
+
+2009-11-04 13:52 +0000  dockes    (226d88ccb6c1)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp:
+	store file names using local8bit qstring conversions
+
+2009-11-04 13:43 +0000  dockes    (b57bd81d3e8e)
+
+	* src/utils/fstreewalk.h:
+	comment
+
+2009-11-04 13:42 +0000  dockes    (2037ae120bcf)
+
+	* src/utils/cancelcheck.h:
+	comment
+
+2009-10-31 09:00 +0000  dockes    (3ad7f6c85ce2)
+
+	* src/internfile/mh_mail.cpp, src/internfile/mh_mail.h:
+	extract msgid + generate abstract at start of txt, excluding headers
+
+2009-10-31 08:59 +0000  dockes    (9e7ae93bd35b)
+
+	* src/utils/mimeparse.cpp:
+	change rfc2047 mail header decoding (=?iso-xx stuff) so that a start
+	of encoding section can be recognized even not after white space
+
+2009-10-30 19:05 +0000  dockes    (eb9ed35f9fe0)
+
+	* src/qtgui/rclmain_w.cpp:
+	allow substituting all doc fields in viewer command line
+
+2009-10-30 19:04 +0000  dockes    (d8065c96ceae)
+
+	* src/qtgui/viewaction.ui:
+	clarify using desktop defs in action choice dialog
+
+2009-10-30 10:16 +0000  dockes    (4a744302db21)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/qtgui/rclmain_w.cpp, src/query/reslistpager.cpp,
+	src/sampleconf/fields:
+	Allow setting fields in fs subtree. Use for an application tag used
+	for starting a specialized viewer
+
+2009-10-30 08:59 +0000  dockes    (bdd54ae7a182)
+
+	* src/VERSION, src/common/rclconfig.h, src/index/indexer.cpp,
+	src/index/indexer.h, src/internfile/mimehandler.cpp,
+	src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/utils/conftree.cpp,
+	src/utils/conftree.h:
+	Allow fields local to a subtree to be set in the configuration
+
+2009-10-30 08:53 +0000  dockes    (aa8c442a67ec)
+
+	* src/configure.ac:
+	use /bin/sh to execute recollinstall instead of making it executable
+
+2009-10-30 08:53 +0000  dockes    (0faf1f6ccf5f)
+
+	* src/Makefile.in, src/configure:
+	use /bin/sh to execute recollinstall instead of making it executable
+
+2009-10-29 18:11 +0000  dockes    (2338d18226f2)
+
+	* src/qtgui/uiprefs.ui:
+	move the use-desktop-preference checkbox close to the choose editors
+	button
+
+2009-10-29 18:10 +0000  dockes    (4b6f29c1e3c3)
+
+	* src/sampleconf/mimeconf:
+	
+
+2009-10-29 18:09 +0000  dockes    (2de2f1804086)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h:
+	support wildcard filtering in getConfNames() + implement config
+	checking function in test driver
+
+2009-10-29 18:08 +0000  dockes    (78c287d1d2da)
+
+	* src/utils/conftree.cpp, src/utils/conftree.h:
+	bugfix: if last line ended with backslash, entry was ignored. new
+	function: filter by wildcard expr in getNames()
+
+2009-10-29 13:44 +0000  dockes    (26ae4011727a)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimemap:
+	chm+comments
+
+2009-10-29 13:34 +0000  dockes    (178273f496f2)
+
+	* src/sampleconf/recoll.conf.in:
+	comment
+
+2009-10-28 13:08 +0000  dockes    (9435a56f1962)
+
+	* src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	fix signal/slot type mismatch for setSortParams
+
+2009-10-26 13:19 +0000  dockes    (2a369661c70c)
+
+	* src/qtgui/uiprefs_w.cpp:
+	disable app-choosing button when use-desktop-prefs is activated
+
+2009-10-26 11:16 +0000  dockes    (8cdb908a253d)
+
+	* src/qtgui/rclmain_w.cpp:
+	qt4 sometimes doesnt display the status bar if its not created in
+	init
+
+2009-10-26 10:00 +0000  dockes    (758f39788d0c)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
+	arrange to send pageup/down and shift-home to the reslist
+
+2009-10-24 15:02 +0000  dockes    (7d98b5c330c1)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp,
+	src/rcldb/rclquery_p.h:
+	unified retrying for databaseModified errors
+
+2009-10-24 11:00 +0000  dockes    (9d49d2991eed)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldb_p.h,
+	src/rcldb/rclquery.cpp:
+	renamed fields for clarity
+
+2009-10-24 06:37 +0000  dockes    (1486d8f630fc)
+
+	* src/filters/rclchm, src/filters/rclics, src/filters/rclzip:
+	cleanup
+
+2009-10-24 06:17 +0000  dockes    (6a8a9821c17c)
+
+	* src/filters/rclexecm.py, src/filters/rclzip:
+	use python zipfile
+
+2009-10-23 16:45 +0000  dockes    (436e03b2f0c1)
+
+	* src/filters/rclchm:
+	comments
+
+2009-10-23 16:03 +0000  dockes    (be653b19dd28)
+
+	* src/filters/rclchm: new file.
+	* src/filters/rclchm:
+	first working
+
+2009-10-23 16:03 +0000  dockes    (99a819213c2a)
+
+	* src/filters/rclzip:
+	comment
+
+2009-10-22 17:28 +0000  dockes    (e5f16d6d23db)
+
+	* src/doc/user/usermanual.sgml:
+	%(fldname) specs
+
+2009-10-22 17:27 +0000  dockes    (3e37f6aac6c5)
+
+	* src/doc/user/docbook.css:
+	new freebsd version
+
+2009-10-22 17:27 +0000  dockes    (1535c07dd8a6)
+
+	* src/sampleconf/mimeconf:
+	ics
+
+2009-10-22 17:16 +0000  dockes    (deaef902d7e3)
+
+	* src/sampleconf/mimeconf:
+	add ics + more programming languages
+
+2009-10-22 17:16 +0000  dockes    (98009bab1e61)
+
+	* src/sampleconf/mimemap:
+	add ics + more programming languages
+
+2009-10-22 17:13 +0000  dockes    (bf9a0c5eeb5c)
+
+	* src/filters/rclics: new file.
+	* src/filters/rclexecm.py, src/filters/rclics:
+	initial support for icalendar splitting
+
+2009-10-22 12:24 +0000  dockes    (f97b91cb8153)
+
+	* src/filters/rclexecm.py: new file.
+	* src/filters/rclexecm.py, src/filters/rclzip:
+	made rclexecm a class in a separate module
+
+2009-10-22 11:58 +0000  dockes    (9361ab690eec)
+
+	* src/filters/rclzip:
+	fully extracted common code
+
+2009-10-21 21:00 +0000  dockes    (39b12da95a76)
+
+	* src/filters/rclzip: new file.
+	* src/filters/rclzip:
+	initial
+
+2009-10-21 20:59 +0000  dockes    (ef17d33ea782)
+
+	* website/download.html:
+	1.12.2
+
+2009-10-21 12:02 +0000  dockes    (2baccf2235b6)
+
+	* src/qtgui/rclmain_w.cpp, src/query/docseqdb.cpp,
+	src/query/docseqdb.h, src/query/reslistpager.cpp,
+	src/query/reslistpager.h, src/utils/Makefile, src/utils/smallut.cpp,
+	src/utils/smallut.h:
+	fix queryBuildAbstract option functionality. Allow substituting
+	%(fieldname) in reslist paragraph format
+
+2009-10-21 12:00 +0000  dockes    (30a02a6bada8)
+
+	* src/internfile/mimehandler.h:
+	warning
+
+2009-10-21 11:58 +0000  dockes    (ebc82bec7704)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt, src/utils/closefrom.cpp:
+	linux
+
+2009-10-21 11:32 +0000  dockes    (1cc979921a0d)
+
+	* src/internfile/mh_text.cpp, src/utils/closefrom.cpp:
+	gcc43+linux compile
+
+2009-10-21 07:48 +0000  dockes    (72168c28c9bb)
+
+	* src/makestaticdist.sh:
+	cleanup .svn directories
+
+2009-10-21 07:24 +0000  dockes    (a550073d34d4)
+
+	* src/makestaticdist.sh:
+	get makestaticdist to work with qt4
+
+2009-10-21 07:15 +0000  dockes    (e44497010880)
+
+	* packaging/debian/changelog, packaging/debian/control,
+	packaging/debian/menu, packaging/debian/rules,
+	packaging/rpm/recollmdk.spec, tests/lyx/lyx.txt:
+	1.12.2 release fixes
+
+2009-10-21 07:15 +0000  dockes    (cecbbb5e3c23)
+
+	* website/pics/mario.png, website/pics/smile.png: new file.
+	* website/mario.png, website/smile.png: deleted file.
+	* website/BUGS.html, website/CHANGES.html, website/devel.html,
+	website/download.html, website/features.html, website/index.html.en,
+	website/index.html.fr, website/mario.png, website/pics/index.html,
+	website/pics/mario.png, website/pics/recoll5-thumb.png,
+	website/pics/recoll5.png, website/pics/smile.png, website/smile.png:
+	1.12.2 release
+
+2009-10-19 16:20 +0000  dockes    (b2a9b0c5fc47)
+
+	* src/lib/Makefile, src/lib/mkMake:
+	add closefrom
+
+2009-10-19 16:19 +0000  dockes    (5b3c0f9438a9)
+
+	* src/README, src/doc/man/recoll.conf.5, src/doc/man/recollindex.1,
+	src/doc/user/usermanual.sgml, src/filters/rclsvg:
+	explict(e)ly errors again
+
+2009-10-19 10:51 +0000  dockes    (70ed5ded2a5e)
+
+	* src/qtgui/uiprefs.ui:
+	move the use-desktop-preference checkbox close to the choose editors
+	button
+
+2009-10-19 07:30 +0000  dockes    (d25d7050d60c)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp:
+	catch xapian exceptions in 2 more places.
+
+2009-10-18 07:57 +0000  dockes    (cbcf397757a1)
+
+	* src/qtgui/reslist.cpp:
+	reslist: rightclick popup would not work inside table
+
+2009-10-17 06:38 +0000  dockes    (cb08cd6b282b)
+
+	* src/Makefile.in, src/index/recollindex.cpp, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	rclversion.h must not include xapian.h. Replace with
+	Rcl::version_string()
+
+2009-10-15 15:50 +0000  dockes    (6d01b54d3cf5)
+
+	* src/qtgui/preview_w.cpp:
+	compile with qt3
+
+2009-10-15 12:32 +0000  dockes    (749d93d72709)
+
+	* src/index/rclmonprc.cpp:
+	only call x11IsAlive from the main thread
+
+2009-10-15 12:32 +0000  dockes    (7339dd810b4c)
+
+	* src/utils/Makefile, src/utils/conftree.cpp, src/utils/execmd.cpp:
+	small linux include and makefile adjustments
+
+2009-10-14 12:25 +0000  dockes    (4bfcb9f6483a)
+
+	* src/utils/execmd.cpp, src/utils/execmd.h:
+	m_cancelRequest->m_killRequest to avoid confusion with cancelcheck +
+	close descriptors before exec
+
+2009-10-14 12:24 +0000  dockes    (834b841865f0)
+
+	* src/internfile/mh_exec.cpp:
+	no timeout if filtermaxseconds is -1
+
+2009-10-14 12:23 +0000  dockes    (894b94a986c2)
+
+	* src/qtgui/confgui/confguiindex.cpp, src/sampleconf/recoll.conf.in:
+	add filtermaxseconds to config
+
+2009-10-14 12:22 +0000  dockes    (eec367c78b29)
+
+	* src/utils/closefrom.cpp, src/utils/closefrom.h: new file.
+	* src/utils/closefrom.cpp, src/utils/closefrom.h:
+	
+
+2009-10-14 06:21 +0000  dockes    (48782c4d99bd)
+
+	* src/filters/rclimg, src/index/recollindex.cpp,
+	src/internfile/mh_execm.cpp, src/internfile/mh_execm.h,
+	src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/utils/execmd.cpp:
+	execm first working zip version
+
+2009-10-13 17:32 +0000  dockes    (ac8388c11bcb)
+
+	* src/utils/idfile.cpp, src/utils/idfile.h:
+	allow working on memory string
+
+2009-10-13 16:37 +0000  dockes    (25cd49e5f3b2)
+
+	* src/internfile/mh_exec.cpp:
+	comments
+
+2009-10-13 12:22 +0000  dockes    (f8f821415451)
+
+	* src/internfile/mh_exec.cpp:
+	handle interrupt requests and set timeout on execs
+
+2009-10-13 12:21 +0000  dockes    (0ec65928f00f)
+
+	* src/utils/execmd.cpp:
+	use process group to control/kill execd processes
+
+2009-10-13 12:20 +0000  dockes    (ad3f88e0578e)
+
+	* src/sampleconf/recoll.conf.in:
+	added loop.ps to skippedFiles
+
+2009-10-12 16:27 +0000  dockes    (2d5321b8e32c)
+
+	* src/common/rclinit.cpp:
+	also block USR1 USR2
+
+2009-10-09 13:58 +0000  dockes    (9ef52b9903d4)
+
+	* src/internfile/mh_execm.cpp, src/internfile/mh_execm.h: new file.
+	* src/filters/rclimg, src/internfile/mh_exec.cpp,
+	src/internfile/mh_exec.h, src/internfile/mh_execm.cpp,
+	src/internfile/mh_execm.h, src/internfile/mimehandler.cpp,
+	src/lib/Makefile, src/lib/mkMake, src/sampleconf/mimeconf:
+	execm persistent filters
+
+2009-10-09 13:57 +0000  dockes    (94243b4ecca6)
+
+	* src/common/textsplit.cpp:
+	process camelCase
+
+2009-10-09 13:34 +0000  dockes    (9129980cfe0e)
+
+	* src/utils/execmd.cpp, src/utils/execmd.h, src/utils/netcon.cpp,
+	src/utils/netcon.h:
+	Execmd: added count parameter to receive(), and new getline()
+	function Netcon: fix receive() to properly handle the case where
+	there is initially data in the line buffer
+
+2009-10-04 13:25 +0000  dockes    (f81cdfd36952)
+
+	* src/utils/readfile.cpp:
+	
+
+2009-10-04 13:24 +0000  dockes    (fe1c983b582e)
+
+	* src/mk/commondefs:
+	remove -I/usr/local/include from commondefs!
+
+2009-09-30 15:53 +0000  dockes    (401a53878320)
+
+	* src/internfile/mh_text.cpp:
+	dont set ipath for the first page in text files to avoid dual
+	records for files under the page size
+
+2009-09-30 15:45 +0000  dockes    (1ce015f48d3a)
+
+	* src/internfile/mh_text.cpp, src/internfile/mh_text.h,
+	src/qtgui/confgui/confguiindex.cpp, src/sampleconf/recoll.conf.in,
+	src/utils/readfile.cpp, src/utils/readfile.h:
+	implemented paged text files
+
+2009-09-29 15:58 +0000  dockes    (b288f2d22754)
+
+	* src/internfile/mh_text.cpp, src/qtgui/confgui/confguiindex.cpp,
+	src/sampleconf/recoll.conf.in:
+	textfilemaxmbs
+
+2009-09-29 15:58 +0000  dockes    (a41ae31020fa)
+
+	* src/utils/execmd.cpp:
+	loglevels
+
+2009-09-29 14:49 +0000  dockes    (89ab6fcd4bef)
+
+	* src/utils/netcon.cpp, src/utils/netcon.h: new file.
+	* src/utils/netcon.cpp, src/utils/netcon.h:
+	
+
+2009-09-29 14:49 +0000  dockes    (254aad5cdd17)
+
+	* src/utils/netcon.cpp, src/utils/netcon.h: deleted file.
+	* src/utils/netcon.cpp, src/utils/netcon.h:
+	
+
+2009-09-29 08:47 +0000  dockes    (302c0dd0dfa0)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	got rid of the preview tabdata array
+
+2009-09-29 07:48 +0000  dockes    (f65d40e808c6)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	make print a slot in the editor, not the preview
+
+2009-09-28 18:19 +0000  dockes    (5c03bd6d7d00)
+
+	* src/doc/user/usermanual.sgml, src/qtgui/preview_w.cpp,
+	src/qtgui/preview_w.h:
+	Preview printing
+
+2009-09-28 17:53 +0000  dockes    (564c8022205f)
+
+	* src/utils/execmd.cpp:
+	adjust log levels
+
+2009-09-26 09:30 +0000  dockes    (231f842cfa1a)
+
+	* src/utils/netcon.cpp, src/utils/netcon.h: new file.
+	* src/lib/Makefile, src/lib/mkMake, src/utils/execmd.cpp,
+	src/utils/execmd.h, src/utils/netcon.cpp, src/utils/netcon.h:
+	execmd uses netcon
+
+2009-09-26 09:05 +0000  dockes    (3883518b318e)
+
+	* src/rcldb/rclquery.cpp:
+	dont abort on get_mset exception
+
+2009-08-13 06:34 +0000  dockes    (71e1aa73c37e)
+
+	* src/utils/refcntr.h:
+	add release() method
+
+2009-08-13 06:32 +0000  dockes    (75501a297534)
+
+	* src/index/indexer.cpp, src/internfile/internfile.cpp,
+	src/internfile/internfile.h, src/internfile/mimehandler.cpp,
+	src/internfile/mimehandler.h:
+	xattrs: make them work with non-text files. Use ctime for up to date
+	checks
+
+2009-08-13 06:29 +0000  dockes    (45721e5ace5a)
+
+	* src/common/autoconfig.h.in:
+	allow choosing the "file" command from configure
+
+2009-08-13 06:28 +0000  dockes    (817bbeb36f34)
+
+	* src/qtgui/rclmain_w.cpp:
+	Make sure db is open at all times (caused problems when sorting
+	query started from the command line)
+
+2009-08-13 06:27 +0000  dockes    (05b809bbb7d0)
+
+	* src/qtgui/preview_w.cpp:
+	
+
+2009-08-13 06:26 +0000  dockes    (b5b49b39dc8a)
+
+	* src/configure, src/configure.ac, src/index/mimetype.cpp:
+	allow choosing the "file" command from configure
+
+2009-08-13 06:24 +0000  dockes    (902b5dc99b09)
+
+	* src/ChangeLog:
+	
+
+2009-08-13 06:23 +0000  dockes    (3ee15899a458)
+
+	* src/sampleconf/recoll.conf.in:
+	add indexedmimetypes to sample file
+
+2009-07-02 13:26 +0000  dockes    (a0f0be9546bb)
+
+	* src/filters/rclman:
+	
+
+2009-07-02 10:26 +0000  dockes    (82d09aa4b256)
+
+	* src/index/indexer.cpp, src/qtgui/rclmain_w.cpp:
+	improve periodic indexing status reporting and timer processing
+
+2009-07-02 06:17 +0000  dockes    (b8cdf0ab08a9)
+
+	* src/qtgui/main.cpp, src/rcldb/searchdata.h, src/utils/mimeparse.cpp,
+	src/utils/mimeparse.h:
+	explicitely->explicitly
+
+2009-06-26 09:25 +0000  dockes    (98153ad73366)
+
+	* src/filters/rclman, src/sampleconf/mimemap:
+	improve man page handling
+
+2009-06-22 16:41 +0000  dockes    (5003fe921249)
+
+	* src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
+	moved periodic timer control from main.cpp to rclmain_w.cpp
+
+2009-06-22 15:25 +0000  dockes    (a420554375c5)
+
+	* src/qtgui/idxthread.cpp, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp:
+	use proper locking/sleeping object for idx thread sync
+
+2009-06-22 08:58 +0000  dockes    (d4fdc68fab47)
+
+	* src/filters/rclman:
+	use groff html output!
+
+2009-06-22 08:57 +0000  dockes    (01a166e9f9e7)
+
+	* src/index/indexer.cpp:
+	debug trace
+
+2009-06-01 06:32 +0000  dockes    (272067257953)
+
+	* src/qtgui/main.cpp:
+	fixed bug in handling remaining arguments as question pieces
+
+2009-05-29 06:28 +0000  dockes    (091488ca1543)
+
+	* src/bincimapmime/convert.h, src/utils/base64.cpp:
+	change strchr() return parameter to const for new libc
+
+2009-05-25 08:59 +0000  dockes    (6231c20d3e23)
+
+	* src/filters/rcllyx:
+	bug report from d.prost: spaces and accents in lyx file names
+
+2009-05-04 08:06 +0000  dockes    (20f1f5746b3e)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/preview_w.h,
+	src/qtgui/spell_w.cpp:
+	gcc44
+
+2009-04-27 11:49 +0000  dockes    (ba8db4a9fcf6)
+
+	* packaging/rpm/recollfedora10.spec: new file.
+	* packaging/rpm/recollfedora10.spec:
+	
+
+2009-04-27 11:42 +0000  dockes    (85e5723e268a)
+
+	* tests/cjk/cjk.txt: new file.
+	* tests/cjk/cjk.txt:
+	
+
+2009-04-27 09:40 +0000  dockes    (a7cf61bb3e6a)
+
+	* website/BUGS.html, website/download.html, website/index.html.en,
+	website/index.html.fr:
+	1.12 release changes
+
+2009-04-27 09:15 +0000  dockes    (eb2d1da3c9ee)
+
+	* website/BUGS.html:
+	
+
+2009-04-27 08:05 +0000  dockes    (c26df870665c)
+
+	* src/utils/md5.cpp, src/utils/readfile.cpp:
+	gcc 4.4 includes fixes
+
+2009-04-27 08:03 +0000  dockes    (5e892d5aa963)
+
+	* src/python/recoll/setup.py:
+	pathhash->fileudi
+
+2009-02-24 18:30 +0000  dockes    (d897d4f128ce)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp:
+	implement option to display the catg filter as a toolbar combobox
+
+2009-02-23 07:57 +0000  dockes    (5eb3b91eca18)
+
+	* src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
+	new ru/uk translations from Michael
+
+2009-02-06 16:49 +0000  dockes    (0946c032bea8)
+
+	* src/utils/refcntr.h:
+	make RefCntr(x*) explicit
+
+2009-02-06 16:48 +0000  dockes    (1f50a0e7a3ac)
+
+	* src/internfile/mimehandler.cpp:
+	comments
+
+2009-02-05 14:35 +0000  dockes    (1eb8b93ed85b)
+
+	* src/utils/execmd.cpp, src/utils/execmd.h:
+	1st execcmd cleanup
+
+2009-01-30 13:27 +0000  dockes    (55d06dfa9b04)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts, src/qtgui/reslist.cpp:
+	small pbs with reslist translations
+
+2009-01-30 11:43 +0000  dockes    (af28dae4f689)
+
+	* src/INSTALL, src/README:
+	
+
+2009-01-30 11:43 +0000  dockes    (581a47458445 [RECOLL_1_12_0])
+
+	* website/BUGS.html, website/CHANGES.html:
+	1.12.0?
+
+2009-01-30 11:42 +0000  dockes    (fd6cc84e76ce)
+
+	* src/doc/user/usermanual.sgml:
+	1.12 manual
+
+2009-01-30 10:22 +0000  dockes    (f683b3907dd1)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts:
+	updated message files, translated french
+
+2009-01-29 14:24 +0000  dockes    (f09b8b421535)
+
+	* src/filters/rcltext:
+	simplified rcltext. No need for awk and no assumptions on charset
+
+2009-01-29 11:27 +0000  dockes    (c8b882dea260)
+
+	* src/ChangeLog, website/CHANGES.html, website/doc.html:
+	
+
+2009-01-29 11:04 +0000  dockes    (0bf58162416f)
+
+	* src/VERSION:
+	1.12.0 une
+
+2009-01-29 10:47 +0000  dockes    (40e8e1f2f59b)
+
+	* packaging/debian/changelog, packaging/rpm/recoll.spec,
+	packaging/rpm/recollCooker.spec, packaging/rpm/recollfedora.spec,
+	packaging/rpm/recollmdk.spec:
+	
+
+2009-01-29 10:08 +0000  dockes    (2af56852a361)
+
+	* src/qtgui/main.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h:
+	have ssearch install the lang help section when needed
+
+2009-01-28 17:41 +0000  dockes    (8654c9b9d56d)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp:
+	erase history would crash with empty reslist docsource
+
+2009-01-28 17:21 +0000  dockes    (8b56ccfdd91b)
+
+	* src/qtgui/rclmain_w.cpp:
+	fixed status bar messages (were cleared by periodic100 every 100ms)
+
+2009-01-28 17:05 +0000  dockes    (b435cf90abb0)
+
+	* src/qtgui/rclhelp.cpp, src/qtgui/rclhelp.h: new file.
+	* src/qtgui/rclhelp.cpp, src/qtgui/rclhelp.h:
+	F1 context-enhanced help
+
+2009-01-28 16:56 +0000  dockes    (e5410627d9d5)
+
+	* src/qt4gui/recoll.pro.in:
+	F1 context-enhanced help
+
+2009-01-28 16:56 +0000  dockes    (741df5618110)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h,
+	src/qtgui/main.cpp, src/qtgui/preview_w.cpp,
+	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/recoll.h,
+	src/qtgui/recoll.pro.in, src/qtgui/reslist.cpp,
+	src/qtgui/sort_w.cpp, src/qtgui/spell_w.cpp:
+	F1 context-enhanced help
+
+2009-01-28 14:58 +0000  dockes    (7e804d156dc5)
+
+	* src/qtgui/rclmain_w.cpp:
+	dont encode urls used for starting help browser
+
+2009-01-28 14:22 +0000  dockes    (e696212a674c)
+
+	* src/Makefile.in:
+	add xapian version to version string
+
+2009-01-28 08:45 +0000  dockes    (46251043fd88)
+
+	* src/qtgui/advsearch.ui, src/qtgui/sort.ui, src/qtgui/spell.ui,
+	src/qtgui/uiprefs.ui:
+	avoid setting 0 sizes
+
+2009-01-28 08:40 +0000  dockes    (1c551a065bdd)
+
+	* src/configure, src/configure.ac:
+	allow setting QMAKE in the environment
+
+2009-01-27 18:12 +0000  dockes    (fb41a05985ed)
+
+	* src/utils/pxattr.cpp:
+	
+
+2009-01-27 11:19 +0000  dockes    (3f5897bb4b8d)
+
+	* tests/stemming/stemming.sh, tests/stemming/stemming.txt: new file.
+	* tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
+	tests/andor/andor.sh, tests/andor/andor.txt,
+	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
+	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
+	tests/boolean/boolean.sh, tests/boolean/boolean.txt,
+	tests/cjk/cjk.sh, tests/delete/delete.sh, tests/delete/delete.txt,
+	tests/dirwithblanks/dirwithblanks.sh,
+	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
+	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
+	tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
+	tests/html/html.txt, tests/images/images.sh,
+	tests/images/images.txt, tests/koi8r/koi8r.sh,
+	tests/koi8r/koi8r.txt, tests/lyx/lyx.sh, tests/lyx/lyx.txt,
+	tests/mail/mail.sh, tests/mail/mail.txt, tests/media/media.sh,
+	tests/media/media.txt, tests/msword/msword.sh,
+	tests/msword/msword.txt, tests/notypes/notypes.sh,
+	tests/notypes/notypes.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
+	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
+	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
+	tests/ppt/ppt.txt, tests/rfc2231/rfc2231.sh,
+	tests/rfc2231/rfc2231.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
+	tests/runtests.sh, tests/scribus/scribus.sh,
+	tests/scribus/scribus.txt, tests/skipped/skipped.sh,
+	tests/skipped/skipped.txt, tests/special/special.sh,
+	tests/special/special.txt, tests/stemming/stemming.sh,
+	tests/stemming/stemming.txt, tests/txt/txt.sh, tests/txt/txt.txt,
+	tests/utf8/utf8.sh, tests/utf8/utf8.txt, tests/xls/xls.sh,
+	tests/xls/xls.txt:
+	remove recoll query text from compared test outputs
+
+2009-01-27 10:25 +0000  dockes    (57dd90e8b55d)
+
+	* src/common/textsplit.cpp, src/common/textsplit.h:
+	Emit a_b intermediary span when splitting a_b.c
+
+2009-01-26 18:30 +0000  dockes    (e2238061ec9d)
+
+	* src/query/plaintorich.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
+	src/rcldb/searchdata.cpp:
+	modified the time at which we unaccent so that we can do the
+	Capitalized->nostemming test on single words (this had been broken
+	by the change of noac/split order done earlier to get japanese to
+	work)
+
+2009-01-26 18:26 +0000  dockes    (8529cb7d58c7)
+
+	* tests/cjk/cjk.sh:
+	
+
+2009-01-26 17:52 +0000  dockes    (8a5b4971a703)
+
+	* tests/cjk/cjk.sh: new file.
+	* tests/cjk/cjk.sh:
+	
+
+2009-01-26 17:34 +0000  dockes    (e65566ba6690)
+
+	* website/BUGS.html, website/CHANGES.html, website/features.html,
+	website/index.html.en, website/index.html.fr,
+	website/pics/index.html, website/pics/recoll-
+	HTML_search_results.html, website/pics/recoll0.html,
+	website/pics/recoll0.txt, website/pics/recoll1.html,
+	website/pics/recoll2.html, website/pics/recoll3.html,
+	website/pics/recoll4.html, website/pics/recoll5.html,
+	website/pics/recoll_chinese.html:
+	website
+
+2009-01-26 13:29 +0000  dockes    (61198659243f)
+
+	* src/utils/smallut.cpp, src/utils/smallut.h:
+	add overloaded neutchars with different parameters
+
+2009-01-26 13:27 +0000  dockes    (61567bc09eab)
+
+	* src/utils/transcode.cpp:
+	tested and decided against cacheing iconv_open
+
+2009-01-23 15:56 +0000  dockes    (1998b1608eb0)
+
+	* src/ChangeLog, src/qtgui/advsearch_w.cpp, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h:
+	temp ckpt: need to test on real unix
+
+2009-01-23 11:07 +0000  dockes    (3631372e04f1)
+
+	* src/qtgui/uiprefs.ui:
+	avoid name duplication
+
+2009-01-23 11:03 +0000  dockes    (0dba2718e1aa)
+
+	* src/qtgui/uiprefs.ui:
+	one button for choosing native editors
+
+2009-01-23 10:38 +0000  dockes    (167a153bcf3c)
+
+	* src/kde/kioslave/recoll/data/searchable.html:
+	simplified javascrip: no ie here!
+
+2009-01-23 09:41 +0000  dockes    (b71166d61782)
+
+	* src/qtgui/rclmain_w.cpp:
+	toLocal8Bit->local8bit
+
+2009-01-23 09:30 +0000  dockes    (c3565b4a7244)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h:
+	use normal text/html ext app for viewing help
+
+2009-01-23 09:27 +0000  dockes    (c025fa3fe99d)
+
+	* src/utils/execmd.cpp, src/utils/execmd.h:
+	accept additional path argument to execmd::which
+
+2009-01-22 14:25 +0000  dockes    (967d5e013a33)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	allow toggle show text/fields in preview
+
+2009-01-21 16:42 +0000  dockes    (f950b7d75e66)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
+	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	added saveToFile menu entry to reslist
+
+2009-01-21 13:55 +0000  dockes    (033fe406a666)
+
+	* src/utils/pxattr.cpp, src/utils/pxattr.h: new file.
+	* src/common/autoconfig.h.in, src/common/rclconfig.cpp,
+	src/common/rclconfig.h, src/configure, src/configure.ac,
+	src/internfile/internfile.cpp, src/internfile/mh_exec.h,
+	src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp,
+	src/internfile/mh_mbox.cpp, src/internfile/mh_text.cpp,
+	src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp,
+	src/internfile/mimehandler.h, src/lib/Makefile, src/lib/mkMake,
+	src/sampleconf/fields, src/utils/pxattr.cpp, src/utils/pxattr.h:
+	added optional extended file attributes support
+
+2009-01-21 11:11 +0000  dockes    (f269f00857ec)
+
+	* src/sampleconf/mimeconf:
+	comments
+
+2009-01-21 11:11 +0000  dockes    (fda5a0a6fccb)
+
+	* src/filters/rcldoc:
+	try to use wvWare if present and antiword fails
+
+2009-01-21 10:49 +0000  dockes    (394e160f7032)
+
+	* src/utils/readfile.cpp:
+	initialize the error buffer for gnu strerror_r
+
+2009-01-21 10:24 +0000  dockes    (7580c4ed79ce)
+
+	* src/utils/readfile.cpp:
+	fix errno printing
+
+2009-01-21 10:17 +0000  dockes    (f1dca213efee)
+
+	* src/rcldb/rcldb.cpp:
+	fixed typo that would prevent stopfile use
+
+2009-01-17 14:57 +0000  dockes    (90f03bbd715c)
+
+	* src/doc/man/recoll.conf.5, src/doc/user/usermanual.sgml:
+	added compressedfilemaxkbs
+
+2009-01-17 14:56 +0000  dockes    (78d1dd932d5b)
+
+	* src/internfile/internfile.cpp, src/qtgui/confgui/confguiindex.cpp,
+	src/sampleconf/recoll.conf.in:
+	added compressedfilemaxkbs
+
+2009-01-16 17:40 +0000  dockes    (fcc2539b18b4)
+
+	* src/kde/kioslave/recoll/data/searchable.html:
+	
+
+2009-01-16 16:42 +0000  dockes    (11cc037db8a9)
+
+	* src/kde/kioslave/recoll/00README.txt:
+	
+
+2009-01-16 11:32 +0000  dockes    (baaf38fdbca9)
+
+	* src/kde/kioslave/recoll/00README.txt,
+	src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/notes.txt:
+	fixed docs + removed dead code
+
+2009-01-15 17:07 +0000  dockes    (144b35bd64c0)
+
+	* src/filters/rcluncomp, src/internfile/internfile.cpp:
+	fixed handling of decompression errors, which was wrong but not
+	catastrophly so in most cases
+
+2009-01-15 17:05 +0000  dockes    (4b10b961d158)
+
+	* src/qtgui/reslist.cpp:
+	disable printing to tmp file
+
+2009-01-15 14:37 +0000  dockes    (9392e278bb0a)
+
+	* src/query/docseq.h, src/query/filtseq.cpp, src/query/filtseq.h,
+	src/query/sortseq.cpp, src/query/sortseq.h:
+	refactor operations delegated to subsequence by sortseq and filtspec
+	into superclass
+
+2009-01-15 09:47 +0000  dockes    (f02a34f835b4)
+
+	* src/rcldb/rcldb.cpp:
+	removed unused variable
+
+2009-01-15 09:45 +0000  dockes    (2440f3259cd0)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/reslist.cpp,
+	src/qtgui/uiprefs_w.cpp:
+	ensure reslist parformat is refreshed after edit (1.11 bug)
+
+2009-01-14 07:52 +0000  dockes    (b3c89a56c9a1)
+
+	* src/qtgui/advsearch.ui, src/qtgui/rclmain_w.cpp,
+	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h,
+	src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp,
+	src/qtgui/viewaction_w.h:
+	arrange so that the select action dialog is preselected on the right
+	mime type after missing action
+
+2009-01-13 16:03 +0000  dockes    (2d8517785a8e)
+
+	* src/common/textsplit.cpp:
+	add _ to wordsep/spanglue chars. Add non-ascii test to isCJK for
+	optimization
+
+2009-01-13 16:02 +0000  dockes    (cbfb1f939c9d)
+
+	* src/common/uproplist.h:
+	small fix : remove diaeresis from seps + comments
+
+2009-01-13 08:56 +0000  dockes    (ee8989c89330)
+
+	* src/doc/user/usermanual.sgml:
+	
+
+2009-01-13 08:49 +0000  dockes    (93e74953ed0b)
+
+	* src/doc/user/usermanual.sgml:
+	update version
+
+2009-01-13 08:02 +0000  dockes    (051bf6d49898)
+
+	* src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rclquery.h:
+	minor visibility cleanup
+
+2009-01-13 08:01 +0000  dockes    (c550fb351f5f)
+
+	* src/qtgui/ssearchb.ui:
+	fix obsolete tooltip message
+
+2009-01-12 18:31 +0000  dockes    (3cefac6eb52d)
+
+	* src/doc/user/usermanual.sgml:
+	doc: better adv search explanation + duplicates collapsing
+
+2009-01-12 17:50 +0000  dockes    (f8cb21911962)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
+	simplified dialog structure, apparently allowed to get rid of size
+	hacks
+
+2009-01-12 16:42 +0000  dockes    (48ca278dcd42)
+
+	* src/qtgui/advsearch.ui:
+	suppressed unused vbox
+
+2009-01-12 15:55 +0000  dockes    (b5486bd5b85d)
+
+	* src/qtgui/advsearch.ui, src/qtgui/searchclause_w.cpp,
+	src/qtgui/searchclause_w.h:
+	suppressed unused layout in searchClause
+
+2009-01-09 14:56 +0000  dockes    (073523a33ffe)
+
+	* src/internfile/mh_exec.cpp, src/internfile/mh_html.cpp,
+	src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp,
+	src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
+	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
+	src/rcldb/rclquery.h:
+	compute md5 checksums for all docs and optionally collapse
+	duplicates in results
+
+2009-01-09 12:23 +0000  dockes    (f89119e58f79)
+
+	* src/qtgui/reslist.cpp:
+	add space/backspace as pager keys for reslist
+
+2009-01-09 12:23 +0000  dockes    (36eb326513d5)
+
+	* src/utils/Makefile, src/utils/md5.cpp, src/utils/md5.h,
+	src/utils/readfile.cpp, src/utils/readfile.h:
+	implement md5 convenience file and string wrappers. Modify readfile
+	to support this
+
+2009-01-09 07:27 +0000  dockes    (de3507d26de4)
+
+	* src/rcldb/pathhash.cpp, src/rcldb/pathhash.h: deleted file.
+	* src/lib/Makefile, src/lib/mkMake, src/rcldb/pathhash.cpp,
+	src/rcldb/pathhash.h, src/rcldb/rcldb.cpp:
+	got rid of pathhash in rcldb, not used since 11.0
+
+2009-01-08 09:55 +0000  dockes    (1fc0cdb06859)
+
+	* src/excludefile:
+	adapt to svn
+
+2009-01-08 09:50 +0000  dockes    (867f1a9f6b02)
+
+	* src/makesrcdist.sh:
+	adapt distrib script to svn
+
+2009-01-08 09:40 +0000  dockes    (33a7fbc42386 [RECOLL_1_12_1exp5])
+
+	* src/VERSION:
+	
+
+2009-01-06 18:48 +0000  dockes    (2e111dad7cba)
+
+	* src/doc/user/bldloop: new file.
+	* packaging/FreeBSD/recoll/Makefile,
+	packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg-
+	plist, src/doc/user/bldloop, tests/koi8r/koi8r.sh, tests/shared.sh:
+	*** empty log message ***
+
+2009-01-06 18:40 +0000  dockes    (c82fbe0ee8fc)
+
+	* packaging/debian/changelog, packaging/rpm/recoll.spec,
+	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
+	src/ChangeLog, website/devel.html, website/download.html:
+	*** empty log message ***
+
+2009-01-06 18:40 +0000  dockes    (7ebc18a8b4d7)
+
+	* unac/builder.in, unac/unac.c, unac/unac.h:
+	new unac approach for japanese: dont decompose at all
+
+2009-01-06 17:40 +0000  dockes    (a0b7ed1f2bda)
+
+	* website/xapUpg100.html: new file.
+	* website/BUGS.html, website/BUGS.txt, website/CHANGES.html,
+	website/doc.html, website/download.html, website/index.html.en,
+	website/index.html.fr, website/xapUpg100.html:
+	*** empty log message ***
+
+2009-01-06 17:30 +0000  dockes    (636e0f9f2a77)
+
+	* website/howtos/index.html,
+	website/howtos/prevent_indexing_a_directory/index.html,
+	website/howtos/use_multiple_indexes/index.html,
+	website/pics/piclist.txt, website/pics/recoll-HTML_search_results-
+	thumb.png, website/pics/recoll-HTML_search_results.html,
+	website/pics/recoll-HTML_search_results.png, website/pics/recoll-
+	HTML_search_results.txt, website/pics/recoll0-thumb.png,
+	website/pics/recoll0.html, website/pics/recoll0.png,
+	website/pics/recoll0.txt, website/pics/recoll1-thumb.png,
+	website/pics/recoll1.html, website/pics/recoll1.png,
+	website/pics/recoll1.txt, website/pics/recoll2-thumb.png,
+	website/pics/recoll2.html, website/pics/recoll2.png,
+	website/pics/recoll2.txt, website/pics/recoll3-thumb.png,
+	website/pics/recoll3.html, website/pics/recoll3.png,
+	website/pics/recoll3.txt, website/pics/recoll4-thumb.png,
+	website/pics/recoll4.html, website/pics/recoll4.png,
+	website/pics/recoll4.txt, website/pics/recoll5-thumb.png,
+	website/pics/recoll5.html, website/pics/recoll5.png,
+	website/pics/recoll5.txt, website/pics/recoll_chinese-thumb.png,
+	website/pics/recoll_chinese.html, website/pics/recoll_chinese.png,
+	website/pics/recoll_chinese.txt: new file.
+	* website/howtos/index.html,
+	website/howtos/prevent_indexing_a_directory/index.html,
+	website/howtos/use_multiple_indexes/index.html,
+	website/pics/piclist.txt, website/pics/recoll-HTML_search_results-
+	thumb.png, website/pics/recoll-HTML_search_results.html,
+	website/pics/recoll-HTML_search_results.png, website/pics/recoll-
+	HTML_search_results.txt, website/pics/recoll0-thumb.png,
+	website/pics/recoll0.html, website/pics/recoll0.png,
+	website/pics/recoll0.txt, website/pics/recoll1-thumb.png,
+	website/pics/recoll1.html, website/pics/recoll1.png,
+	website/pics/recoll1.txt, website/pics/recoll2-thumb.png,
+	website/pics/recoll2.html, website/pics/recoll2.png,
+	website/pics/recoll2.txt, website/pics/recoll3-thumb.png,
+	website/pics/recoll3.html, website/pics/recoll3.png,
+	website/pics/recoll3.txt, website/pics/recoll4-thumb.png,
+	website/pics/recoll4.html, website/pics/recoll4.png,
+	website/pics/recoll4.txt, website/pics/recoll5-thumb.png,
+	website/pics/recoll5.html, website/pics/recoll5.png,
+	website/pics/recoll5.txt, website/pics/recoll_chinese-thumb.png,
+	website/pics/recoll_chinese.html, website/pics/recoll_chinese.png,
+	website/pics/recoll_chinese.txt:
+	*** empty log message ***
+
+2008-12-21 13:17 +0000  dockes    (74da01dd27c2)
+
+	* src/unac/unac.c, src/unac/unac.h:
+	new unac approach for japanese: dont decompose at all
+
+2008-12-21 13:05 +0000  dockes    (273dad0916bb)
+
+	* unac/unac_version.h: new file.
+	* unac/unac_version.h:
+	*** empty log message ***
+
+2008-12-19 09:55 +0000  dockes    (1a2dd90e07b4)
+
+	* src/rcldb/rcldb.h, src/rcldb/rclquery.cpp, src/rcldb/searchdata.cpp:
+	getMainConfig not actually needed and possibly harmful
+
+2008-12-19 09:44 +0000  dockes    (3a16629b24f5)
+
+	* src/rcldb/searchdata.cpp, src/unac/unac.c, src/unac/unac.h:
+	dont unaccent japanese + fix bug in unac/split ordering in
+	searchdata
+
+2008-12-19 08:39 +0000  dockes    (b895714a6500)
+
+	* src/python/recoll/setup.py:
+	pyrecoll: port to linux, update
+
+2008-12-18 14:11 +0000  dockes    (33bffc499e78)
+
+	* src/query/xadump.cpp:
+	diag: prevent char combination by inserting spaces
+
+2008-12-18 11:58 +0000  dockes    (a3863a0c1f62)
+
+	* unac/builder.in, unac/unac.c:
+	no going out of the basic plane!
+
+2008-12-18 11:12 +0000  dockes    (ac1315d2a94f)
+
+	* unac/unac.c:
+	added recoll memory allocation checks
+
+2008-12-18 11:05 +0000  dockes    (cfb4210ce7d5)
+
+	* unac/CaseFolding-5.1.0.txt, unac/UnicodeData-5.1.0.txt: new file.
+	* unac/CaseFolding-5.1.0.txt, unac/UnicodeData-5.1.0.txt:
+	*** empty log message ***
+
+2008-12-18 11:04 +0000  dockes    (cc609462a402)
+
+	* unac/builder.in, unac/configure, unac/configure.ac, unac/unac.c,
+	unac/unac.h:
+	use unicode 5.1.0 + dont unaccent katakana/hiragana. Main change in
+	unicode is that letters ae and o with stroke dont decompose anymore
+	into a+e and o+e we may actually want to restore this if it proves a
+	problem
+
+2008-12-17 16:20 +0000  dockes    (65fd4fda84d3)
+
+	* src/rcldb/rcldb.cpp:
+	fix to previous abstract fix
+
+2008-12-17 15:12 +0000  dockes    (9e9e84a23da6)
+
+	* src/qtgui/reslist.cpp:
+	use local hiliter
+
+2008-12-17 14:26 +0000  dockes    (ada853f1e3b8)
+
+	* src/common/Makefile, src/rcldb/rcldb.cpp:
+	fix abstract generation when the match term is a multiword span
+	(esp. for japanese)
+
+2008-12-17 14:26 +0000  dockes    (9705bf172f13)
+
+	* src/rcldb/searchdata.cpp:
+	comment
+
+2008-12-17 08:01 +0000  dockes    (42bc5b3b5abf)
+
+	* src/index/indexer.cpp, src/index/indexer.h,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/python/recoll/pyrecoll.cpp, src/qtgui/main.cpp,
+	src/query/recollq.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	simplified db open by getting rid of the illusion that we could have
+	several writeable dbs per config
+
+2008-12-16 17:43 +0000  dockes    (1d040e634db3 [RECOLL_1_12_1exp4])
+
+	* src/README, src/VERSION,
+	src/kde/kioslave/recoll/data/searchable.html,
+	src/kde/kioslave/recoll/data/welcome.html:
+	*** empty log message ***
+
+2008-12-16 17:30 +0000  dockes    (18f65ef55dd6)
+
+	* src/kde/kioslave/recoll/data/searchable.html:
+	*** empty log message ***
+
+2008-12-16 17:28 +0000  dockes    (e991bdd3d8c7)
+
+	* src/kde/kioslave/recoll/data/searchable.html: new file.
+	* src/kde/kioslave/recoll/data/searchable.html,
+	src/kde/kioslave/recoll/data/welcome.html,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h:
+	updated kioslave for small changes in reslistpager after main i/f
+	integration. + javascript to search page
+
+2008-12-16 14:20 +0000  dockes    (7bc14752b5f3)
+
+	* src/qtgui/preview_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
+	src/query/plaintorich.h, src/query/reslistpager.cpp,
+	src/query/reslistpager.h, src/utils/debuglog.cpp,
+	src/utils/debuglog.h:
+	converted qt reslist to reslistpager
+
+2008-12-16 08:54 +0000  dockes    (c702627139c8)
+
+	* src/query/wasastringtoquery.cpp:
+	OR chain longer than 2 would swallow preceding AND terms
+
+2008-12-15 15:04 +0000  dockes    (62e1b7eaa7b9)
+
+	* src/kde/kioslave/recoll/htmlif.cpp, src/query/reslistpager.cpp:
+	kio: use right ipath for preview
+
+2008-12-15 14:39 +0000  dockes    (30b71a18e961)
+
+	* src/query/xadump.cpp, src/rcldb/searchdata.cpp:
+	make gcc happy
+
+2008-12-15 13:51 +0000  dockes    (f93dda12024f)
+
+	* website/howtos/template.html:
+	*** empty log message ***
+
+2008-12-15 11:20 +0000  dockes    (4a74871e9823)
+
+	* website/howtos/buildindex.sh, website/howtos/fragend.html,
+	website/howtos/fraghead.html, website/howtos/newdir.sh,
+	website/howtos/template.html: new file.
+	* website/BUGS.html, website/BUGS.txt, website/CHANGES.html,
+	website/copydocs, website/download.html,
+	website/howtos/buildindex.sh, website/howtos/fragend.html,
+	website/howtos/fraghead.html, website/howtos/newdir.sh,
+	website/howtos/template.html, website/index.html.en,
+	website/index.html.fr, website/pics/index.html:
+	*** empty log message ***
+
+2008-12-15 09:33 +0000  dockes    (afc0ef4911b2)
+
+	* src/doc/user/usermanual.sgml:
+	more search tips
+
+2008-12-15 09:24 +0000  dockes    (59cd1bdd4d3f)
+
+	* src/rcldb/searchdata.cpp:
+	reorganize code + add boost to phrase element to match boost of
+	original user terms
+
+2008-12-12 11:53 +0000  dockes    (4121cbc09d70)
+
+	* src/common/textsplit.cpp, src/common/textsplit.h,
+	src/rcldb/rcldb.cpp:
+	dont insert space in cjk abstracts
+
+2008-12-12 11:02 +0000  dockes    (37fd1c31af49)
+
+	* src/rcldb/rcldb.cpp:
+	message level
+
+2008-12-12 11:01 +0000  dockes    (d2a8c016d05c)
+
+	* src/qtgui/reslist.cpp:
+	add %i for displaying ipath
+
+2008-12-12 11:00 +0000  dockes    (151d6a590152)
+
+	* src/qtgui/main.cpp:
+	add all extra cmd line args to the question
+
+2008-12-08 17:43 +0000  dockes    (90b62656b326)
+
+	* src/kde/kioslave/recoll/htmlif.cpp:
+	set name as preview title
+
+2008-12-08 17:42 +0000  dockes    (5717c313d23a)
+
+	* src/kde/kioslave/recoll/dirif.cpp:
+	removed a few traces
+
+2008-12-08 14:34 +0000  dockes    (de392f657f81)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt:
+	previews
+
+2008-12-08 11:22 +0000  dockes    (877b674c328c)
+
+	* src/utils/Makefile, src/utils/readfile.cpp:
+	file_to_string: stat+reserve makes faster
+
+2008-12-05 13:15 +0000  dockes    (19ef9198e3d5)
+
+	* src/VERSION:
+	branched maintenance for 1.11 kio devs on main now 1.12
+
+2008-12-05 11:09 +0000  dockes    (b27d4070bbf8)
+
+	* src/common/textsplit.cpp, src/common/textsplit.h,
+	src/common/uproplist.h, src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/qtgui/ssearch_w.cpp, src/query/recollq.cpp,
+	src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp:
+	take care of splitting user string with respect to unicode white
+	space, not only ascii
+
+2008-12-05 07:38 +0000  dockes    (d102970d3aee)
+
+	* src/utils/smallut.h:
+	comment
+
+2008-12-04 12:41 +0000  dockes    (a3f25963b2da [RECOLL_1_11_1exp3])
+
+	* src/kde/kioslave/recoll/recollf.protocol: new file.
+	* src/kde/kioslave/recoll/recollf.protocol:
+	*** empty log message ***
+
+2008-12-04 12:23 +0000  dockes    (adffbb42e449)
+
+	* src/kde/kioslave/recoll/dirif.cpp:
+	kde 4.0 compile
+
+2008-12-04 11:50 +0000  dockes    (fef6cc6c4c97)
+
+	* src/VERSION:
+	*** empty log message ***
+
+2008-12-04 11:49 +0000  dockes    (d1b1a426ddfa)
+
+	* src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt, src/query/reslistpager.cpp,
+	src/query/reslistpager.h, src/rcldb/rcldb.cpp, src/utils/pathut.h:
+	kio_recoll: html/dir switching
+
+2008-12-03 17:04 +0000  dockes    (a762165399a2)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt:
+	cleaned up virtual tree and url handling. Drag to desktop now works
+	with appropriate name. recollf protocol
+
+2008-12-03 10:02 +0000  dockes    (127dbb400363)
+
+	* src/kde/kioslave/recoll/dirif.cpp:
+	better stat
+
+2008-12-02 13:41 +0000  dockes    (6e55b23fb64f)
+
+	* src/kde/kioslave/recoll/dirif.cpp:
+	*** empty log message ***
+
+2008-12-02 13:38 +0000  dockes    (66b031be3559)
+
+	* src/kde/kioslave/recoll/dirif.cpp:
+	*** empty log message ***
+
+2008-12-02 13:16 +0000  dockes    (619e41b1537b)
+
+	* src/INSTALL, src/README, src/VERSION, src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-12-02 13:14 +0000  dockes    (fff18d4ea953)
+
+	* src/kde/kioslave/recoll/00README.txt,
+	src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/data/welcome.html,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/notes.txt, src/query/reslistpager.cpp:
+	kio goes to testing
+
+2008-12-01 18:42 +0000  dockes    (714fdf15621e)
+
+	* src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h:
+	small cleanups and comments. Still some weirdness
+
+2008-12-01 15:37 +0000  dockes    (8d9ea1f1c645)
+
+	* src/kde/kioslave/recoll/cleancmakestuff.sh:
+	*** empty log message ***
+
+2008-12-01 15:36 +0000  dockes    (8504e2e278dd)
+
+	* src/kde/kioslave/recoll/data/help.html: new file.
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/cleancmakestuff.sh,
+	src/kde/kioslave/recoll/data/help.html,
+	src/kde/kioslave/recoll/data/welcome.html,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt:
+	seems to work by re-rerunning search whenever it changes. Still had
+	one crash, needs cleanup
+
+2008-11-28 09:14 +0000  dockes    (ee6a7d32843e)
+
+	* src/kde/kioslave/recoll/recollnolist.protocol: new file.
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt,
+	src/kde/kioslave/recoll/recoll.protocol,
+	src/kde/kioslave/recoll/recollnolist.protocol:
+	ensured compatibility with kde4.0
+
+2008-11-27 17:48 +0000  dockes    (d461029ef29c)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt,
+	src/kde/kioslave/recoll/recoll.protocol:
+	bits of dual mode working
+
+2008-11-27 14:05 +0000  dockes    (8cc177e8775a)
+
+	* src/query/reslistpager.cpp:
+	safety check
+
+2008-11-27 13:35 +0000  dockes    (4d28c4942bc1)
+
+	* src/sampleconf/mimeconf:
+	*** empty log message ***
+
+2008-11-27 09:49 +0000  dockes    (394d882caa0c)
+
+	* src/sampleconf/mimeconf:
+	remove obsolete [prefixes] section
+
+2008-11-27 09:39 +0000  dockes    (0ec8260d8d7c)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-11-26 15:03 +0000  dockes    (b6a62dc24003)
+
+	* src/kde/kioslave/recoll/cleancmakestuff.sh,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/notes.txt: new file.
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/cleancmakestuff.sh,
+	src/kde/kioslave/recoll/dirif.cpp,
+	src/kde/kioslave/recoll/htmlif.cpp,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h,
+	src/kde/kioslave/recoll/notes.txt,
+	src/kde/kioslave/recoll/recoll.protocol:
+	listdir doesnt work on kde 4.0 because on parent/child assumptions
+	in kdirmodel have to check on kde 4.1
+
+2008-11-24 17:42 +0000  dockes    (9333f13ac4c7)
+
+	* src/VERSION:
+	*** empty log message ***
+
+2008-11-24 17:38 +0000  dockes    (a761936ec65e)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt:
+	check for dlopen
+
+2008-11-24 16:42 +0000  dockes    (0f7e0292212f)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt:
+	have to cc the pic objects, cant use librcl
+
+2008-11-24 15:47 +0000  dockes    (d06dd2891012)
+
+	* src/Makefile.in, src/aspell/Makefile, src/common/Makefile,
+	src/common/autoconfig.h.in, src/common/rclconfig.h, src/configure,
+	src/configure.ac, src/index/Makefile, src/internfile/Makefile,
+	src/lib/Makefile, src/lib/mkMake, src/mk/Darwin, src/mk/FreeBSD,
+	src/mk/OpenBSD, src/mk/SunOS, src/mk/commondefs,
+	src/qt4gui/recoll.pro.in, src/qtgui/recoll.pro.in,
+	src/query/Makefile, src/unac/unac.c, src/utils/pathut.cpp:
+	make it easier to maintain the kio cmake by moving as much stuff as
+	possible to autoconfig.h, merging libmime and librcl etc.
+
+2008-11-24 15:23 +0000  dockes    (7d9add059cc1)
+
+	* src/qtgui/confgui/main.cpp, src/qtgui/guiutils.cpp,
+	src/qtgui/main.cpp, src/qtgui/recoll.h:
+	replace local variable recoll_datadir with access to config
+
+2008-11-24 14:54 +0000  dockes    (7005bf515a0b)
+
+	* src/unac/unac_version.h: new file.
+	* src/unac/unac.c, src/unac/unac_version.h:
+	*** empty log message ***
+
+2008-11-21 16:43 +0000  dockes    (5c4559fa9d49)
+
+	* src/makesrcdist.sh:
+	*** empty log message ***
+
+2008-11-21 16:37 +0000  dockes    (e92347cad84d)
+
+	* src/kde/kioslave/recoll/00README.txt, src/makesrcdist.sh:
+	ccmake cleanup in kio_recoll
+
+2008-11-21 16:02 +0000  dockes    (f691d6ad3333)
+
+	* src/excludefile:
+	*** empty log message ***
+
+2008-11-20 18:00 +0000  dockes    (5063f4280d8d)
+
+	* src/kde/kioslave/recoll/Makefile: deleted file.
+	* src/kde/kioslave/recoll/Makefile:
+	*** empty log message ***
+
+2008-11-20 15:10 +0000  dockes    (dc45badd0c45)
+
+	* src/VERSION:
+	*** empty log message ***
+
+2008-11-20 14:16 +0000  dockes    (c653773059df)
+
+	* src/kde/kioslave/recoll/00README.txt:
+	*** empty log message ***
+
+2008-11-20 13:10 +0000  dockes    (8b5eea7103b5)
+
+	* src/kde/kioslave/recoll/data/welcome.html: new file.
+	* src/kde/kioslave/recoll/00README.txt,
+	src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/data/welcome.html,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h, src/query/reslistpager.cpp,
+	src/query/reslistpager.h:
+	kioslave sort of works
+
+2008-11-19 12:28 +0000  dockes    (93e6b483f5c4)
+
+	* src/kde/kioslave/recoll/kio_recoll.cpp:
+	*** empty log message ***
+
+2008-11-19 12:19 +0000  dockes    (9b0d90b61574)
+
+	* src/query/plaintorich.cpp, src/query/plaintorich.h,
+	src/query/reslistpager.cpp, src/query/reslistpager.h: new file.
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: deleted file.
+	* src/lib/Makefile, src/lib/mkMake, src/qt4gui/recoll.pro.in,
+	src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/recoll.pro.in, src/query/plaintorich.cpp,
+	src/query/plaintorich.h, src/query/reslistpager.cpp,
+	src/query/reslistpager.h:
+	moved plaintorich from qtgui/ to query/
+
+2008-11-19 10:06 +0000  dockes    (350dd565c80d)
+
+	* src/qtgui/reslist.cpp, src/utils/smallut.cpp, src/utils/smallut.h:
+	moved code from qtgui to smallut
+
+2008-11-18 13:51 +0000  dockes    (fae04b17c778)
+
+	* src/utils/cancelcheck.h:
+	comment
+
+2008-11-18 13:25 +0000  dockes    (4d54c32dbee7)
+
+	* src/index/csguess.cpp, src/index/mimetype.cpp,
+	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
+	src/query/wasatorcl.cpp:
+	add a few includes for new gcc version
+
+2008-11-18 13:24 +0000  dockes    (9455c0affe0a)
+
+	* src/utils/cancelcheck.h:
+	comments
+
+2008-11-18 10:23 +0000  dockes    (d09d14bf2e24)
+
+	* src/utils/debuglog.h:
+	*** empty log message ***
+
+2008-11-17 14:51 +0000  dockes    (9d4e9515342e)
+
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/Makefile.kde3: new file.
+	* src/kde/kioslave/recoll/CMakeLists.txt,
+	src/kde/kioslave/recoll/Makefile,
+	src/kde/kioslave/recoll/Makefile.kde3,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h:
+	1st kde test. cmake doesnt work need to use buildit script
+
+2008-11-14 15:49 +0000  dockes    (13ca00d869a1)
+
+	* src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.h:
+	*** empty log message ***
+
+2008-11-13 10:57 +0000  dockes    (5cd3ce5481df)
+
+	* src/kde/kioslave/recoll/00README.txt,
+	src/kde/kioslave/recoll/Makefile,
+	src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/kde/kioslave/recoll/kio_recoll.la, src/query/docseqdb.cpp:
+	got the kio_slave working again
+
+2008-11-08 11:00 +0000  dockes    (81b9fe1d7644)
+
+	* src/qtgui/reslist.cpp:
+	Copy entries in the rght clck menu copy both to selection and
+	clipboard
+
+2008-10-18 07:04 +0000  dockes    (33b4eec42ac8)
+
+	* website/BUGS.html: new file.
+	* website/BUGS.html, website/download.html:
+	*** empty log message ***
+
+2008-10-18 06:51 +0000  dockes    (b885092a2488)
+
+	* website/CHANGES.html: new file.
+	* website/CHANGES.txt: deleted file.
+	* website/BUGS.txt, website/CHANGES.html, website/CHANGES.txt,
+	website/download.html, website/index.html.en, website/index.html.fr:
+	*** empty log message ***
+
+2008-10-15 08:30 +0000  dockes    (6657f5e0f698)
+
+	* src/sampleconf/recoll.conf.in:
+	add .git .hg .bzr to skipped
+
+2008-10-14 07:50 +0000  dockes    (2321044edfb9 [RECOLL_1_11_0])
+
+	* src/rcldb/searchdata.cpp, src/rcldb/searchdata.h,
+	src/utils/refcntr.h:
+	highlighting would not work with cat filt active because ClausSub
+	did not implement getTerms
+
+2008-10-14 06:07 +0000  dockes    (6ecc84bb82aa)
+
+	* src/index/recollindex.cpp:
+	print version in recollindex help
+
+2008-10-13 11:46 +0000  dockes    (1cd1451bbb74)
+
+	* src/excludefile, src/makesrcdist.sh:
+	change in excludefile handling
+
+2008-10-13 11:46 +0000  dockes    (609bbaa80120)
+
+	* src/qtgui/ssearch_w.cpp, src/query/filtseq.cpp:
+	warnings
+
+2008-10-13 11:44 +0000  dockes    (809f8c3eb265)
+
+	* src/qtgui/plaintorich.cpp:
+	compil warn
+
+2008-10-13 08:35 +0000  dockes    (a5d743b90fe8)
+
+	* src/INSTALL, src/README:
+	*** empty log message ***
+
+2008-10-13 08:23 +0000  dockes    (5874f0e6fc82)
+
+	* src/query/recollq.cpp:
+	dont change recollq output, used for tests!
+
+2008-10-13 07:57 +0000  dockes    (bf5637bbe652)
+
+	* src/doc/user/usermanual.sgml, src/qtgui/i18n/recoll_de.ts,
+	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_tr.ts,
+	src/qtgui/i18n/recoll_uk.ts, src/qtgui/i18n/recoll_xx.ts,
+	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp:
+	messages and manual
+
+2008-10-10 08:19 +0000  dockes    (d5a5fb9959b7)
+
+	* src/doc/user/usermanual.sgml:
+	added python api doc
+
+2008-10-10 08:18 +0000  dockes    (4771280faa9c)
+
+	* src/python/recoll/pyrecoll.cpp, src/python/samples/rclmbox.py,
+	src/python/samples/recollqsd.py:
+	fix executesd
+
+2008-10-10 08:05 +0000  dockes    (f613511f9e1a)
+
+	* src/python/recoll/pyrecoll.cpp:
+	add delete purge
+
+2008-10-10 08:04 +0000  dockes    (2547574a0242)
+
+	* src/internfile/internfile.cpp:
+	log levels
+
+2008-10-09 09:36 +0000  dockes    (4fb973a50769)
+
+	* src/python/recoll/pyrecoll.cpp:
+	stemming went from query to searchdata
+
+2008-10-09 09:21 +0000  dockes    (e112c834fca2)
+
+	* src/filters/rclflac, src/filters/rclid3, src/sampleconf/mimeconf:
+	improved mp3/flac filter. use pstotext directly
+
+2008-10-09 09:19 +0000  dockes    (cf2e0559c3d9)
+
+	* src/internfile/mh_exec.cpp, src/internfile/mimehandler.cpp:
+	need to transcode text to utf-8
+
+2008-10-09 09:19 +0000  dockes    (d250c2a0a26f)
+
+	* src/utils/transcode.h:
+	comments
+
+2008-10-09 06:41 +0000  dockes    (721f4b3d08f4)
+
+	* src/filters/rclimg:
+	*** empty log message ***
+
+2008-10-09 06:38 +0000  dockes    (e9d7fde008f9)
+
+	* src/filters/rclimg:
+	*** empty log message ***
+
+2008-10-09 06:31 +0000  dockes    (4b76370655c3)
+
+	* src/filters/rclimg:
+	conform to filter error usual protocol
+
+2008-10-08 16:15 +0000  dockes    (d60a26ce4397)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/filters/rcldvi, src/index/indexer.cpp, src/index/indexer.h,
+	src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h, src/utils/smallut.cpp, src/utils/smallut.h:
+	added menu to display missing helpers
+
+2008-10-08 16:12 +0000  dockes    (30da9114943c)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-10-08 08:27 +0000  dockes    (8a78ee8cc158)
+
+	* src/filters/rclabw, src/filters/rcldjvu, src/filters/rclid3,
+	src/filters/rclkwd, src/filters/rclogg, src/filters/rclopxml,
+	src/filters/rclppt, src/filters/rclsoff, src/filters/rclsvg,
+	src/filters/rclxls, src/sampleconf/fields, src/sampleconf/mimeconf:
+	improved rclid3 and rclogg
+
+2008-10-07 16:19 +0000  dockes    (c922f7984106)
+
+	* src/qtgui/preview_w.cpp:
+	message
+
+2008-10-07 08:07 +0000  dockes    (7e7e59b8a48f)
+
+	* src/doc/user/usermanual.sgml:
+	query language precisions
+
+2008-10-07 06:52 +0000  dockes    (0b46df2d0a1d)
+
+	* src/query/wasatorcl.cpp:
+	*** empty log message ***
+
+2008-10-07 06:44 +0000  dockes    (a6e8f2583e65)
+
+	* src/ChangeLog, src/common/rclconfig.cpp,
+	src/python/recoll/pyrecoll.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/rclquery.cpp, src/sampleconf/fields:
+	let rclconfig take care of field name lowercasing
+
+2008-10-06 06:22 +0000  dockes    (26eae5316b88)
+
+	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h,
+	src/internfile/mimehandler.cpp, src/utils/execmd.cpp:
+	Disable filters with missing helpers for the whole indexing pass
+
+2008-10-04 14:26 +0000  dockes    (556c7fa5998c)
+
+	* src/index/indexer.cpp, src/internfile/Filter.h,
+	src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/internfile/mh_exec.cpp, src/internfile/mh_exec.h,
+	src/internfile/mh_html.h, src/internfile/mh_mail.cpp,
+	src/internfile/mh_mail.h, src/internfile/mh_mbox.cpp,
+	src/internfile/mh_mbox.h, src/internfile/mh_text.h,
+	src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp,
+	src/internfile/mimehandler.h:
+	allow specifying format and charset for ext filters. Cache and reuse
+	filters
+
+2008-10-03 16:02 +0000  dockes    (6f5d875c2923)
+
+	* src/utils/Makefile:
+	*** empty log message ***
+
+2008-10-03 16:02 +0000  dockes    (8d1e930cc9e2)
+
+	* src/qtgui/preview_w.cpp:
+	message
+
+2008-10-03 08:19 +0000  dockes    (cf75be4a88cf)
+
+	* src/common/rclconfig.cpp:
+	*** empty log message ***
+
+2008-10-03 08:09 +0000  dockes    (068bc565bf8b)
+
+	* src/common/rclconfig.cpp, src/qtgui/guiutils.cpp,
+	src/qtgui/guiutils.h, src/qtgui/plaintorich.cpp,
+	src/qtgui/plaintorich.h, src/qtgui/preview_w.cpp,
+	src/qtgui/preview_w.h, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp:
+	add option to preview html instead of plain text
+
+2008-10-03 06:23 +0000  dockes    (bd1a6a560e25)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h:
+	arrange for setting aside an html version when working for preview
+
+2008-10-03 06:17 +0000  dockes    (b10d8b6906a0)
+
+	* src/internfile/mh_html.cpp, src/internfile/mh_html.h:
+	save transcoded html for preview
+
+2008-10-02 13:30 +0000  dockes    (f469cf040425)
+
+	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h:
+	comments
+
+2008-09-30 12:38 +0000  dockes    (6ff81f690928)
+
+	* src/index/recollindex.cpp, src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h:
+	added index format version checking
+
+2008-09-29 11:33 +0000  dockes    (2691a6abf645)
+
+	* src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/python/recoll/pyrecoll.cpp, src/qtgui/rclmain_w.cpp,
+	src/qtgui/reslist.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
+	src/query/docseqdb.h, src/query/filtseq.cpp, src/query/filtseq.h,
+	src/query/recollq.cpp, src/query/sortseq.cpp, src/query/sortseq.h,
+	src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
+	src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
+	move stemlang from RclQuery to SearchData. Allow DocSequences to do
+	the sorting/filtering themselves
+
+2008-09-29 08:59 +0000  dockes    (00bc43d91e91)
+
+	* src/kde/kioslave/recoll/kio_recoll.cpp,
+	src/python/recoll/pyrecoll.cpp, src/qtgui/reslist.cpp,
+	src/query/docseq.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
+	src/query/docseqdb.h, src/query/docseqhist.cpp,
+	src/query/docseqhist.h, src/query/filtseq.cpp, src/query/filtseq.h,
+	src/query/recollq.cpp, src/query/sortseq.cpp, src/query/sortseq.h,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rclquery.cpp,
+	src/rcldb/rclquery.h:
+	doc.pc now only place where relevancy is stored
+
+2008-09-29 07:13 +0000  dockes    (da809a196cc5)
+
+	* src/qtgui/reslist.h:
+	comments
+
+2008-09-29 06:58 +0000  dockes    (dccf6cb38207)
+
+	* src/python/recoll/pyrecoll.cpp, src/query/recollq.cpp,
+	src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
+	src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
+	move sort params from searchdata to rclquery
+
+2008-09-28 14:20 +0000  dockes    (0ce1cca8cac2)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.ui,
+	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
+	src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/qtgui/sort_w.cpp,
+	src/query/filtseq.h, src/query/sortseq.cpp, src/query/sortseq.h,
+	src/sampleconf/mimeconf:
+	1st impl of catg filtering in reslist
+
+2008-09-28 07:40 +0000  dockes    (5e29feefc554)
+
+	* src/query/filtseq.cpp, src/query/filtseq.h: new file.
+	* src/lib/Makefile, src/lib/mkMake, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
+	src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h,
+	src/query/filtseq.cpp, src/query/filtseq.h:
+	rearranged some reslist/rclmain functions + add but not use filtseq
+	code
+
+2008-09-25 09:08 +0000  dockes    (8588b8cc05d1)
+
+	* src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py:
+	*** empty log message ***
+
+2008-09-25 09:07 +0000  dockes    (40e028763fab)
+
+	* src/python/xesam/xesam-recoll-service:
+	arret apres hackfest
+
+2008-09-25 06:17 +0000  dockes    (811009efeb96)
+
+	* src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_tr.ts,
+	src/qtgui/i18n/recoll_uk.ts, src/qtgui/i18n/recoll_xx.ts:
+	*** empty log message ***
+
+2008-09-25 06:14 +0000  dockes    (ce29702ab7cc)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts:
+	*** empty log message ***
+
+2008-09-25 06:02 +0000  dockes    (a065c833e601)
+
+	* src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
+	new russian/ukrainian translations
+
+2008-09-25 06:00 +0000  dockes    (ba80af83d32f)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts, src/qtgui/rclmain_w.cpp,
+	src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui:
+	fixed typos
+
+2008-09-24 06:50 +0000  dockes    (695914bd6d5d)
+
+	* src/kde/recoll_applet/0README.Recoll:
+	*** empty log message ***
+
+2008-09-24 06:44 +0000  dockes    (48bbf0a115cc)
+
+	* src/query/recollq.cpp:
+	command line args must be processed as local 8 bit
+
+2008-09-24 06:34 +0000  dockes    (e90ac2ed62fe)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-09-24 05:35 +0000  dockes    (36e2522b06b2)
+
+	* src/qtgui/main.cpp:
+	command line args must be processed as local 8 bit
+
+2008-09-24 05:31 +0000  dockes    (9b420f1d25f8)
+
+	* src/qtgui/main.cpp:
+	command line args must be processed as local 8 bit
+
+2008-09-23 14:32 +0000  dockes    (cd440e5917d3)
+
+	* src/configure, src/configure.ac:
+	use $QMAKE not qmake when checking version
+
+2008-09-16 10:19 +0000  dockes    (2bc72ad13a9b)
+
+	* src/python/recoll/pyrecoll.cpp:
+	fields, indexing i/f
+
+2008-09-16 10:13 +0000  dockes    (ff10e8072c66)
+
+	* src/qtgui/rclmain_w.cpp:
+	have to setkeydir before calling internfile when opening
+
+2008-09-16 08:18 +0000  dockes    (c78945994f7c)
+
+	* src/python/samples/recollqsd.py: new file.
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/internfile/internfile.cpp, src/python/recoll/pyrecoll.cpp,
+	src/python/recoll/setup.py, src/python/samples/recollqsd.py,
+	src/python/xesam/xesam-recoll-service, src/query/recollq.cpp,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldb_p.h,
+	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
+	src/rcldb/rclquery.h, src/rcldb/searchdata.cpp,
+	src/rcldb/searchdata.h, src/sampleconf/fields:
+	general field name handling cleanup + sort facility in rclquery
+
+2008-09-16 08:13 +0000  dockes    (bd4c0f6fd812)
+
+	* src/internfile/mh_mail.cpp:
+	emit field for recipients
+
+2008-09-15 08:03 +0000  dockes    (11ba5592559e)
+
+	* src/sampleconf/fields, src/sampleconf/mimeconf,
+	src/sampleconf/mimemap, src/sampleconf/mimeview:
+	added rcltext/python/purple
+
+2008-09-15 08:02 +0000  dockes    (8af411ff9bf6)
+
+	* src/filters/rclpurple: new file.
+	* src/filters/rclpurple, src/qtgui/mtpics/README,
+	src/utils/base64.cpp, src/utils/smallut.cpp, src/utils/smallut.h,
+	src/utils/transcode.cpp:
+	*** empty log message ***
+
+2008-09-15 07:55 +0000  dockes    (49401228a5ef)
+
+	* src/filters/rclpython, src/qtgui/mtpics/pidgin.png,
+	src/qtgui/mtpics/text-x-python.png: new file.
+	* src/filters/rclpython, src/qtgui/mtpics/pidgin.png,
+	src/qtgui/mtpics/text-x-python.png:
+	*** empty log message ***
+
+2008-09-13 12:56 +0000  dockes    (299644545ca0)
+
+	* src/python/xesam/xesam-recoll-service: new file.
+	* src/python/xesam/xesam-recoll-service:
+	*** empty log message ***
+
+2008-09-12 11:35 +0000  dockes    (5c85f26d124d)
+
+	* src/sampleconf/mimeconf:
+	index c code with the new rcltext generic filter
+
+2008-09-12 11:30 +0000  dockes    (b8277032f494)
+
+	* src/filters/rcltext: new file.
+	* src/filters/rcltext:
+	*** empty log message ***
+
+2008-09-09 12:58 +0000  dockes    (a3afe9b35b57)
+
+	* src/rcldb/rcldb.cpp:
+	debug messages
+
+2008-09-08 16:49 +0000  dockes    (a18ab0c682a4)
+
+	* src/rcldb/rcldoc.cpp, src/sampleconf/fields: new file.
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/internfile/internfile.cpp, src/lib/Makefile, src/lib/mkMake,
+	src/python/recoll/pyrecoll.cpp, src/python/samples/recollq.py,
+	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp, src/query/docseq.h,
+	src/query/docseqdb.cpp, src/query/recollq.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/recollinstall.in,
+	src/sampleconf/fields:
+	foundation work for configurable stored/indexed fields
+
+2008-09-08 15:47 +0000  dockes    (861e4211280b)
+
+	* src/rcldb/searchdata.h:
+	unused args warning
+
+2008-09-08 15:47 +0000  dockes    (3f6468e20038)
+
+	* src/utils/smallut.cpp:
+	test driver
+
+2008-09-08 15:46 +0000  dockes    (581ee503208b)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2008-09-07 07:22 +0000  dockes    (dfe4dd53d0b9)
+
+	* src/Makefile.in, src/qt4gui/uifrom3:
+	cleanup
+
+2008-09-07 07:08 +0000  dockes    (95c2a94321a3)
+
+	* src/Makefile.in:
+	cleaning
+
+2008-09-07 06:43 +0000  dockes    (6294638c2504)
+
+	* src/Makefile.in, src/VERSION, src/mk/localdefs.in:
+	improved cleaning
+
+2008-09-05 11:45 +0000  dockes    (8532ebb84453)
+
+	* src/rcldb/rclquery.cpp:
+	gcc4.3
+
+2008-09-05 10:36 +0000  dockes    (2ada099a7545)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h:
+	strimline and restructure the doctree-exploring loop to make it
+	close to understandable
+
+2008-09-05 10:34 +0000  dockes    (404aa368d498)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp:
+	add relevancyrating to the metadata when querying
+
+2008-09-05 10:33 +0000  dockes    (bc0210deda18)
+
+	* src/internfile/myhtmlparse.cpp:
+	accept iso date format (2008-09-05T11:55:32)
+
+2008-09-05 10:26 +0000  dockes    (4b17d6defb3c)
+
+	* src/doc/man/recollindex.1:
+	*** empty log message ***
+
+2008-09-01 20:39 +0000  dockes    (39ff03712b54)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimeview:
+	openxml types
+
+2008-09-01 17:31 +0000  dockes    (f0fde685acc8)
+
+	* src/filters/rclopxml:
+	sort of works
+
+2008-09-01 17:21 +0000  dockes    (dfd3281994ff)
+
+	* src/filters/rclopxml: new file.
+	* src/filters/rclopxml:
+	almost almost ok excepts outputs some formatting directives for ppt
+
+2008-08-31 15:28 +0000  dockes    (7756d792699d [RECOLL_1_11_1exp1, RECOLL_1_11_1exp2, RECOLL_1_11_1exp])
+
+	* packaging/debian/changelog, packaging/debian/control,
+	packaging/debian/rules:
+	*** empty log message ***
+
+2008-08-30 12:21 +0000  dockes    (60b122f6f4d6)
+
+	* src/rcldb/rcldb.cpp:
+	typo in xfsn len fix
+
+2008-08-30 07:38 +0000  dockes    (d516181ad7a0)
+
+	* src/rcldb/rcldb.cpp:
+	truncate simple file names at max term length
+
+2008-08-30 07:34 +0000  dockes    (59326d99e18d)
+
+	* src/utils/smallut.cpp:
+	utf8truncate
+
+2008-08-30 07:31 +0000  dockes    (8f5c5fba53d1)
+
+	* src/utils/smallut.cpp, src/utils/smallut.h:
+	utf8truncate
+
+2008-08-29 14:12 +0000  dockes    (41c405565cd4)
+
+	* tests/boolean/boolean.sh:
+	or->OR
+
+2008-08-29 13:05 +0000  dockes    (6454f838026e)
+
+	* src/internfile/mh_mbox.cpp:
+	accept weird date format in From lines used by (old?) tbird
+
+2008-08-29 09:51 +0000  dockes    (b830b6d6b04d)
+
+	* src/index/recollindex.cpp:
+	be more informative when monitoring not configured
+
+2008-08-28 15:44 +0000  dockes    (27a9bf47f895)
+
+	* src/python/recoll/pyrecoll.cpp, src/python/samples/rcldlkp.py,
+	src/python/samples/rclmbox.py, src/rcldb/rcldb.cpp,
+	src/sampleconf/mimeview:
+	*** empty log message ***
+
+2008-08-28 15:43 +0000  dockes    (d28eac37bdd9)
+
+	* src/query/wasatorcl.cpp, src/rcldb/searchdata.h:
+	use a refcntr for the sub SearchData
+
+2008-08-28 15:42 +0000  dockes    (417a8f1346df)
+
+	* src/rcldb/searchdata.cpp:
+	ensure that a negative clause is not first or only in list
+
+2008-08-27 12:34 +0000  dockes    (658ca4b955c8)
+
+	* src/python/recoll/pyrecoll.cpp:
+	reorganize+traces
+
+2008-08-27 12:12 +0000  dockes    (37791b8e66aa)
+
+	* src/python/recoll/pyrecoll.cpp:
+	doc
+
+2008-08-26 13:50 +0000  dockes    (af43f86ffe99)
+
+	* src/query/wasastringtoquery.cpp:
+	make AND and OR case-sensitive
+
+2008-08-26 13:47 +0000  dockes    (bda91f767e32)
+
+	* src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h,
+	src/query/wasatorcl.cpp:
+	try to parse the whole of Xesam user language 0.95
+
+2008-08-26 07:56 +0000  dockes    (6a17726c7e41)
+
+	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
+	src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
+	src/python/samples/recollq.py:
+	renamed a few things
+
+2008-08-26 07:38 +0000  dockes    (c97de92889e3)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	copy author back from data record to Doc
+
+2008-08-26 07:36 +0000  dockes    (d6e27e630844)
+
+	* src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
+	src/python/samples/recollq.py: new file.
+	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
+	src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
+	src/python/samples/recollq.py:
+	*** empty log message ***
+
+2008-08-26 07:33 +0000  dockes    (1d6816c32358)
+
+	* src/rcldb/rcldoc.h:
+	comments
+
+2008-08-26 07:33 +0000  dockes    (4e86d4c4f3d9)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/reslist.cpp:
+	move ipath computations from reslist to internfile
+
+2008-08-26 07:31 +0000  dockes    (b44f4950a084)
+
+	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h:
+	implement skip_to_document
+
+2008-08-25 16:12 +0000  dockes    (936499917659)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	opxml formats
+
+2008-07-30 13:16 +0000  dockes    (0f1387a8a565)
+
+	* src/rcldb/stemdb.cpp:
+	fixed inocuous but nasty bad string value test
+
+2008-07-29 08:25 +0000  dockes    (a7888d48c2a6)
+
+	* src/rcldb/rcldb.h, src/rcldb/rcldoc.h:
+	comments
+
+2008-07-29 06:25 +0000  dockes    (28ebb7cac39d)
+
+	* src/index/indexer.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
+	src/rcldb/rcldb_p.h, src/rcldb/rcldoc.h:
+	use explicit parent udi term instead of Qterm structure to express
+	parent-child relationship
+
+2008-07-28 12:24 +0000  dockes    (5cb926be362f)
+
+	* src/index/indexer.cpp, src/lib/Makefile, src/lib/mkMake,
+	src/query/docseqhist.cpp, src/rcldb/pathhash.cpp,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldoc.h,
+	src/utils/Makefile, src/utils/fileudi.cpp:
+	replaced path|ipath with unique doc id in rcldb i/f. Still depends
+	on udi structure for parent/child
+
+2008-07-28 10:20 +0000  dockes    (07bc933efb70)
+
+	* src/utils/fileudi.cpp, src/utils/fileudi.h: new file.
+	* src/utils/fileudi.cpp, src/utils/fileudi.h:
+	*** empty log message ***
+
+2008-07-28 08:42 +0000  dockes    (825cb66f8be3)
+
+	* src/index/indexer.cpp, src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rcldoc.h,
+	src/utils/base64.h:
+	begin i/f cleanup: opacify doc uptodate sig (size+mtime)
+
+2008-07-04 09:29 +0000  dockes    (6551cb55fa98 [RECOLL_1_10_3])
+
+	* src/qtgui/plaintorich.cpp:
+	turn dbg off
+
+2008-07-01 13:00 +0000  dockes    (19e926f99256)
+
+	* src/ChangeLog, src/VERSION:
+	1.10.3: checkpoint for 1.10 branch maintenance
+
+2008-07-01 12:11 +0000  dockes    (910f409cb0be)
+
+	* src/bincimapmime/convert.h:
+	suppressed a few wasteful string-cstr conversions
+
+2008-07-01 11:57 +0000  dockes    (913963d84bc5)
+
+	* src/bincimapmime/convert.cc, src/bincimapmime/convert.h,
+	src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-
+	printheader.cc:
+	suppressed a few wasteful string-cstr conversions
+
+2008-07-01 11:51 +0000  dockes    (54f3a868fb92)
+
+	* src/bincimapmime/address.cc, src/internfile/mh_mail.cpp,
+	src/query/wasastringtoquery.cpp, src/query/xadump.cpp,
+	src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/rcldb/searchdata.h,
+	src/utils/conftree.cpp, src/utils/conftree.h, src/utils/idfile.cpp,
+	src/utils/mimeparse.cpp, src/utils/pathut.cpp, src/utils/pathut.h,
+	src/utils/smallut.cpp:
+	suppressed a few wasteful string-cstr conversions
+
+2008-07-01 10:29 +0000  dockes    (3e1aa9958af4)
+
+	* src/index/mimetype.cpp, src/index/mimetype.h,
+	src/internfile/mh_mail.cpp:
+	mh_mail now uses mimetype() to try and better identify application
+	/octet-stream
+
+2008-07-01 08:31 +0000  dockes    (3665315a4fdd)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2008-07-01 08:31 +0000  dockes    (928e08cb2cc8)
+
+	* src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
+	src/rcldb/rclquery_p.h:
+	small cleanups and comments
+
+2008-07-01 08:28 +0000  dockes    (e5847d808877)
+
+	* src/rcldb/rcldb.h:
+	comments
+
+2008-07-01 08:27 +0000  dockes    (97cd50050ecf)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
+	src/qtgui/reslist.cpp:
+	cleaned up plaintorich. Now a proper subclassable class + highlights
+	multiple groups, not just the first
+
+2008-07-01 08:27 +0000  dockes    (3ef1709e5955)
+
+	* src/qtgui/confgui/confguiindex.cpp:
+	typo
+
+2008-07-01 08:26 +0000  dockes    (f6ddabbf59a2)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/utils/pathut.cpp,
+	src/utils/pathut.h:
+	moved printableUrl() to pathut
+
+2008-07-01 08:24 +0000  dockes    (413a8a75c5af)
+
+	* src/python/recoll/pyrecoll.cpp:
+	added abstract i/f
+
+2008-06-17 11:43 +0000  dockes    (009a912c3daf)
+
+	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py:
+	basic functionality ok, more funcs and options needed
+
+2008-06-13 18:23 +0000  dockes    (58a4b54fa103)
+
+	* src/utils/refcntr.h:
+	separated rcldb and rclquery
+
+2008-06-13 18:22 +0000  dockes    (a52ef2510839)
+
+	* src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
+	src/rcldb/rclquery_p.h: new file.
+	* src/kde/kioslave/recoll/kio_recoll.cpp, src/lib/Makefile,
+	src/lib/mkMake, src/python/recoll/pyrecoll.cpp,
+	src/python/recoll/setup.py, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
+	src/query/docseqdb.h, src/query/recollq.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp,
+	src/rcldb/rclquery.h, src/rcldb/rclquery_p.h,
+	src/rcldb/searchdata.h, src/utils/pathut.cpp, src/utils/refcntr.h:
+	separated rcldb and rclquery
+
+2008-06-13 18:14 +0000  dockes    (e39af9faad92)
+
+	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
+	src/mk/Darwin, src/mk/FreeBSD, src/mk/Linux, src/mk/OpenBSD:
+	move few things from the mk/sys files to autoconf
+
+2008-06-10 06:30 +0000  dockes    (822b88ae3d1f)
+
+	* src/qtgui/mtpics/License_sidux.txt: new file.
+	* src/qtgui/mtpics/License_sidux.txt:
+	*** empty log message ***
+
+2008-06-09 09:14 +0000  dockes    (c9953f1a54ee)
+
+	* src/filters/rclsiduxman, src/qtgui/mtpics/sidux-book.png: new file.
+	* src/filters/rclsiduxman, src/qtgui/mtpics/sidux-book.png,
+	src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	sidux manual support
+
+2008-05-27 10:46 +0000  dockes    (2afb8b8ec073)
+
+	* 1.10.2
+
+2008-05-27 10:45 +0000  dockes    (62c7f8ba0eb8)
+
+	* packaging/debian/changelog, packaging/rpm/recoll.spec,
+	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
+	src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
+	website/BUGS.txt, website/CHANGES.txt, website/download.html,
+	website/features.html, website/index.html.en, website/index.html.fr,
+	website/styles/style.css:
+	1.10.2
+
+2008-05-27 06:47 +0000  dockes    (b120e7a059cd [RECOLL_1_10_2])
+
+	* src/README:
+	*** empty log message ***
+
+2008-05-27 06:46 +0000  dockes    (70d9bb153b58)
+
+	* src/VERSION:
+	1.10.2
+
+2008-05-27 06:18 +0000  dockes    (305829599fb1)
+
+	* src/utils/pathut.cpp:
+	suppress warning
+
+2008-05-27 05:40 +0000  dockes    (f611211f012a)
+
+	* src/internfile/internfile.cpp:
+	log message
+
+2008-05-26 09:07 +0000  dockes    (dbb469971d76)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2008-05-21 07:21 +0000  dockes    (b1ee79619cca)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/confgui/confgui.cpp,
+	src/qtgui/confgui/confgui.h, src/qtgui/preview_w.cpp,
+	src/qtgui/reslist.cpp, src/utils/idfile.cpp:
+	openSuse 11 compile issues
+
+2008-05-20 10:09 +0000  dockes    (f047b0f61753)
+
+	* src/qtgui/advsearch_w.cpp, src/rcldb/rcldb.cpp:
+	*** empty log message ***
+
+2008-05-20 10:09 +0000  dockes    (f2e76fada01c)
+
+	* src/unac/unac.c:
+	make strict gcc happy
+
+2008-05-09 12:34 +0000  dockes    (be08db2c226e)
+
+	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py: new
+	file.
+	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py:
+	*** empty log message ***
+
+2008-05-08 10:00 +0000  dockes    (2ff9f42dc279)
+
+	* src/rcldb/searchdata.h:
+	comments
+
+2008-05-08 09:57 +0000  dockes    (bd6106d7f9ab)
+
+	* src/utils/smallut.cpp, src/utils/smallut.h:
+	*** empty log message ***
+
+2008-05-08 09:31 +0000  dockes    (70f8eab20535)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2008-05-07 06:14 +0000  dockes    (f3d36126287d)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-05-05 20:31 +0000  dockes    (d271616c4b99)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-05-05 20:28 +0000  dockes    (02b1484f3eee)
+
+	* src/doc/user/usermanual.sgml, src/qtgui/guiutils.cpp,
+	src/qtgui/guiutils.h, src/qtgui/preview_w.cpp,
+	src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp:
+	allow setting query term highlight color in prefs
+
+2008-05-05 16:38 +0000  dockes    (763298305d15)
+
+	* src/qtgui/reslist.cpp:
+	Edit -> Open in links
+
+2008-05-05 13:13 +0000  dockes    (d2fc5c651024)
+
+	* src/bincimapmime/mime-parsefull.cc:
+	part data was sometimes truncated because of bad handling of
+	consecutive mime boundaries. Most common symptom: error in base64
+	decoding
+
+2008-04-18 11:41 +0000  dockes    (32155182993c)
+
+	* src/mk/localdefs.in:
+	get CXXFLAGS from autoconf
+
+2008-04-18 11:39 +0000  dockes    (72073f033a45)
+
+	* src/query/xadump.cpp:
+	xadump would sometimes dump core with -b
+
+2008-04-18 11:38 +0000  dockes    (ef6566c2ac8e)
+
+	* src/qtgui/preview_w.cpp:
+	walking the search terms hits backwards would go forward
+
+2008-04-18 11:37 +0000  dockes    (018890cfdbd7)
+
+	* src/utils/Makefile, src/utils/base64.cpp, src/utils/readfile.cpp:
+	base64 testing code
+
+2008-02-19 08:02 +0000  dockes    (34b45c5acd1c)
+
+	* src/qtgui/main.cpp:
+	make first sort after -q work
+
+2008-02-19 08:02 +0000  dockes    (1293fc15412b)
+
+	* src/qtgui/rclmain_w.cpp:
+	comments+debug
+
+2008-02-19 07:41 +0000  dockes    (efbaeed44ee9)
+
+	* src/rcldb/rcldb.cpp:
+	traces
+
+2008-02-11 10:21 +0000  dockes    (81923201adc7)
+
+	* src/utils/idfile.cpp:
+	hack for Mark B.: allow treating (single-message) mbox files as
+	message/rfc822
+
+2008-02-08 08:37 +0000  dockes    (ddcce838e7d0)
+
+	* src/qtgui/i18n/recoll_de.ts:
+	update by Frank Thieme
+
+2008-02-05 10:45 +0000  dockes    (51a501984fd4)
+
+	* src/sampleconf/mimeconf:
+	*** empty log message ***
+
+2008-02-03 16:24 +0000  dockes    (825bb43d67ca)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	rclsvg
+
+2008-02-03 16:05 +0000  dockes    (81794c3a6d9e)
+
+	* src/filters/rclsvg:
+	*** empty log message ***
+
+2008-02-03 16:04 +0000  dockes    (40c35a7fb1bb)
+
+	* src/filters/rclsvg: new file.
+	* src/filters/rclsvg:
+	*** empty log message ***
+
+2008-01-29 10:14 +0000  dockes    (fd74eae7e8b4 [RECOLL_1_10_1])
+
+	* src/README:
+	*** empty log message ***
+
+2008-01-29 10:11 +0000  dockes    (a1fee09bfc3d)
+
+	* src/rcldb/searchdata.h:
+	m_haveWildCards was sometimes not init
+
+2008-01-29 08:41 +0000  dockes    (ebc971754f92)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2008-01-24 09:34 +0000  dockes    (301425122a56)
+
+	* src/qtgui/main.cpp:
+	*** empty log message ***
+
+2008-01-17 11:15 +0000  dockes    (af11c991aff3)
+
+	* src/qtgui/idxthread.cpp, src/qtgui/idxthread.h,
+	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h:
+	allow stopping indexing through menu action
+
+2008-01-17 11:14 +0000  dockes    (4c108ac6227a)
+
+	* src/query/wasastringtoquery.h:
+	comment
+
+2008-01-17 11:13 +0000  dockes    (7b2a9225dbef)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-01-16 11:14 +0000  dockes    (ddfe49735bc2)
+
+	* src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp,
+	src/rcldb/searchdata.h:
+	express query language OR chains as rcldb subqueries so that field
+	specs will work inside them
+
+2008-01-16 10:52 +0000  dockes    (6487da12360f)
+
+	* src/ChangeLog, src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2008-01-16 08:43 +0000  dockes    (592d1258c5e4)
+
+	* src/rcldb/searchdata.cpp:
+	splitString filename queries
+
+2007-12-20 09:08 +0000  dockes    (e99decc750eb)
+
+	* src/index/indexer.cpp, src/rcldb/rcldb.cpp:
+	ensure that the names of files with filter errors get indexed anyway
+
+2007-12-13 06:58 +0000  dockes    (de422a0df409)
+
+	* src/aspell/rclaspell.cpp, src/bincimapmime/convert.h,
+	src/common/rclconfig.cpp, src/common/rclinit.cpp,
+	src/common/textsplit.cpp, src/common/unacpp.cpp,
+	src/index/csguess.cpp, src/index/indexer.cpp,
+	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
+	src/index/recollindex.cpp, src/internfile/htmlparse.cpp,
+	src/internfile/mh_mail.cpp, src/internfile/mh_mbox.cpp,
+	src/internfile/myhtmlparse.cpp, src/query/docseqhist.cpp,
+	src/query/history.cpp, src/query/recollq.cpp,
+	src/rcldb/pathhash.cpp, src/rcldb/rcldb.cpp, src/utils/base64.cpp,
+	src/utils/conftree.cpp, src/utils/copyfile.cpp,
+	src/utils/fstreewalk.cpp, src/utils/idfile.cpp,
+	src/utils/mimeparse.cpp, src/utils/pathut.cpp,
+	src/utils/readfile.cpp, src/utils/wipedir.cpp:
+	gcc 4 compat, thanks to Kartik Mistry
+
+2007-12-04 10:17 +0000  dockes    (f2bd537aad87)
+
+	* src/qtgui/rclmain_w.cpp:
+	directly open editor action choice dialog when user says so
+
+2007-12-04 10:16 +0000  dockes    (9a289ca30889)
+
+	* src/qtgui/uiprefs_w.cpp, src/utils/utf8iter.cpp:
+	*** empty log message ***
+
+2007-11-25 07:29 +0000  dockes    (3782c85019d4)
+
+	* src/qtgui/i18n/recoll_tr.ts:
+	*** empty log message ***
+
+2007-11-24 16:51 +0000  dockes    (a41099c58ac0)
+
+	* src/qtgui/i18n/recoll_fr.ts:
+	accents
+
+2007-11-24 16:43 +0000  dockes    (eecb572a0935)
+
+	* src/qtgui/confgui/confguiindex.h:
+	make conftoppanelw a q_object for translations to work
+
+2007-11-24 10:41 +0000  dockes    (343184d41f3b)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts:
+	*** empty log message ***
+
+2007-11-21 16:34 +0000  dockes    (966333a903a9)
+
+	* src/VERSION:
+	*** empty log message ***
+
+2007-11-21 16:34 +0000  dockes    (aed5f0389421)
+
+	* 1.10.0
+
+2007-11-21 16:34 +0000  dockes    (4918fce7a71a)
+
+	* packaging/debian/changelog, packaging/debian/control,
+	packaging/debian/menu, packaging/debian/rules,
+	packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec,
+	packaging/rpm/recollmdk.spec, tests/shared.sh, website/CHANGES.txt,
+	website/devel.html, website/download.html, website/features.html,
+	website/fr/features.html, website/index.html.en,
+	website/index.html.fr, website/pics/index.html,
+	website/styles/style.css:
+	1.10.0
+
+2007-11-21 14:15 +0000  dockes    (9c57d53ad305 [RECOLL_1_10_0])
+
+	* src/qtgui/confgui/confguiindex.cpp, src/qtgui/main.cpp,
+	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h:
+	allow opening config gui if no index on first start
+
+2007-11-21 09:42 +0000  dockes    (b1db39055b6d)
+
+	* src/excludefile:
+	*** empty log message ***
+
+2007-11-21 09:34 +0000  dockes    (cca64d1bdb79)
+
+	* src/utils/conftree.cpp:
+	explicitely detect lines beginning with #
+
+2007-11-21 09:00 +0000  dockes    (2cb85a4bd555)
+
+	* src/INSTALL, src/README:
+	*** empty log message ***
+
+2007-11-16 15:20 +0000  dockes    (1f90c7302746)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-11-16 14:28 +0000  dockes    (d7f21b7adf20)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/internfile/internfile.cpp, src/internfile/mimehandler.cpp,
+	src/internfile/mimehandler.h:
+	indexedmimetypes
+
+2007-11-16 12:21 +0000  dockes    (8221e8f1ce4f)
+
+	* src/query/wasastringtoquery.cpp, src/query/wasatorcl.cpp:
+	very small effort to look like xesam simple query
+
+2007-11-16 07:34 +0000  dockes    (1398d49de21d)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-11-16 07:19 +0000  dockes    (eedcef5d56b7)
+
+	* src/qtgui/i18n/recoll_tr.ts:
+	*** empty log message ***
+
+2007-11-15 18:44 +0000  dockes    (99e585288200)
+
+	* src/qtgui/preview_w.cpp:
+	comment
+
+2007-11-15 18:39 +0000  dockes    (1ee213030954)
+
+	* src/qt4gui/q3richtext_p.h: new file.
+	* src/qt4gui/q3richtext_p.h, src/qt4gui/recoll.pro.in:
+	qt4 movetoanchor
+
+2007-11-15 18:39 +0000  dockes    (335db8a5c8cb)
+
+	* src/qtgui/i18n/recoll_it.ts:
+	*** empty log message ***
+
+2007-11-15 18:34 +0000  dockes    (b3bb7b017f2a)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	moveToAnchor qt4
+
+2007-11-15 18:05 +0000  dockes    (1fe63dd4f268)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
+	src/qtgui/recoll.pro.in:
+	finally got anchors to work. qt3
+
+2007-11-15 18:05 +0000  dockes    (3158e59fd92e)
+
+	* src/qtgui/reslist.cpp:
+	*** empty log message ***
+
+2007-11-13 18:42 +0000  dockes    (1a7029e2dd4e)
+
+	* src/doc/man/recoll.1:
+	*** empty log message ***
+
+2007-11-13 18:40 +0000  dockes    (a5a94cfbfa7d)
+
+	* src/query/recollq.cpp:
+	keep format constant
+
+2007-11-13 18:40 +0000  dockes    (09f615e1a305)
+
+	* src/doc/user/usermanual.sgml:
+	text
+
+2007-11-13 18:39 +0000  dockes    (ce5a12bb92bd)
+
+	* tests/badsuffs1/badsuffs1.txt, tests/html/html.txt,
+	tests/mail/mail.txt, tests/ooff/ooff.txt, tests/special/special.txt:
+	1.10+small changes in dataset
+
+2007-11-13 15:35 +0000  dockes    (3a8d3f5af0e8)
+
+	* src/ChangeLog:
+	*** empty log message ***
+
+2007-11-13 15:34 +0000  dockes    (d23b6a94f4c0)
+
+	* src/VERSION:
+	1.10.0?
+
+2007-11-13 10:07 +0000  dockes    (f3338fa8cb4e)
+
+	* src/doc/man/recollq.1: new file.
+	* src/doc/man/recollq.1:
+	*** empty log message ***
+
+2007-11-09 18:48 +0000  dockes    (7859ad070bfc)
+
+	* src/qtgui/i18n/recoll_fr.ts:
+	1.9 ?
+
+2007-11-09 18:07 +0000  dockes    (557d4b9ce60a)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
+	src/qtgui/i18n/recoll_xx.ts:
+	*** empty log message ***
+
+2007-11-09 15:56 +0000  dockes    (2c201bdce017)
+
+	* src/filters/rcltex:
+	*** empty log message ***
+
+2007-11-09 15:46 +0000  dockes    (7960c1dd4d0a)
+
+	* src/kde/kioslave/recoll/00README.txt,
+	src/kde/kioslave/recoll/Makefile,
+	src/kde/kioslave/recoll/kio_recoll.cpp:
+	get things to compile with recoll 1.9 and suse + kde 3.5.5
+
+2007-11-09 13:44 +0000  dockes    (6196dbaf0aec)
+
+	* src/sampleconf/mimeview:
+	tex
+
+2007-11-09 11:55 +0000  dockes    (10ce7112596d)
+
+	* src/filters/rcltex: new file.
+	* src/filters/rclmedia: deleted file.
+	* src/filters/rclmedia, src/filters/rcltex, src/sampleconf/mimeconf,
+	src/sampleconf/mimemap:
+	added support for indexing TeX text
+
+2007-11-09 11:54 +0000  dockes    (5a35ec87ecf2)
+
+	* src/filters/rclid3:
+	comments
+
+2007-11-08 09:35 +0000  dockes    (bdde14acf3bd)
+
+	* src/query/recollq.h: new file.
+	* src/lib/Makefile, src/lib/mkMake, src/qtgui/main.cpp,
+	src/qtgui/recoll.pro.in, src/query/Makefile, src/query/recollq.cpp,
+	src/query/recollq.h:
+	allow recoll to be used as a recollq driver
+
+2007-11-08 09:34 +0000  dockes    (06e94674b8e2)
+
+	* src/utils/execmd.cpp:
+	include pthread
+
+2007-11-08 09:34 +0000  dockes    (d6e84478935d)
+
+	* src/rcldb/stemdb.cpp:
+	debug
+
+2007-11-08 09:32 +0000  dockes    (9f3349e7358b)
+
+	* src/qt4gui/recoll.pro.in:
+	turkish
+
+2007-11-08 09:31 +0000  dockes    (cd6b8b7d2a36)
+
+	* src/mk/OpenBSD:
+	*** empty log message ***
+
+2007-11-08 07:54 +0000  dockes    (6e986b6d1e64)
+
+	* src/query/recollq.cpp:
+	add -b option to only output url list
+
+2007-11-06 11:55 +0000  dockes    (2b0e2fc0dd88)
+
+	* src/qtgui/i18n/recoll_tr.ts: new file.
+	* src/qtgui/i18n/recoll_tr.ts:
+	*** empty log message ***
+
+2007-10-27 16:40 +0000  dockes    (e8ac0b8f6c46)
+
+	* src/rcldb/rcldb.cpp:
+	comment
+
+2007-10-27 08:40 +0000  dockes    (2ccaf4ef243e)
+
+	* src/ChangeLog, src/qtgui/i18n/recoll_de.ts,
+	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-10-27 08:40 +0000  dockes    (e647e4592daa)
+
+	* src/filters/rcluncomp:
+	allow uncompressing suffix-less files
+
+2007-10-27 08:40 +0000  dockes    (dc6d97a86685)
+
+	* src/internfile/internfile.cpp:
+	use pcSubst
+
+2007-10-27 08:39 +0000  dockes    (54ba3ef75586)
+
+	* src/rcldb/rcldb.cpp:
+	adjust MatchDecider return type according to xapian version
+
+2007-10-27 07:06 +0000  dockes    (54b798d7fa02)
+
+	* src/qtgui/i18n/recoll_xx.ts:
+	sent to ning
+
+2007-10-26 10:42 +0000  dockes    (acfa4e6c24ba)
+
+	* src/doc/user/usermanual.sgml:
+	index config gui
+
+2007-10-25 15:51 +0000  dockes    (12d12311134a)
+
+	* src/qtgui/confgui/confguiindex.cpp:
+	labels
+
+2007-10-25 15:51 +0000  dockes    (2a1d29582446)
+
+	* src/qtgui/confgui/confgui.cpp:
+	use new style combobox constructor
+
+2007-10-25 15:50 +0000  dockes    (8b45d32c605c)
+
+	* src/internfile/mh_exec.h:
+	cleanup
+
+2007-10-25 08:04 +0000  dockes    (0bf8540b6c22)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-10-25 07:27 +0000  dockes    (5d57c38993af)
+
+	* src/query/recollq.cpp, src/query/wasatorcl.cpp:
+	added option to query language for filtering on directory
+
+2007-10-25 07:09 +0000  dockes    (d1adc7006d08)
+
+	* src/rcldb/rcldb.cpp:
+	add filter topdir to query description
+
+2007-10-24 15:38 +0000  dockes    (5f1863c33239)
+
+	* src/rcldb/rcldb.cpp:
+	use a Xapian MatchDecider to filter on dir path
+
+2007-10-24 08:42 +0000  dockes    (2d337545271f)
+
+	* src/rcldb/rcldb.cpp:
+	make filter a xapian::MatchDecider, dont change mechanism
+
+2007-10-19 15:25 +0000  dockes    (935a92d6db39)
+
+	* src/qtgui/ssearch_w.cpp, src/utils/smallut.cpp:
+	consider cr and lf as whitespace when splitting strings
+
+2007-10-19 14:31 +0000  dockes    (bb88b5f4fc25)
+
+	* src/qtgui/confgui/confgui.h, src/qtgui/confgui/confguiindex.cpp:
+	small sizing adjustments
+
+2007-10-18 10:39 +0000  dockes    (f34f0260a62a)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp:
+	let plaintorich do the chunking, easier to make sure we dont confuse
+	textedit by cutting inside a tag
+
+2007-10-18 10:15 +0000  dockes    (7c46f29559fe)
+
+	* src/qtgui/confgui/confguiindex.cpp:
+	qt3
+
+2007-10-17 16:12 +0000  dockes    (41f711edeb0b)
+
+	* src/qtgui/plaintorich.cpp:
+	replaced utf8 cgj with good ole bel
+
+2007-10-17 11:40 +0000  dockes    (102fcc4aa169)
+
+	* src/internfile/mh_mail.cpp, src/internfile/mh_mail.h,
+	src/utils/mimeparse.cpp:
+	text/plain attachments were not transcoded to utf-8
+
+2007-10-17 09:57 +0000  dockes    (dd33128e3a59)
+
+	* src/common/rclconfig.cpp, src/internfile/internfile.cpp:
+	*** empty log message ***
+
+2007-10-15 13:08 +0000  dockes    (0a095e89bfb9)
+
+	* src/kde/recoll_applet/0README.Recoll, src/kde/recoll_applet/AUTHORS,
+	src/kde/recoll_applet/COPYING, src/kde/recoll_applet/ChangeLog,
+	src/kde/recoll_applet/Doxyfile, src/kde/recoll_applet/INSTALL,
+	src/kde/recoll_applet/Makefile.am,
+	src/kde/recoll_applet/Makefile.cvs,
+	src/kde/recoll_applet/Makefile.in, src/kde/recoll_applet/NEWS,
+	src/kde/recoll_applet/README, src/kde/recoll_applet/TODO,
+	src/kde/recoll_applet/acinclude.m4,
+	src/kde/recoll_applet/aclocal.m4,
+	src/kde/recoll_applet/admin/Doxyfile.am,
+	src/kde/recoll_applet/admin/Doxyfile.global,
+	src/kde/recoll_applet/admin/Makefile.common,
+	src/kde/recoll_applet/admin/acinclude.m4.in,
+	src/kde/recoll_applet/admin/am_edit,
+	src/kde/recoll_applet/admin/bcheck.pl,
+	src/kde/recoll_applet/admin/compile,
+	src/kde/recoll_applet/admin/conf.change.pl,
+	src/kde/recoll_applet/admin/config.guess,
+	src/kde/recoll_applet/admin/config.pl,
+	src/kde/recoll_applet/admin/config.sub,
+	src/kde/recoll_applet/admin/configure.in.bot.end,
+	src/kde/recoll_applet/admin/configure.in.min,
+	src/kde/recoll_applet/admin/cvs.sh,
+	src/kde/recoll_applet/admin/debianrules,
+	src/kde/recoll_applet/admin/depcomp,
+	src/kde/recoll_applet/admin/deps.am, src/kde/recoll_applet/admin
+	/detect-autoconf.pl, src/kde/recoll_applet/admin/doxygen.sh,
+	src/kde/recoll_applet/admin/install-sh,
+	src/kde/recoll_applet/admin/libtool.m4.in,
+	src/kde/recoll_applet/admin/ltmain.sh,
+	src/kde/recoll_applet/admin/missing,
+	src/kde/recoll_applet/admin/mkinstalldirs,
+	src/kde/recoll_applet/admin/nmcheck,
+	src/kde/recoll_applet/admin/oldinclude.m4.in,
+	src/kde/recoll_applet/admin/pkg.m4.in,
+	src/kde/recoll_applet/admin/ylwrap,
+	src/kde/recoll_applet/config.h.in, src/kde/recoll_applet/configure,
+	src/kde/recoll_applet/configure.files,
+	src/kde/recoll_applet/configure.in,
+	src/kde/recoll_applet/configure.in.in,
+	src/kde/recoll_applet/doc/Makefile.am,
+	src/kde/recoll_applet/doc/Makefile.in,
+	src/kde/recoll_applet/doc/en/Makefile.am,
+	src/kde/recoll_applet/doc/en/Makefile.in,
+	src/kde/recoll_applet/doc/en/index.docbook,
+	src/kde/recoll_applet/po/Makefile.am,
+	src/kde/recoll_applet/po/Makefile.in,
+	src/kde/recoll_applet/src/Makefile.am,
+	src/kde/recoll_applet/src/Makefile.in,
+	src/kde/recoll_applet/src/kpixmapcombo.cpp,
+	src/kde/recoll_applet/src/kpixmapcombo.h,
+	src/kde/recoll_applet/src/recoll_applet.cpp,
+	src/kde/recoll_applet/src/recoll_applet.desktop,
+	src/kde/recoll_applet/src/recoll_applet.h,
+	src/kde/recoll_applet/src/recoll_applet.lsm,
+	src/kde/recoll_applet/stamp-h.in, src/kde/recoll_applet/subdirs: new
+	file.
+	* src/kde/recoll_applet/0README.Recoll, src/kde/recoll_applet/AUTHORS,
+	src/kde/recoll_applet/COPYING, src/kde/recoll_applet/ChangeLog,
+	src/kde/recoll_applet/Doxyfile, src/kde/recoll_applet/INSTALL,
+	src/kde/recoll_applet/Makefile.am,
+	src/kde/recoll_applet/Makefile.cvs,
+	src/kde/recoll_applet/Makefile.in, src/kde/recoll_applet/NEWS,
+	src/kde/recoll_applet/README, src/kde/recoll_applet/TODO,
+	src/kde/recoll_applet/acinclude.m4,
+	src/kde/recoll_applet/aclocal.m4,
+	src/kde/recoll_applet/admin/Doxyfile.am,
+	src/kde/recoll_applet/admin/Doxyfile.global,
+	src/kde/recoll_applet/admin/Makefile.common,
+	src/kde/recoll_applet/admin/acinclude.m4.in,
+	src/kde/recoll_applet/admin/am_edit,
+	src/kde/recoll_applet/admin/bcheck.pl,
+	src/kde/recoll_applet/admin/compile,
+	src/kde/recoll_applet/admin/conf.change.pl,
+	src/kde/recoll_applet/admin/config.guess,
+	src/kde/recoll_applet/admin/config.pl,
+	src/kde/recoll_applet/admin/config.sub,
+	src/kde/recoll_applet/admin/configure.in.bot.end,
+	src/kde/recoll_applet/admin/configure.in.min,
+	src/kde/recoll_applet/admin/cvs.sh,
+	src/kde/recoll_applet/admin/debianrules,
+	src/kde/recoll_applet/admin/depcomp,
+	src/kde/recoll_applet/admin/deps.am, src/kde/recoll_applet/admin
+	/detect-autoconf.pl, src/kde/recoll_applet/admin/doxygen.sh,
+	src/kde/recoll_applet/admin/install-sh,
+	src/kde/recoll_applet/admin/libtool.m4.in,
+	src/kde/recoll_applet/admin/ltmain.sh,
+	src/kde/recoll_applet/admin/missing,
+	src/kde/recoll_applet/admin/mkinstalldirs,
+	src/kde/recoll_applet/admin/nmcheck,
+	src/kde/recoll_applet/admin/oldinclude.m4.in,
+	src/kde/recoll_applet/admin/pkg.m4.in,
+	src/kde/recoll_applet/admin/ylwrap,
+	src/kde/recoll_applet/config.h.in, src/kde/recoll_applet/configure,
+	src/kde/recoll_applet/configure.files,
+	src/kde/recoll_applet/configure.in,
+	src/kde/recoll_applet/configure.in.in,
+	src/kde/recoll_applet/doc/Makefile.am,
+	src/kde/recoll_applet/doc/Makefile.in,
+	src/kde/recoll_applet/doc/en/Makefile.am,
+	src/kde/recoll_applet/doc/en/Makefile.in,
+	src/kde/recoll_applet/doc/en/index.docbook,
+	src/kde/recoll_applet/po/Makefile.am,
+	src/kde/recoll_applet/po/Makefile.in,
+	src/kde/recoll_applet/src/Makefile.am,
+	src/kde/recoll_applet/src/Makefile.in,
+	src/kde/recoll_applet/src/kpixmapcombo.cpp,
+	src/kde/recoll_applet/src/kpixmapcombo.h,
+	src/kde/recoll_applet/src/recoll_applet.cpp,
+	src/kde/recoll_applet/src/recoll_applet.desktop,
+	src/kde/recoll_applet/src/recoll_applet.h,
+	src/kde/recoll_applet/src/recoll_applet.lsm,
+	src/kde/recoll_applet/stamp-h.in, src/kde/recoll_applet/subdirs:
+	*** empty log message ***
+
+2007-10-14 16:07 +0000  dockes    (aea3ceac265d)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-10-09 14:08 +0000  dockes    (008fb8da2cfe)
+
+	* src/qt4gui/recoll.pro.in, src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h, src/qtgui/idxthread.cpp,
+	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h, src/qtgui/recoll.pro.in:
+	indexing confgui seems to sort of work
+
+2007-10-09 11:08 +0000  dockes    (8e165638db48)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
+	src/qtgui/confgui/main.cpp:
+	*** empty log message ***
+
+2007-10-09 09:43 +0000  dockes    (bda697547b28)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h:
+	modified mechanism for confgui updates
+
+2007-10-09 09:40 +0000  dockes    (314568630e50)
+
+	* src/utils/conftree.h:
+	*** empty log message ***
+
+2007-10-07 20:22 +0000  dockes    (a4407de529dc)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confguiindex.cpp:
+	*** empty log message ***
+
+2007-10-06 07:44 +0000  dockes    (e12dcaba9422)
+
+	* src/sampleconf/mimeconf:
+	*** empty log message ***
+
+2007-10-06 07:26 +0000  dockes    (8c03c83a6353)
+
+	* src/ChangeLog, src/INSTALL, src/README, src/VERSION:
+	*** empty log message ***
+
+2007-10-06 07:13 +0000  dockes    (80c8e77d75e3)
+
+	* src/qtgui/i18n/recoll_xx.ts: new file.
+	* src/doc/user/usermanual.sgml, src/qtgui/i18n/recoll_xx.ts:
+	*** empty log message ***
+
+2007-10-05 14:00 +0000  dockes    (3f47738c7b7f)
+
+	* src/query/wasatorcl.cpp:
+	add rclcat prefix to query languages + adapt find_applet to use it
+
+2007-10-05 08:03 +0000  dockes    (eb9ae456f872)
+
+	* src/qtgui/main.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h:
+	add cmd line option to run query when starting
+
+2007-10-04 12:26 +0000  dockes    (479712bd069b)
+
+	* src/rcldb/searchdata.cpp:
+	when search includes composite spans + other terms, increase slack
+	instead of switching to word split
+
+2007-10-04 12:21 +0000  dockes    (67c23cd41df2)
+
+	* src/common/rclconfig.cpp, src/common/textsplit.cpp,
+	src/common/textsplit.h:
+	make cjk ngramlen configurable
+
+2007-10-04 12:20 +0000  dockes    (e9e128bf43ab)
+
+	* src/index/indexer.cpp:
+	trace
+
+2007-10-03 14:53 +0000  dockes    (b8852ea7a80c)
+
+	* src/internfile/Makefile, src/internfile/mh_mbox.cpp,
+	src/internfile/mh_mbox.h:
+	Improve From_ line detection
+
+2007-10-02 14:25 +0000  dockes    (3379ab8d9013)
+
+	* src/doc/user/docbook.css, src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-10-02 14:22 +0000  dockes    (29a402a23d12)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	a few more image files
+
+2007-10-02 14:00 +0000  dockes    (d0e7241eeb0e)
+
+	* src/filters/rclflac, src/filters/rclogg: new file.
+	* src/filters/rcljpeg: deleted file.
+	* src/filters/rclflac, src/filters/rcljpeg, src/filters/rclogg:
+	*** empty log message ***
+
+2007-10-02 13:56 +0000  dockes    (e180ca729bea)
+
+	* src/filters/rclimg:
+	comments,GPL
+
+2007-10-02 11:39 +0000  dockes    (7777fdc5d30a)
+
+	* src/common/rclconfig.cpp, src/common/textsplit.cpp,
+	src/common/textsplit.h:
+	add flag to disable cjk processing
+
+2007-10-01 17:56 +0000  dockes    (29b1aeb75d23)
+
+	* src/filters/rclimg: new file.
+	* src/filters/rclimg:
+	initial version from Cedric Scott
+
+2007-10-01 15:57 +0000  dockes    (b3aeb47d6a43)
+
+	* src/utils/conftree.cpp:
+	added updates/erase tests
+
+2007-10-01 06:35 +0000  dockes    (b29617933c16)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp, src/qtgui/confgui/main.cpp,
+	src/qtgui/confgui/trconf.pro:
+	qt4 port
+
+2007-10-01 06:19 +0000  dockes    (78068b236681)
+
+	* src/VERSION, src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/qtgui/confgui/confgui.cpp, src/utils/conftree.cpp,
+	src/utils/conftree.h:
+	config update enabling functions
+
+2007-09-29 09:06 +0000  dockes    (e38c26097ece)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
+	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
+	*** empty log message ***
+
+2007-09-27 15:47 +0000  dockes    (9ac07bf91591)
+
+	* src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h:
+	new file.
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/confguiindex.cpp,
+	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
+	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
+	*** empty log message ***
+
+2007-09-27 11:03 +0000  dockes    (436530279a09)
+
+	* src/utils/conftree.h:
+	comment
+
+2007-09-27 11:02 +0000  dockes    (a466c387c485)
+
+	* src/utils/conftree.cpp, src/utils/conftree.h:
+	avoid adding unneeded entries in confstack. fix erase-add resulting
+	in duplicate
+
+2007-09-26 12:16 +0000  dockes    (8e1e4edb4f4a)
+
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro: new file.
+	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
+	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
+	*** empty log message ***
+
+2007-09-22 08:51 +0000  dockes    (8072f3278663)
+
+	* src/common/textsplit.cpp, src/utils/utf8iter.h:
+	include assert.h when needed
+
+2007-09-21 16:45 +0000  dockes    (d85479652341)
+
+	* src/INSTALL, src/README, src/VERSION, src/doc/user/usermanual.sgml,
+	src/qtgui/recoll.pro.in:
+	*** empty log message ***
+
+2007-09-20 12:22 +0000  dockes    (28a9c536ebba)
+
+	* src/common/textsplit.cpp:
+	logs
+
+2007-09-20 08:45 +0000  dockes    (415256bd7508)
+
+	* src/common/textsplit.cpp, src/common/textsplit.h,
+	src/utils/utf8iter.h:
+	initial cjk support
+
+2007-09-20 08:43 +0000  dockes    (66200ff61f31)
+
+	* src/rcldb/searchdata.cpp:
+	comments,formatting
+
+2007-09-20 08:42 +0000  dockes    (750b59dea1e9)
+
+	* src/qtgui/rclmain_w.cpp:
+	restore cursor if cant start query
+
+2007-09-18 20:35 +0000  dockes    (1d01904f2b55)
+
+	* src/common/textsplit.cpp, src/common/textsplit.h:
+	use m_ prefix for members
+
+2007-09-18 20:34 +0000  dockes    (49381b7f40f6)
+
+	* src/qt4gui/recoll.pro.in:
+	add recoll_xx.ts
+
+2007-09-18 07:01 +0000  dockes    (7dea06d57ada)
+
+	* src/qtgui/i18n/recoll_it.ts:
+	changes by Giovanni Cannizzaro
+
+2007-09-11 08:23 +0000  dockes    (615a70a64b94 [RECOLL_1_9_0])
+
+	* src/desktop/recoll-searchgui.desktop:
+	desktop file corrected as per Kartik Mistry patch
+
+2007-09-10 05:44 +0000  dockes    (78b0c9bd47bb)
+
+	* src/qtgui/i18n/recoll_fr.ts:
+	long menu labels cause pbs at least on macosx
+
+2007-09-08 17:26 +0000  dockes    (ef2964b2e49e)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-09-08 17:25 +0000  dockes    (000b2b01844d)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
+	src/qtgui/preview_w.cpp, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp:
+	change hghlight text size limit to configurable value
+
+2007-09-08 17:21 +0000  dockes    (c0ab1e961f0a)
+
+	* src/qtgui/viewaction_w.cpp:
+	added missing space in string
+
+2007-09-08 17:21 +0000  dockes    (f70ce9c4c753)
+
+	* src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp:
+	renamed preferencesQuery_PrefsAction to queryPrefsAction
+
+2007-09-08 17:19 +0000  dockes    (17eefeb77500 [RECOLL_1_9_1cjk2, RECOLL_1_9_1cjk1])
+
+	* src/qtgui/plaintorich.cpp:
+	comment
+
+2007-09-08 09:44 +0000  dockes    (8aabe9bc2d85)
+
+	* src/utils/readfile.cpp:
+	small pb in solaris fix
+
+2007-09-08 08:07 +0000  dockes    (4b862559adbb)
+
+	* src/mk/SunOS, src/utils/pathut.cpp, src/utils/readfile.cpp:
+	SunOS 2.8 fixes
+
+2007-09-07 14:58 +0000  dockes    (f0b17af1f5d7)
+
+	* src/configure, src/configure.ac:
+	always add lz to lxapian
+
+2007-09-07 12:39 +0000  dockes    (b10ac30fe130)
+
+	* website/CHANGES.txt:
+	*** empty log message ***
+
+2007-09-07 08:05 +0000  dockes    (f031116372e8)
+
+	* src/rcldb/rcldb.cpp:
+	improve purge error message printing
+
+2007-09-07 08:04 +0000  dockes    (276b259f9ec6)
+
+	* src/qtgui/i18n/recoll_it.ts:
+	new 1.9 translation by C. Rigamont
+
+2007-09-07 08:04 +0000  dockes    (450e1342467c)
+
+	* src/sampleconf/mimemap:
+	fix wordperfect spurious extensions
+
+2007-09-07 08:03 +0000  dockes    (624a100107be [RECOLL_1_9_1cjk])
+
+	* website/BUGS.txt:
+	update xapian near to 1.0.2
+
+2007-09-07 08:03 +0000  dockes    (a0d360caf71e)
+
+	* website/copydocs:
+	to_mac
+
+2007-09-01 19:12 +0000  dockes    (3ebdb5af664f)
+
+	* src/qt4gui/recoll.pro.in, src/qtgui/i18n/recoll_de.ts,
+	src/qtgui/recoll.pro.in:
+	*** empty log message ***
+
+2007-08-31 09:04 +0000  dockes    (32533d0d11d0)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
+	pressing CR in advsearch would run query twice because of start
+	autodefault
+
+2007-08-31 07:23 +0000  dockes    (bb17fa4cfaca)
+
+	* src/qtgui/images/d_firstpage.png, src/qtgui/images/firstpage.png:
+	new file.
+	* src/qtgui/images/d_firstpage.png, src/qtgui/images/firstpage.png:
+	*** empty log message ***
+
+2007-08-30 10:11 +0000  dockes    (c75b5f42b33d)
+
+	* src/INSTALL, src/README, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-08-30 10:00 +0000  dockes    (7c4ccceae2a7)
+
+	* website/BUGS.txt, website/CHANGES.txt, website/download.html,
+	website/features.html:
+	*** empty log message ***
+
+2007-08-30 09:01 +0000  dockes    (687cad7b46de)
+
+	* src/doc/user/usermanual.sgml, src/index/indexer.cpp,
+	src/index/indexer.h, src/index/rclmonrcv.cpp,
+	src/sampleconf/recoll.conf.in, src/utils/fstreewalk.cpp,
+	src/utils/fstreewalk.h:
+	add followLinks option
+
+2007-08-30 08:39 +0000  dockes    (6af3a2216074)
+
+	* src/doc/user/usermanual.sgml:
+	add followLinks option
+
+2007-08-28 08:12 +0000  dockes    (6385c6a9c88e)
+
+	* src/index/indexer.cpp:
+	allow symlinks in topdirs
+
+2007-08-28 08:08 +0000  dockes    (a3df89087437)
+
+	* src/utils/fstreewalk.cpp, src/utils/fstreewalk.h:
+	follow top (entry) symlinks even if nofollow is set
+
+2007-08-28 08:07 +0000  dockes    (19ac4f90b7e7)
+
+	* src/internfile/internfile.cpp:
+	error msg
+
+2007-08-26 13:52 +0000  dockes    (fa08f95a4d95)
+
+	* src/doc/user/usermanual.sgml:
+	add wordperfect ext app info
+
+2007-08-26 13:34 +0000  dockes    (ac877cc2e3ad)
+
+	* src/filters/rclwpd: new file.
+	* src/filters/rclwpd, src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	added wordperfect support
+
+2007-08-26 13:34 +0000  dockes    (7472abcdbc4a)
+
+	* src/sampleconf/recoll.conf.in:
+	add commented entries for daem*
+
+2007-08-07 08:45 +0000  dockes    (ad6dad566902)
+
+	* src/qtgui/rclmain_w.cpp:
+	*** empty log message ***
+
+2007-08-07 08:42 +0000  dockes    (2040417c73e4)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp:
+	qt3 adjustments
+
+2007-08-07 08:26 +0000  dockes    (55c7dc79c190)
+
+	* src/aspell/rclaspell.cpp, src/sampleconf/recoll.conf.in:
+	*** empty log message ***
+
+2007-08-05 05:55 +0000  dockes    (3acd192c01d1)
+
+	* src/utils/conftree.h:
+	comments
+
+2007-08-05 05:49 +0000  dockes    (afee970ae166)
+
+	* src/utils/conftree.h:
+	*** empty log message ***
+
+2007-08-04 07:22 +0000  dockes    (9afb2050f462)
+
+	* src/utils/conftree.cpp, src/utils/conftree.h:
+	Allow updates in confstacks
+
+2007-08-03 07:50 +0000  dockes    (28ae2e572dcf)
+
+	* src/utils/Makefile, src/utils/conftree.cpp, src/utils/conftree.h:
+	have conftree preserve comments and ordering
+
+2007-08-02 06:33 +0000  dockes    (4da8b2dbcaa6)
+
+	* src/qt4gui/recoll.qrc, src/qtgui/rclmain.ui,
+	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.pro.in,
+	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	added gotofirstpage action
+
+2007-08-01 10:04 +0000  dockes    (c91831fab8a0)
+
+	* src/qtgui/guiutils.h, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h, src/qtgui/ssearch_w.cpp,
+	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h,
+	src/rcldb/stemdb.cpp, src/rcldb/stemdb.h:
+	Allow stem expansion for several (all) stemming languages at a time
+
+2007-08-01 07:55 +0000  dockes    (5d13d87e6e14)
+
+	* src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
+	src/qtgui/rclmain_w.h, src/qtgui/uiprefs_w.cpp,
+	src/qtgui/uiprefs_w.h:
+	allow setting stemlang from prefs menu
+
+2007-07-20 14:50 +0000  dockes    (573069870fd4)
+
+	* src/configure, src/configure.ac:
+	check for uic3 during qt4 configure
+
+2007-07-20 14:43 +0000  dockes    (32ae47904cca)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	preview: dont search for anchors if we have none
+
+2007-07-20 14:32 +0000  dockes    (eac614c9a725)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	*** empty log message ***
+
+2007-07-20 11:44 +0000  dockes    (6133f68f886f)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
+	factorize previewNext/Prev
+
+2007-07-20 11:38 +0000  dockes    (4dfc3942351a)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
+	more preview window interface cleanup
+
+2007-07-20 10:55 +0000  dockes    (d57bd5e6cb2d)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
+	src/qtgui/rclmain_w.cpp:
+	cleaned up preview window interface
+
+2007-07-14 16:53 +0000  dockes    (35087158d61f)
+
+	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
+	src/mk/AIX, src/mk/Darwin, src/mk/Linux, src/mk/SunOS,
+	src/utils/execmd.cpp:
+	handle putenv arg constness in configure
+
+2007-07-13 10:24 +0000  dockes    (98774298901d)
+
+	* src/INSTALL, src/README, src/doc/man/recoll.conf.5,
+	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts,
+	website/BUGS.txt, website/CHANGES.txt, website/download.html:
+	*** empty log message ***
+
+2007-07-13 07:17 +0000  dockes    (d2c5a6098bbd)
+
+	* src/doc/user/docbook.css, src/doc/user/usermanual.sgml:
+	1.9 changes
+
+2007-07-13 07:10 +0000  dockes    (2569115962c0)
+
+	* src/qtgui/uiprefs.ui:
+	msg
+
+2007-07-13 07:00 +0000  dockes    (2bd0371b8e12)
+
+	* src/qtgui/plaintorich.cpp:
+	adjust term beacon for better finding ?
+
+2007-07-13 06:31 +0000  dockes    (f7d41e95166c)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
+	src/qtgui/rclmain_w.cpp:
+	better handle preview close during load
+
+2007-07-12 17:28 +0000  dockes    (5b6f1204d077)
+
+	* src/rcldb/rcldb.cpp:
+	*** empty log message ***
+
+2007-07-12 17:13 +0000  dockes    (9345d3db5ff2)
+
+	* src/filters/rclpdf:
+	dont use anchored regexps for stripping whitespace, ubuntu mawk
+	ignores the anchor
+
+2007-07-12 13:41 +0000  dockes    (1fb4e582fe5b)
+
+	* src/utils/cancelcheck.h:
+	*** empty log message ***
+
+2007-07-12 10:53 +0000  dockes    (eb352f6c17ae)
+
+	* src/index/rclmonrcv.cpp, src/utils/fstreewalk.cpp,
+	src/utils/fstreewalk.h:
+	monitor: dont add watch on created dir if in skippedXXX
+
+2007-07-12 10:13 +0000  dockes    (d55862505674)
+
+	* src/ChangeLog, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
+	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
+	fix v1.8 default format string if we find it
+
+2007-07-12 08:34 +0000  dockes    (b69b14b67cd2)
+
+	* src/rcldb/rcldb.cpp:
+	use uniform code for Xapian exception catching + catch a few more,
+	esp. databaseModified cases
+
+2007-07-12 08:23 +0000  dockes    (ffe9a12f9237)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/reslist.cpp,
+	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
+	icon now part of paragraph format
+
+2007-07-11 10:05 +0000  dockes    (a8d4da32f304)
+
+	* src/qtgui/reslist.cpp:
+	dont create popup in irrelevant areas
+
+2007-07-10 09:24 +0000  dockes    (993776d69bab)
+
+	* src/sampleconf/recoll.conf.in:
+	idxflushnb default 10
+
+2007-07-10 09:23 +0000  dockes    (e800d4e4d1de)
+
+	* src/doc/man/recollindex.1, src/index/indexer.cpp,
+	src/index/indexer.h, src/index/recollindex.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/rcldb.h:
+	recollindex -l
+
+2007-07-10 05:44 +0000  dockes    (7247df0336ab)
+
+	* src/sampleconf/recoll.conf.in:
+	*** empty log message ***
+
+2007-07-09 17:21 +0000  dockes    (ef8eddb1b94a)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-07-01 06:52 +0000  dockes    (03cb707d9122)
+
+	* src/filters/rclid3: new file.
+	* src/filters/rclid3, src/sampleconf/mimeconf, src/sampleconf/mimemap,
+	src/sampleconf/mimeview:
+	audio tags support improvement: flac+ogg. use FORPREVIEW
+
+2007-06-26 17:07 +0000  dockes    (ec5b66db8aea)
+
+	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
+	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
+	src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-06-26 16:58 +0000  dockes    (34658791397a)
+
+	* *** empty log message ***
+
+2007-06-26 16:58 +0000  dockes    (26a811724423)
+
+	* packaging/rpm/recollCooker.spec, website/fr/features.html,
+	website/mario.png, website/perfs.html, website/smile.png: new file.
+	* packaging/rpm/recollCooker.spec, src/doc/user/usermanual.sgml,
+	website/BUGS.txt, website/CHANGES.txt, website/credits.html,
+	website/doc.html, website/download.html, website/features.html,
+	website/fr/features.html, website/index.html.en,
+	website/index.html.fr, website/mario.png, website/perfs.html,
+	website/rclidxfmt.html, website/smile.png, website/styles/style.css:
+	*** empty log message ***
+
+2007-06-26 16:09 +0000  dockes    (d4a3058d613e)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h:
+	comments
+
+2007-06-26 16:08 +0000  dockes    (7115d37ab33d)
+
+	* src/configure, src/configure.ac, src/mk/Darwin,
+	src/qtgui/reslist.cpp, src/recollinstall.in:
+	get things to sort of compile / install on macosx
+
+2007-06-26 15:38 +0000  dockes    (02621fd62ca0)
+
+	* src/ChangeLog: new file.
+	* src/ChangeLog:
+	*** empty log message ***
+
+2007-06-26 11:59 +0000  dockes    (51061217635d)
+
+	* src/excludefile, src/makesrcdist.sh:
+	small mkdist fixes
+
+2007-06-25 18:31 +0000  dockes    (5f173fcd227f)
+
+	* src/INSTALL, src/README:
+	*** empty log message ***
+
+2007-06-25 10:25 +0000  dockes    (048658cd678b)
+
+	* src/rcldb/rcldb.cpp:
+	simplified and hopefully improved abstract generation
+
+2007-06-25 10:13 +0000  dockes    (14ecb9d719e7)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/reslist.cpp:
+	plaintorich: only setup beacons if needed
+
+2007-06-22 06:14 +0000  dockes    (0584daa67e7c)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/query/wasatorcl.cpp, src/rcldb/rcldb.cpp,
+	src/rcldb/searchdata.cpp, src/sampleconf/mimeconf:
+	handle mime: and ext: in qlang
+
+2007-06-21 11:56 +0000  dockes    (e5102468f77e)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	slightly reorganized Db::close/~Db code
+
+2007-06-21 11:14 +0000  dockes    (e360a50fdaa5)
+
+	* src/common/rclconfig.cpp:
+	beware of unsigneds diffs when comparing to 0 !
+
+2007-06-20 13:16 +0000  dockes    (e515c5541bd4)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/rclmain.ui,
+	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
+	src/query/history.cpp, src/query/history.h:
+	menu entry to reset document history
+
+2007-06-19 16:19 +0000  dockes    (675d2fed7a32)
+
+	* src/qtgui/rclmain_w.cpp, src/qtgui/sort_w.cpp:
+	fix sort state restoration which didnt work
+
+2007-06-19 15:48 +0000  dockes    (36fa1c12d616)
+
+	* src/rcldb/rcldb.cpp:
+	try to better print delete exception messages
+
+2007-06-19 15:47 +0000  dockes    (304862edc545)
+
+	* src/query/xadump.cpp:
+	option X
+
+2007-06-19 15:47 +0000  dockes    (23a728d3cdd7)
+
+	* src/query/recollq.cpp:
+	compile
+
+2007-06-19 12:27 +0000  dockes    (5ee1b5e9168e)
+
+	* src/internfile/internfile.cpp, src/internfile/internfile.h:
+	get test driver to compile
+
+2007-06-19 12:17 +0000  dockes    (8974a52d2baa)
+
+	* src/internfile/htmlparse.h, src/internfile/mh_html.cpp,
+	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h:
+	renamed the html charset values to stick to omega usage
+
+2007-06-19 10:28 +0000  dockes    (e66870aeadb6)
+
+	* src/internfile/htmlparse.cpp, src/internfile/htmlparse.h,
+	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h:
+	updated html parser to omega 1.0.1 + moved entity decoder to
+	myhtmlparse to minimize amount of diffs
+
+2007-06-19 08:36 +0000  dockes    (e2533617731d)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/internfile/internfile.cpp, src/internfile/mh_html.cpp,
+	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h,
+	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp, src/query/docseq.h,
+	src/query/docseqdb.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
+	src/rcldb/rcldoc.h, src/rcldb/searchdata.cpp,
+	src/sampleconf/mimeconf:
+	added open-ended field name handling
+
+2007-06-19 07:52 +0000  dockes    (73ccb629ad66)
+
+	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
+	src/index/csguess.cpp, src/utils/transcode.cpp:
+	added test for iconv parm 2 constness
+
+2007-06-18 13:04 +0000  dockes    (bb1262134776)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp,
+	src/sampleconf/mimeconf:
+	implement dynamic field name to prefix translation, query side
+
+2007-06-15 11:41 +0000  dockes    (5eccc05a2ae7)
+
+	* src/filters/rclabw, src/filters/rclsoff, src/sampleconf/mimeconf,
+	src/sampleconf/mimemap, src/sampleconf/mimeview:
+	added abiword + some oofice cleanup
+
+2007-06-15 09:25 +0000  dockes    (f5b1666a10e6)
+
+	* src/filters/rclabw: new file.
+	* src/filters/rclabw:
+	*** empty log message ***
+
+2007-06-14 08:20 +0000  dockes    (dc698e7b3c84)
+
+	* src/rcldb/rcldb.cpp:
+	removed the "weak" date, not used and not in omega anymore
+
+2007-06-13 17:03 +0000  dockes    (3d509dbc275c)
+
+	* src/qtgui/reslist.cpp:
+	textedit autext sometimes switched to plain at eol?
+
+2007-06-12 13:31 +0000  dockes    (793abec1cee4)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/preview_w.cpp,
+	src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp,
+	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	somewhat fixed qt4 selection problems
+
+2007-06-12 10:33 +0000  dockes    (261ca6c11087)
+
+	* src/qtgui/ssearch_w.cpp:
+	adjust event handling for qt4, get esc-spc to work
+
+2007-06-12 10:32 +0000  dockes    (97c9f158e297)
+
+	* src/qtgui/plaintorich.cpp:
+	comments
+
+2007-06-12 08:50 +0000  dockes    (28d503078074)
+
+	* src/qtgui/rclmain_w.cpp:
+	*** empty log message ***
+
+2007-06-12 08:46 +0000  dockes    (d3f305e57522)
+
+	* src/query/recollq.cpp:
+	getMainConfig
+
+2007-06-11 08:33 +0000  dockes    (5542196b466a)
+
+	* src/qtgui/rclmain_w.cpp:
+	set busy cursor while search runs
+
+2007-06-11 05:51 +0000  dockes    (bf5090aed2fd)
+
+	* src/Makefile.in:
+	*** empty log message ***
+
+2007-06-11 05:49 +0000  dockes    (9327b736d7ff)
+
+	* src/Makefile.in, src/qt4gui/uifrom3:
+	*** empty log message ***
+
+2007-06-11 05:45 +0000  dockes    (cbb602782461)
+
+	* src/desktop/recoll.png, src/desktop/recoll.xcf: new file.
+	* src/desktop/recoll-searchgui.png, src/desktop/recoll-searchgui.xcf:
+	deleted file.
+	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
+	searchgui.png, src/desktop/recoll-searchgui.xcf,
+	src/desktop/recoll.png, src/desktop/recoll.xcf,
+	src/makestaticdist.sh, src/recollinstall.in:
+	icon named recoll.png
+
+2007-06-11 05:38 +0000  dockes    (9268fba2c65c)
+
+	* src/index/indexer.cpp:
+	changed level of missing helpers message
+
+2007-06-10 12:26 +0000  dockes    (f5b6dcd36de0)
+
+	* src/mk/OpenBSD: new file.
+	* src/mk/OpenBSD:
+	*** empty log message ***
+
+2007-06-08 16:47 +0000  dockes    (96f2807957dd)
+
+	* src/common/rclconfig.h, src/index/indexer.cpp,
+	src/index/recollindex.cpp, src/mk/FreeBSD, src/qtgui/main.cpp,
+	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	added file system usage check
+
+2007-06-08 16:46 +0000  dockes    (0c11deb1a678)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-06-08 16:46 +0000  dockes    (4f2c0d45e15b)
+
+	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
+	searchgui.png, src/desktop/recoll-searchgui.xcf:
+	new icon
+
+2007-06-08 16:05 +0000  dockes    (6835d2fbb56c)
+
+	* src/rcldb/rcldb.h:
+	comments and ordering
+
+2007-06-08 15:30 +0000  dockes    (aeffac1f3f2d)
+
+	* src/utils/pathut.cpp, src/utils/pathut.h:
+	fsocc
+
+2007-06-08 14:01 +0000  dockes    (7c47d8aae3cc)
+
+	* src/filters/rclkwd: new file.
+	* src/filters/rclkwd, src/sampleconf/mimeview:
+	kword support
+
+2007-06-08 13:51 +0000  dockes    (53a1012a564f)
+
+	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
+	src/filters/rclgaim, src/filters/rcljpeg, src/filters/rcllyx,
+	src/filters/rclman, src/filters/rclmedia, src/filters/rclpdf,
+	src/filters/rclppt, src/filters/rclps, src/filters/rclrtf,
+	src/filters/rclscribus, src/filters/rclsoff, src/filters/rclxls,
+	src/filters/recfiltcommon, src/sampleconf/mimeconf,
+	src/sampleconf/mimemap:
+	kword support
+
+2007-06-08 12:33 +0000  dockes    (a56bc180327b)
+
+	* src/query/recollq.cpp:
+	added stopfile parameter
+
+2007-06-08 12:32 +0000  dockes    (7b3710f69cd0)
+
+	* src/filters/rcljpeg: new file.
+	* src/filters/rcljpeg, src/sampleconf/mimeconf:
+	rcljpeg
+
+2007-06-08 12:31 +0000  dockes    (0b20447d105e)
+
+	* src/common/rclconfig.cpp:
+	improve message about bad config
+
+2007-06-02 08:30 +0000  dockes    (dfa3e5682035)
+
+	* src/rcldb/Makefile, src/rcldb/stoplist.cpp, src/rcldb/stoplist.h:
+	new file.
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/index/indexer.cpp, src/lib/Makefile, src/lib/mkMake,
+	src/qtgui/main.cpp, src/rcldb/Makefile, src/rcldb/rcldb.cpp,
+	src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/stoplist.cpp,
+	src/rcldb/stoplist.h, src/utils/readfile.cpp, src/utils/readfile.h:
+	minimal experimental stopword functionality
+
+2007-06-01 05:44 +0000  dockes    (b9f3d4b61852)
+
+	* src/qtgui/preview_w.cpp:
+	preview: space and backspace bound to pgdown/pgup
+
+2007-05-30 12:31 +0000  dockes    (105744d9f609)
+
+	* src/index/indexer.cpp, src/internfile/mh_html.cpp,
+	src/internfile/mh_html.h, src/qtgui/plaintorich.cpp,
+	src/query/xadump.cpp, src/utils/transcode.cpp:
+	improve transcode error printing
+
+2007-05-30 12:30 +0000  dockes    (d4fa167018eb)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-05-30 12:30 +0000  dockes    (6027fd8afb12)
+
+	* src/rcldb/rcldb.cpp:
+	improve add_document error message printing
+
+2007-05-30 12:29 +0000  dockes    (234dc300c26b)
+
+	* src/qtgui/reslist.cpp, src/qtgui/reslist.h:
+	escape possibly not html-safe text
+
+2007-05-24 09:35 +0000  dockes    (ec684a070c43)
+
+	* src/rcldb/stemdb.cpp:
+	comment
+
+2007-05-24 07:48 +0000  dockes    (deedeff93a6e)
+
+	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/sort_w.cpp,
+	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
+	optionally remember sorting state between invocations
+
+2007-05-24 07:47 +0000  dockes    (e6bb3bced970)
+
+	* src/configure, src/configure.ac, src/qt4gui/uifrom3:
+	make uifrom3 a makefile
+
+2007-05-23 09:19 +0000  dockes    (4f9ab7436818)
+
+	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
+	src/qtgui/preview.ui, src/qtgui/preview_w.cpp,
+	src/qtgui/preview_w.h:
+	in preview window if search line empty look for search terms
+
+2007-05-23 08:29 +0000  dockes    (644c4e20106b)
+
+	* src/internfile/internfile.cpp:
+	*** empty log message ***
+
+2007-05-23 08:28 +0000  dockes    (1927522b5826)
+
+	* src/common/rclinit.cpp, src/utils/execmd.cpp:
+	cant block sigcld globally cause qt needs it
+
+2007-05-22 08:33 +0000  dockes    (2c0d94ae674a)
+
+	* src/internfile/internfile.cpp, src/internfile/mh_html.cpp:
+	let email attachments inherit date and author from parent message
+
+2007-05-22 07:40 +0000  dockes    (fc644359e793)
+
+	* src/index/indexer.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	implemented adjustable indexing flush threshold
+
+2007-05-21 14:26 +0000  dockes    (d70d7b6988f0)
+
+	* src/qtgui/rclmain_w.cpp:
+	reopen db for each search during query
+
+2007-05-21 13:30 +0000  dockes    (7f65a405e028)
+
+	* src/common/rclinit.cpp, src/common/rclinit.h,
+	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
+	src/index/recollindex.cpp, src/qtgui/idxthread.cpp,
+	src/qtgui/main.cpp, src/rcldb/rcldb.cpp, src/utils/execmd.cpp,
+	src/utils/execmd.h:
+	make sure signals are only handled by the main thread. Fix bus error
+	on rclmon exit (double delete)
+
+2007-05-21 12:03 +0000  dockes    (7af2d0c361be)
+
+	* src/utils/smallut.h:
+	*** empty log message ***
+
+2007-05-21 09:00 +0000  dockes    (9ee50650bd6f)
+
+	* src/index/indexer.cpp, src/index/rclmonprc.cpp:
+	better handle aspell errors: dont exit from monitor on aux db
+	creation failure, and dont retry forever
+
+2007-05-21 07:24 +0000  dockes    (53f18ed9c2f8)
+
+	* src/VERSION, src/configure, src/configure.ac,
+	src/doc/user/usermanual.sgml, src/qt4gui/uifrom3,
+	src/sampleconf/recoll.conf.in:
+	removed --enable-qt4, rely on qmake output instead
+
+2007-05-21 06:46 +0000  dockes    (d6267bb0e30f)
+
+	* website/BUGS.txt, website/CHANGES.txt, website/devel.html,
+	website/doc.html, website/download.html, website/index.html.en,
+	website/index.html.fr:
+	*** empty log message ***
+
+2007-05-19 07:32 +0000  dockes    (cbbd4158e0a8)
+
+	* website/doc.html: new file.
+	* website/doc.html:
+	*** empty log message ***
+
+2007-05-18 12:05 +0000  dockes    (75610b300ee1 [RECOLL_1_8_2])
+
+	* src/recollinstall.in:
+	qt4 install glitches
+
+2007-05-18 11:16 +0000  dockes    (c9a0be6210be)
+
+	* src/README:
+	*** empty log message ***
+
+2007-05-18 07:49 +0000  dockes    (eaf500145dd5)
+
+	* src/VERSION:
+	1.8.2
+
+2007-05-18 07:49 +0000  dockes    (fc64434e87c0)
+
+	* packaging/debian/changelog, tests/runtests.sh, website/BUGS.txt,
+	website/CHANGES.txt, website/download.html:
+	*** empty log message ***
+
+2007-05-18 07:41 +0000  dockes    (6bec0784b8fd)
+
+	* src/doc/user/usermanual.sgml:
+	doc fix
+
+2007-05-18 07:41 +0000  dockes    (022d354a0a2f)
+
+	* src/sampleconf/recoll.conf.in:
+	add .beagle to stops
+
+2007-05-18 07:41 +0000  dockes    (451a13663a00)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/stemdb.cpp:
+	change method name deprecated in xap 1.0
+
+2007-05-18 07:40 +0000  dockes    (54bfc83a6186)
+
+	* src/query/Makefile:
+	*** empty log message ***
+
+2007-05-18 07:40 +0000  dockes    (ef599af3e2e7)
+
+	* src/configure.ac:
+	use $libdir instead of /usr/lib (64bits machs)
+
+2007-05-16 11:28 +0000  dockes    (2cced3d0aa32)
+
+	* src/qtgui/i18n/recoll_it.ts:
+	*** empty log message ***
+
+2007-04-22 07:36 +0000  dockes    (8628fca949e7)
+
+	* src/qtgui/i18n/recoll_de.ts: new file.
+	* src/qtgui/i18n/recoll_de.ts:
+	*** empty log message ***
+
+2007-03-28 19:30 +0000  dockes    (51c5bdb227cd)
+
+	* website/BUGS.txt, website/download.html, website/index.html.en,
+	website/index.html.fr:
+	*** empty log message ***
+
+2007-03-08 12:24 +0000  dockes    (0efcbb1564f2)
+
+	* packaging/FreeBSD/recoll/Makefile,
+	packaging/FreeBSD/recoll/distinfo:
+	1.8.1
+
+2007-03-08 12:04 +0000  dockes    (813c82bcc951 [RECOLL_1_8_1])
+
+	* packaging/FreeBSD/recoll/Makefile,
+	packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg-
+	plist, packaging/debian/changelog, packaging/rpm/recoll.spec,
+	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
+	src/VERSION, src/makestaticdist.sh, website/BUGS.txt,
+	website/CHANGES.txt, website/download.html:
+	version 1.8.1 ?
+
+2007-02-20 09:30 +0000  dockes    (817cdab71c1c [RECOLL_1_8_0])
+
+	* src/recollinstall.in:
+	go back to not using xdg
+
+2007-02-20 07:57 +0000  dockes    (d1f1b31e4a58)
+
+	* website/index.html.en, website/index.html.fr: new file.
+	* website/index.html: deleted file.
+	* packaging/debian/changelog, website/BUGS.txt, website/CHANGES.txt,
+	website/credits.html, website/download.html, website/features.html,
+	website/index.html, website/index.html.en, website/index.html.fr:
+	*** empty log message ***
+
+2007-02-20 07:43 +0000  dockes    (1f4b07f4cb62)
+
+	* src/qtgui/recoll.pro.in:
+	*** empty log message ***
+
+2007-02-20 07:33 +0000  dockes    (dc922603c639)
+
+	* src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
+	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
+	*** empty log message ***
+
+2007-02-20 07:19 +0000  dockes    (d6b63dc759cd)
+
+	* src/INSTALL, src/README:
+	*** empty log message ***
+
+2007-02-19 18:15 +0000  dockes    (a1331ff143f7)
+
+	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
+	make shift-arrow in preview work with qt4 and avoid reentrancy while
+	loading a file
+
+2007-02-19 18:14 +0000  dockes    (66c79bcff30e)
+
+	* src/utils/execmd.cpp:
+	block sigcld, it sometimes causes eintrs during the select() call
+
+2007-02-19 18:05 +0000  dockes    (db9e1830a040)
+
+	* src/internfile/internfile.cpp:
+	check file name not empty on return from uncomp exec
+
+2007-02-19 16:28 +0000  dockes    (19982a948347)
+
+	* src/qtgui/spell_w.cpp:
+	stemming language choice was not observed in term explorer
+
+2007-02-19 16:10 +0000  dockes    (26815f6c7ce0)
+
+	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
+	cleanup ign file types handling/saving
+
+2007-02-14 15:02 +0000  dockes    (714300cb7780)
+
+	* tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
+	tests/html/html.txt, tests/images/images.sh,
+	tests/images/images.txt, tests/koi8r/koi8r.sh,
+	tests/koi8r/koi8r.txt, tests/mail/mail.sh, tests/mail/mail.txt,
+	tests/notypes/notypes.sh, tests/notypes/notypes.txt,
+	tests/rfc2231/rfc2231.sh, tests/rfc2231/rfc2231.txt,
+	tests/special/special.sh, tests/special/special.txt,
+	tests/txt/txt.sh, tests/txt/txt.txt, tests/utf8/utf8.sh,
+	tests/utf8/utf8.txt: new file.
+	* tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
+	tests/html/html.txt, tests/images/images.sh,
+	tests/images/images.txt, tests/koi8r/koi8r.sh,
+	tests/koi8r/koi8r.txt, tests/lyx/lyx.txt, tests/mail/mail.sh,
+	tests/mail/mail.txt, tests/notypes/notypes.sh,
+	tests/notypes/notypes.txt, tests/rfc2231/rfc2231.sh,
+	tests/rfc2231/rfc2231.txt, tests/special/special.sh,
+	tests/special/special.txt, tests/txt/txt.sh, tests/txt/txt.txt,
+	tests/utf8/utf8.sh, tests/utf8/utf8.txt:
+	*** empty log message ***
+
+2007-02-14 11:52 +0000  dockes    (b3f3859ce5e5)
+
+	* tests/boolean/boolean.sh, tests/boolean/boolean.txt,
+	tests/delete/delete.sh, tests/delete/delete.txt,
+	tests/dirwithblanks/dirwithblanks.sh,
+	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
+	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
+	tests/lyx/lyx.sh, tests/lyx/lyx.txt, tests/media/media.sh,
+	tests/media/media.txt, tests/msword/msword.sh,
+	tests/msword/msword.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
+	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
+	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
+	tests/ppt/ppt.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
+	tests/scribus/scribus.sh, tests/scribus/scribus.txt,
+	tests/xls/xls.sh, tests/xls/xls.txt: new file.
+	* tests/Maildir1/Maildir1.txt, tests/andor/andor.txt,
+	tests/badsuffs1/badsuffs1.txt, tests/boolean/boolean.sh,
+	tests/boolean/boolean.txt, tests/delete/delete.sh,
+	tests/delete/delete.txt, tests/dirwithblanks/dirwithblanks.sh,
+	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
+	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
+	tests/lyx/lyx.sh, tests/lyx/lyx.txt, tests/media/media.sh,
+	tests/media/media.txt, tests/msword/msword.sh,
+	tests/msword/msword.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
+	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
+	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
+	tests/ppt/ppt.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
+	tests/scribus/scribus.sh, tests/scribus/scribus.txt,
+	tests/shared.sh, tests/skipped/skipped.sh,
+	tests/skipped/skipped.txt, tests/xls/xls.sh, tests/xls/xls.txt:
+	*** empty log message ***
+
+2007-02-14 10:10 +0000  dockes    (04c3156fd4dd)
+
+	* src/doc/user/usermanual.sgml, src/makestaticdist.sh,
+	src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
+	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
+	src/qtgui/uiprefs_w.cpp, src/recollinstall.in,
+	src/sampleconf/mimeview:
+	add user pref to use xdg-open for all document edits
+
+2007-02-14 10:09 +0000  dockes    (7886dd99d419)
+
+	* src/rcldb/rcldb.cpp:
+	during indexing use simple file name as title if this is empty. This
+	allows storing the sfn for subdocs for which the url sfn doesnt make
+	sense as title
+
+2007-02-14 10:08 +0000  dockes    (fb42e10e5a7b)
+
+	* src/query/recollq.cpp:
+	adjust format to help the test set scripts
+
+2007-02-14 08:54 +0000  dockes    (5e02666b38db)
+
+	* src/desktop/xdg-utils-1.0.1/scripts/xdg-open: new file.
+	* src/desktop/xdg-utils-1.0.1/scripts/xdg-open:
+	*** empty log message ***
+
+2007-02-14 08:16 +0000  dockes    (eb0fd52ef15a)
+
+	* tests/Maildir/Maildir.sh, tests/Maildir/Maildir.txt,
+	tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
+	tests/andor/andor.sh, tests/andor/andor.txt,
+	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
+	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
+	tests/runtests.sh, tests/shared.sh, tests/skipped/skipped.sh,
+	tests/skipped/skipped.txt: new file.
+	* tests/Maildir/Maildir.sh, tests/Maildir/Maildir.txt,
+	tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
+	tests/andor/andor.sh, tests/andor/andor.txt,
+	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
+	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
+	tests/runtests.sh, tests/shared.sh, tests/skipped/skipped.sh,
+	tests/skipped/skipped.txt:
+	*** empty log message ***
+
+2007-02-13 10:58 +0000  dockes    (19c29e100995)
+
+	* src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp,
+	src/rcldb/searchdata.h:
+	propagate wasa nostem modifier
+
+2007-02-12 18:16 +0000  dockes    (bf3060f2e259)
+
+	* src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h:
+	add wasabi modifiers
+
+2007-02-12 18:14 +0000  dockes    (6ae625065d64)
+
+	* src/qtgui/guiutils.cpp:
+	dont set Helvetica as default font
+
+2007-02-08 17:05 +0000  dockes    (f23e18da0362)
+
+	* src/index/indexer.cpp, src/index/indexer.h,
+	src/internfile/internfile.cpp, src/internfile/internfile.h,
+	src/qtgui/preview_w.cpp, src/utils/smallut.cpp, src/utils/smallut.h:
+	improve handling of missing helpers messages
+
+2007-02-08 17:03 +0000  dockes    (f53e952b71cd)
+
+	* src/filters/rcldvi:
+	typos
+
+2007-02-08 12:25 +0000  dockes    (ba982598a66f)
+
+	* src/internfile/internfile.h, src/query/recollq.cpp:
+	clarify temp dir usage in internfile
+
+2007-02-08 09:03 +0000  dockes    (876ec27bd9c0)
+
+	* src/qtgui/reslist.cpp, src/qtgui/uiprefs_w.cpp,
+	src/qtgui/uiprefs_w.h:
+	qt4 compilation glitches
+
+2007-02-07 17:18 +0000  dockes    (2f05854b010a)
+
+	* src/filters/injectcommon.sh, src/filters/recfiltcommon: new file.
+	* src/filters/injectcommon.sh, src/filters/recfiltcommon:
+	*** empty log message ***
+
+2007-02-07 17:17 +0000  dockes    (39e4d9e07461)
+
+	* src/recoll.desktop, src/recoll.png, src/recoll.xcf: deleted file.
+	* src/recoll.desktop, src/recoll.png, src/recoll.xcf,
+	src/recollinstall.in:
+	use xdg scripts to install desktop file and icon
+
+2007-02-07 17:17 +0000  dockes    (3161a2dabc0a)
+
+	* src/common/rclconfig.cpp, src/doc/user/usermanual.sgml:
+	dont autocreate config specified with -c or RECOLL_CONFDIR
+
+2007-02-07 16:31 +0000  dockes    (f89cbedba93f)
+
+	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
+	searchgui.png, src/desktop/recoll-searchgui.xcf, src/desktop/xdg-
+	utils-1.0.1/LICENSE, src/desktop/xdg-utils-1.0.1/scripts/xdg-
+	desktop-menu, src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource:
+	new file.
+	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
+	searchgui.png, src/desktop/recoll-searchgui.xcf, src/desktop/xdg-
+	utils-1.0.1/LICENSE, src/desktop/xdg-utils-1.0.1/scripts/xdg-
+	desktop-menu, src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource,
+	src/query/recollq.cpp:
+	*** empty log message ***
+
+2007-02-07 16:31 +0000  dockes    (2494c5157c22)
+
+	* src/aspell/rclaspell.cpp:
+	improve db creation error message
+
+2007-02-07 12:00 +0000  dockes    (3c02ca709886)
+
+	* src/query/recollq.cpp: new file.
+	* src/query/Makefile, src/query/recollq.cpp, src/query/wasatorcl.cpp,
+	src/query/wasatorcl.h:
+	recollq
+
+2007-02-06 18:01 +0000  dockes    (1992c71741c0)
+
+	* src/index/indexer.cpp, src/internfile/internfile.cpp,
+	src/internfile/internfile.h, src/internfile/mh_exec.cpp,
+	src/qtgui/preview_w.cpp:
+	arrange for error info about missing helpers to trickle up to the
+	user
+
+2007-02-06 18:01 +0000  dockes    (d5e12cec5aeb)
+
+	* src/sampleconf/mimeconf, src/sampleconf/mimemap:
+	added config+filter for man pages
+
+2007-02-06 15:08 +0000  dockes    (ef2eef3c33e9)
+
+	* src/filters/rclman: new file.
+	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
+	src/filters/rclgaim, src/filters/rcllyx, src/filters/rclman,
+	src/filters/rclmedia, src/filters/rclpdf, src/filters/rclppt,
+	src/filters/rclps, src/filters/rclrtf, src/filters/rclscribus,
+	src/filters/rclsoff, src/filters/rclxls:
+	factored out filter script common code
+
+2007-02-06 14:18 +0000  dockes    (7812fc3157a4)
+
+	* src/common/rclconfig.cpp, src/utils/pathut.cpp, src/utils/pathut.h:
+	make sure the -c argument is turned absolute before use
+
+2007-02-06 10:19 +0000  dockes    (243d1fffdfb9)
+
+	* src/qtgui/ssearch_w.cpp:
+	no space in query -> phrase
+
+2007-02-06 10:18 +0000  dockes    (d1b8dd6a7182)
+
+	* src/qtgui/reslist.cpp:
+	try to make sure that the old reslist is cleared while searching
+
+2007-02-06 10:18 +0000  dockes    (24163d1804e5)
+
+	* src/qt4gui/uifrom3:
+	link images/ from qtgui to qt4gui
+
+2007-02-03 16:46 +0000  dockes    (d27849ad572f)
+
+	* website/styles/style.css:
+	*** empty log message ***
+
+2007-02-02 10:27 +0000  dockes    (3c82d463b36c)
+
+	* src/doc/user/usermanual.sgml:
+	add skippedPaths and daemSkippedPaths config variables
+
+2007-02-02 10:12 +0000  dockes    (0232602ba055)
+
+	* src/common/rclconfig.cpp, src/common/rclconfig.h,
+	src/index/indexer.cpp, src/index/rclmonrcv.cpp,
+	src/utils/fstreewalk.cpp:
+	add skippedPaths and daemSkippedPaths config variables
+
+2007-02-02 10:10 +0000  dockes    (12a2a255dedc)
+
+	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
+	sort and uniquify termMatch results out of stem expansion
+
+2007-02-02 10:09 +0000  dockes    (344b11ebced1)
+
+	* src/index/recollindex.cpp:
+	do x11 check between sleeping and starting in recollindex -m
+
+2007-02-02 10:06 +0000  dockes    (3a9bb20130c8)
+
+	* src/doc/user/usermanual-italian.html: new file.
+	* src/doc/user/usermanual-italian.html, src/qtgui/i18n/recoll_it.ts:
+	*** empty log message ***
+
+2007-02-02 10:06 +0000  dockes    (9a6092dbecea)
+
+	* src/lib/Makefile, src/lib/mkMake:
+	fix $(depth) usage for easier kio compilation
+
+2007-02-02 10:05 +0000  dockes    (a645eeae729a)
+
+	* src/doc/user/usermanual.sgml:
+	added config examples
+
+2007-02-02 10:01 +0000  dockes    (a0640e49ab3a)
+
+	* src/recollinstall.in:
+	removed old filter in examples cleanup
+
+2007-02-01 15:01 +0000  dockes    (db53657c868d)
+
+	* src/aspell/rclaspell.cpp, src/mk/localdefs.in:
+	use configure libdir to search for aspell lib (mainly for 64 bits
+	machines)
+
+2007-02-01 12:43 +0000  dockes    (7f3d33405e53)
+
+	* src/kde/kioslave/recoll/Makefile,
+	src/kde/kioslave/recoll/kio_recoll.cpp:
+	fixed kio compilation. Dont know if it works
+
+2007-01-30 11:39 +0000  dockes    (1aa8e8c3d93a)
+
+	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
+	src/filters/rclpdf, src/filters/rclps, src/filters/rclrtf,
+	src/filters/rclsoff:
+	hide awk BEGIN statements - make debian linda happy
+
+2007-01-29 13:51 +0000  dockes    (f207a83f0617)
+
+	* src/rcldb/searchdata.cpp:
+	more field name synonyms
+
+2007-01-25 15:50 +0000  dockes    (ba53fd450dc5)
+
+	* src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
+	better wildcards handling. Tuning of user term boosting
+
+2007-01-25 15:47 +0000  dockes    (026e24e9aafc)
+
+	* src/doc/user/usermanual.sgml:
+	*** empty log message ***
+
+2007-01-25 15:47 +0000  dockes    (31cd60d81a3a)
+
+	* src/rcldb/rcldb.cpp:
+	dont explicitely anchor regexp in termMatch
+
+2007-01-25 15:46 +0000  dockes    (8c7afe9df6fb)
+
+	* src/qtgui/ssearch_w.cpp:
+	Dont add auto phrase if there are wildcards
+
+2007-01-25 15:45 +0000  dockes    (d35369f54699)
+
+	* src/query/wasatorcl.cpp:
+	comment
+
+2007-01-25 15:40 +0000  dockes    (2d7b13ebd2c8)
+
+	* src/common/textsplit.cpp:
+	[] are also wildcard chars
+
+2007-01-25 12:04 +0000  dockes    (27310036f46c)
+
+	* src/qtgui/i18n/recoll_it.ts:
+	*** empty log message ***
+
+2007-01-25 08:27 +0000  dockes    (876d5192bdde)
+
+	* src/qtgui/i18n/recoll_it.ts: new file.
+	* src/qtgui/i18n/recoll_it.ts:
+	*** empty log message ***
+
+2007-01-24 12:40 +0000  dockes    (dd470677dbf2)
+
+	* src/qtgui/guiutils.cpp:
+	make AND the initial default for ssearch
+
+2007-01-24 11:20 +0000  dockes    (623c6533e0f0)
+
+	* src/qtgui/uiprefs.ui, src/qtgui/viewaction.ui:
+	change MyDialog and Form1 dialog captions
+
+2007-01-24 11:15 +0000  dockes    (9dc93d749ea8)
+
+	* src/filters/rclscribus:
+	transate \r to 
(for older scribus files) + +2007-01-24 11:00 +0000 dockes (7ea73b206760) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap: + scribus scd files + +2007-01-23 07:23 +0000 dockes (0f9e96c72d1c) + + * src/filters/rcllyx: + *** empty log message *** + +2007-01-23 07:22 +0000 dockes (5fc9550be90c) + + * src/filters/rcllyx: + *** empty log message *** + +2007-01-23 07:16 +0000 dockes (55734c5d16c2) + + * src/filters/rcllyx: + *** empty log message *** + +2007-01-23 07:14 +0000 dockes (dafabbcdaf1a) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/mimeview: + lyx filter + +2007-01-23 07:14 +0000 dockes (d5ac3c0cf64f) + + * src/filters/rcllyx: new file. + * src/filters/rcllyx: + lyx filter + +2007-01-22 16:34 +0000 dockes (e76e39a890d0) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap: + added scribus support + +2007-01-22 16:32 +0000 dockes (0b142f40e0c7) + + * src/filters/rclscribus: new file. + * src/filters/rclscribus: + added scribus support + +2007-01-21 16:41 +0000 dockes (8e06e0f7914e) + + * src/filters/rclsoff: + fix shell syntax for debian + +2007-01-19 15:22 +0000 dockes (084098d57a50) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, + src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h, + src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h, + src/query/docseqhist.h, src/query/sortseq.cpp, src/query/sortseq.h: + try to limit the places which use Rcl:: stuff + +2007-01-19 15:19 +0000 dockes (1d1bdf98f176) + + * src/rcldb/stemdb.cpp: + make sure that both the user term and the stem are in the expanded + list + +2007-01-19 10:32 +0000 dockes (757f49c23d93) + + * src/query/docseqdb.cpp, src/query/docseqdb.h, + src/query/docseqhist.cpp, src/query/docseqhist.h: new file. + * src/lib/Makefile, src/lib/mkMake, src/qtgui/rclmain_w.cpp, + src/qtgui/reslist.cpp, src/qtgui/ssearch_w.cpp, + src/query/docseq.cpp, src/query/docseq.h, src/query/docseqdb.cpp, + src/query/docseqdb.h, src/query/docseqhist.cpp, + src/query/docseqhist.h, src/query/sortseq.cpp, src/query/sortseq.h: + cleanup docseq, arrange things so that we can page reslist past the + initial result count estimate if there are more + +2007-01-19 10:23 +0000 dockes (d4ecd356406a) + + * src/rcldb/searchdata.cpp: + the relevance-boosted original term needs a prefix too + +2007-01-19 10:23 +0000 dockes (cacb9b50f1cf) + + * src/rcldb/rcldb.cpp: + adjust makeAbstract for prefixed terms + +2007-01-19 10:22 +0000 dockes (95d569102c37) + + * src/query/wasatorcl.cpp, src/query/wasatorcl.h: + add direct qstring to rcl function + +2007-01-18 14:23 +0000 dockes (157d8676b256) + + * src/utils/mimeparse.cpp: + debug msg + +2007-01-18 12:09 +0000 dockes (b0647b310dec) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/rcldb/searchdata.cpp: + handle wildcards in search terms + +2007-01-17 14:06 +0000 dockes (65d2617d690c) + + * src/query/Makefile, src/query/wasatorcl.cpp: + *** empty log message *** + +2007-01-17 13:53 +0000 dockes (82c00cf9d054) + + * src/internfile/internfile.cpp, src/internfile/mh_html.cpp, + src/internfile/mh_mail.cpp, src/internfile/myhtmlparse.cpp, + src/internfile/myhtmlparse.h, src/lib/Makefile, src/lib/mkMake, + src/query/Makefile, src/query/wasastringtoquery.cpp, + src/query/wasastringtoquery.h, src/query/wasatorcl.cpp, + src/rcldb/rcldb.cpp, src/rcldb/rcldoc.h, src/rcldb/searchdata.cpp, + src/rcldb/searchdata.h: + added field/prefixes for author and title + command line query + language + +2007-01-16 10:58 +0000 dockes (f56d8a303798) + + * src/sampleconf/recoll.conf.in: + add recollrc to skipped + +2007-01-16 10:58 +0000 dockes (a28d7ea5359b) + + * website/BUGS.txt, website/CHANGES.txt, website/download.html, + website/index.html: + 1.7.5 + +2007-01-16 10:58 +0000 dockes (83b10dc2e5ea) + + * src/bincimapmime/trbinc.cc, src/utils/debuglog.cpp: + wrong copyrights + +2007-01-16 10:56 +0000 dockes (e51d7ee21ffd) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/rpm/recoll.spec, + packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec: + 1.7.5 packaging + +2007-01-16 09:22 +0000 dockes (7f8fea3bed13) + + * packaging/debian/manpages: deleted file. + * packaging/debian/changelog, packaging/debian/control, + packaging/debian/copyright, packaging/debian/manpages, + packaging/debian/rules: + 2007-01-12 comments + +2007-01-15 19:16 +0000 dockes (740528a1cd7d) + + * packaging/debian/dirs: deleted file. + * packaging/debian/dirs: + *** empty log message *** + +2007-01-15 13:06 +0000 dockes (12e31e690f9e) + + * src/internfile/internfile.cpp, src/internfile/internfile.h: + dont stop processing a complex document on the first next_document + error: pop level and go on + +2007-01-15 13:03 +0000 dockes (6d3f8a71e602) + + * src/doc/user/usermanual.sgml: + *** empty log message *** + +2007-01-13 15:21 +0000 dockes (b04adc5188d5) + + * src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: + improved external index dialog with listview + +2007-01-13 14:41 +0000 dockes (f9567f0fed32) + + * src/query/xadump.cpp: + add option to dump raw terms + +2007-01-13 10:28 +0000 dockes (fc890008108f) + + * src/internfile/mh_mail.cpp: + handle multipart/signed + +2007-01-12 09:01 +0000 dockes (1782d39f9d4d) + + * src/qtgui/reslist.cpp: + Use sample from Rcl::Doc if makeAbstract() fails + +2007-01-12 06:42 +0000 dockes (8223a4aa9ad4) + + * packaging/debian/copyright: + include gpl statement + +2007-01-10 16:03 +0000 dockes (66247acdb470) + + * packaging/debian/changelog, packaging/debian/compat, + packaging/debian/control, packaging/debian/copyright, + packaging/debian/dirs, packaging/debian/docs, + packaging/debian/manpages, packaging/debian/menu, + packaging/debian/rules, packaging/debian/watch: new file. + * packaging/debian/changelog, packaging/debian/compat, + packaging/debian/control, packaging/debian/copyright, + packaging/debian/dirs, packaging/debian/docs, + packaging/debian/manpages, packaging/debian/menu, + packaging/debian/rules, packaging/debian/watch, src/Makefile.in, + src/VERSION: + *** empty log message *** + +2007-01-10 12:27 +0000 dockes (733bc11b5526) + + * packaging/FreeBSD/recoll/Makefile: + *** empty log message *** + +2007-01-09 15:34 +0000 dockes (9583ff723edf [RECOLL_1_7_3]) + + * packaging/rpm/recollfedora.spec: new file. + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist, + packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec, + packaging/rpm/recollmdk.spec: + 1.7.3 + +2007-01-09 14:39 +0000 dockes (f108471cd099) + + * website/BUGS.txt, website/CHANGES.txt, website/download.html: + 1.7.3 + +2007-01-09 07:25 +0000 dockes (e0c1d14a73c5) + + * src/VERSION: + *** empty log message *** + +2007-01-09 07:25 +0000 dockes (f06dbc019ff4) + + * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts: + french messages + +2007-01-08 15:21 +0000 dockes (906e56e99e81) + + * src/VERSION, src/qtgui/main.cpp: + initial indexation with gui would not work + +2007-01-08 13:00 +0000 dockes (44d2b5d58ac6 [RECOLL_1_7_1]) + + * src/VERSION: + 1.7.1 + +2007-01-08 12:43 +0000 dockes (2cb748432b10) + + * src/qtgui/advsearch.ui: + lost sizers? + +2007-01-08 10:11 +0000 dockes (67c4375292e5) + + * src/qtgui/rclmain_w.cpp: + fix the previous icon fix + +2007-01-08 10:01 +0000 dockes (8eb24fe9db4f) + + * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/reslist.cpp, src/qtgui/reslist.h: + reslist menu openParent opens containing folder if not a subdoc + +2007-01-08 09:40 +0000 dockes (b38401a650c3) + + * src/qtgui/uiprefs.ui: + fix resizing of prefs dialog + +2007-01-08 07:02 +0000 dockes (5a2fb87a2c55) + + * src/qtgui/rclmain_w.cpp: + get rid of messages about missing d_xxx images + +2007-01-08 07:01 +0000 dockes (8a2c6d2cba46) + + * src/qtgui/reslist.cpp: + synthetic abstracts not displayed + +2006-12-24 08:07 +0000 dockes (e42dca990bea [RECOLL_1_7_0]) + + * src/Makefile.in: + better cleanup -> 1.7.0 NOW + +2006-12-24 08:02 +0000 dockes (916d6e831996 [RECOLL_1_7_2]) + + * packaging/FreeBSD/recoll/pkg-plist, src/excludefile, + website/BUGS.txt, website/CHANGES.txt, website/download.html, + website/features.html, website/index.html, website/pics/index.html, + website/rclidxfmt.html: + 1.7.0 + +2006-12-24 07:53 +0000 dockes (b37a6e3566b9) + + * src/INSTALL, src/README, src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-12-24 07:40 +0000 dockes (69573fe97b89) + + * src/configure, src/configure.ac, src/doc/man/recollindex.1, + src/doc/user/usermanual.sgml, src/index/rclmon.h, + src/index/rclmonprc.cpp, src/index/recollindex.cpp: + option -x to disable x11 session monitoring + +2006-12-23 13:07 +0000 dockes (fb731b7d3ab1) + + * src/configure, src/configure.ac, src/index/Makefile, + src/index/rclmonprc.cpp, src/lib/Makefile, src/lib/mkMake, + src/mk/localdefs.in, src/utils/pathut.cpp: + x11 session end detection + +2006-12-23 12:23 +0000 dockes (00532204c17f) + + * src/utils/x11mon.cpp, src/utils/x11mon.h: new file. + * src/utils/Makefile, src/utils/x11mon.cpp, src/utils/x11mon.h: + *** empty log message *** + +2006-12-22 16:48 +0000 dockes (ee878b9d311e) + + * src/qt4gui/recoll.qrc, src/qtgui/rclmain.ui, + src/qtgui/rclmain_w.cpp, src/qtgui/spell_w.cpp: + get all icons out of .ui files to avoid qt4 startup messages + +2006-12-22 11:01 +0000 dockes (078acb3ab4fd) + + * src/doc/man/recollindex.1, src/doc/user/usermanual.sgml, + src/qtgui/spell_w.h: + *** empty log message *** + +2006-12-21 10:08 +0000 dockes (d36d26d5b5d5) + + * src/index/rclmonprc.cpp: + try to be more responsive to interruptions + +2006-12-21 09:22 +0000 dockes (818387de5d92) + + * src/index/indexer.cpp, src/index/rclmonrcv.cpp, + src/index/recollindex.cpp, src/sampleconf/mimemap, + src/utils/fstreewalk.cpp: + always skip indexing of confdir and dbdir. start index monitor with + normal indexing pass + +2006-12-21 09:21 +0000 dockes (13c7229ee6dc) + + * src/qtgui/advsearch.ui, src/qtgui/ssearchb.ui: + tooltips + +2006-12-21 08:22 +0000 dockes (c1e9892c3ba1) + + * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h: + add skipped paths + +2006-12-20 14:28 +0000 dockes (f580e9aa026a) + + * src/internfile/internfile.cpp: + msg + +2006-12-20 14:09 +0000 dockes (e3d7f975546f) + + * src/qtgui/preview_w.cpp: + try to improve error message for internfile failure + +2006-12-20 13:55 +0000 dockes (0a07075dd464) + + * src/qtgui/preview_w.cpp, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h: + reslist: added menu entry to see parent doc of attachment + +2006-12-20 13:12 +0000 dockes (733a59947cfb) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, + src/qtgui/guiutils.h, src/sampleconf/mimeconf: + mime categories + +2006-12-20 10:47 +0000 dockes (591625eb1d38) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-12-20 09:54 +0000 dockes (c563fb138893) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/doc/user/usermanual.sgml, src/index/mimetype.cpp: + changed stopsuffixes processing + +2006-12-20 09:41 +0000 dockes (64488c2687be) + + * src/index/recollindex.cpp: + opt -e + +2006-12-19 12:38 +0000 dockes (6d4a0c0f8cc3) + + * src/qtgui/spell_w.cpp: + qt4 + +2006-12-19 12:11 +0000 dockes (a3e7c86f79d7) + + * src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, + src/qtgui/ssearch_w.cpp, src/qtgui/viewaction.ui, + src/qtgui/viewaction_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/rcldb/searchdata.cpp, src/rcldb/stemdb.cpp, src/rcldb/stemdb.h, + src/utils/smallut.cpp, src/utils/smallut.h: + merge stemExpand into termExpand. return term frequencies from there + and display in spellW + +2006-12-19 08:40 +0000 dockes (3bbff3062a89) + + * src/common/rclconfig.cpp, src/index/indexer.cpp, + src/index/mimetype.cpp, src/index/mimetype.h, + src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mimehandler.cpp, src/qtgui/preview_w.cpp, + src/sampleconf/mimeconf, src/sampleconf/mimeview: + index directory names + +2006-12-19 07:48 +0000 dockes (7301c237649a) + + * src/qtgui/mtpics/folder.png: new file. + * src/qtgui/mtpics/folder.png: + *** empty log message *** + +2006-12-18 16:45 +0000 dockes (0a640477a752) + + * src/qt4gui/recoll.pro.in, src/qtgui/viewaction.ui, + src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h: + qt4 + +2006-12-18 12:06 +0000 dockes (5f17ab347621) + + * src/doc/user/usermanual.sgml, src/internfile/mh_mail.cpp, + src/utils/smallut.cpp, src/utils/smallut.h: + mh_mail needs to lowercase contentypes + +2006-12-18 12:05 +0000 dockes (03363b562546) + + * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h: + dblclick to edit in viewAction + +2006-12-16 15:39 +0000 dockes (a3027dd4b920) + + * src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mh_html.h, src/internfile/mh_mail.cpp, + src/internfile/mh_mail.h, src/internfile/mh_text.h, + src/internfile/mimehandler.h, src/qtgui/main.cpp, + src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h: + mail attachments sort of ok + +2006-12-16 15:31 +0000 dockes (7d335e595c2b) + + * src/utils/pathut.cpp, src/utils/pathut.h: + added TempFile class + +2006-12-16 15:30 +0000 dockes (89fed05a6ace) + + * src/internfile/Filter.h: + *** empty log message *** + +2006-12-16 15:30 +0000 dockes (5f74c84fa800) + + * src/index/indexer.cpp: + dont clobber utf8fn from filter + +2006-12-16 15:30 +0000 dockes (b5f77fb6530b) + + * src/common/rclconfig.cpp, src/common/rclconfig.h: + added getSuffixFromMimeType() + +2006-12-16 07:15 +0000 dockes (ef72575e285c) + + * src/internfile/Filter.h: + *** empty log message *** + +2006-12-15 16:33 +0000 dockes (df6232340341) + + * src/index/indexer.cpp, src/internfile/Filter.h, + src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, + src/internfile/mh_mail.h, src/internfile/myhtmlparse.h: + test data indexing result same terms as 1.6.3 + +2006-12-15 12:40 +0000 dockes (5156a319f219) + + * src/internfile/Filter.h, src/internfile/mh_mbox.cpp, + src/internfile/mh_mbox.h: new file. + * src/internfile/Filter.h, src/internfile/Makefile, + src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, + src/internfile/mh_html.cpp, src/internfile/mh_html.h, + src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, + src/internfile/mh_mbox.cpp, src/internfile/mh_mbox.h, + src/internfile/mh_text.cpp, src/internfile/mh_text.h, + src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h, src/internfile/myhtmlparse.h, + src/lib/Makefile, src/lib/mkMake, src/utils/smallut.cpp, + src/utils/smallut.h: + Dijon filters 1st step: mostly working needs check and optim + +2006-12-14 14:54 +0000 dockes (2f7d4fb90b31) + + * src/rcldb/rcldoc.h: new file. + * src/rcldb/rcldb.h, src/rcldb/rcldoc.h: + split rcldb.h -> rcldoc.h + +2006-12-14 13:53 +0000 dockes (839454238284) + + * src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp, + src/qtgui/viewaction_w.h, src/sampleconf/mimeview: new file. + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/doc/user/usermanual.sgml, src/index/indexer.cpp, + src/qtgui/preview_w.cpp, src/qtgui/rclmain_w.cpp, + src/qtgui/recoll.pro.in, src/qtgui/ssearch_w.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp, + src/qtgui/uiprefs_w.h, src/qtgui/viewaction.ui, + src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h, + src/recollinstall.in, src/sampleconf/mimeconf, + src/sampleconf/mimeview, src/utils/Makefile, src/utils/conftree.cpp, + src/utils/conftree.h, src/utils/execmd.cpp, src/utils/execmd.h, + src/utils/pathut.cpp, src/utils/pathut.h, src/utils/smallut.cpp, + src/utils/smallut.h: + created mimeview and the viewer conf edit dialog + +2006-12-13 09:13 +0000 dockes (ca4c21f5ad44) + + * src/common/rclconfig.cpp, src/internfile/internfile.cpp, + src/internfile/mh_exec.cpp, src/internfile/mimehandler.cpp: + move findFilter usage out of mh_exec + +2006-12-11 14:56 +0000 dockes (dd4f283c9753 [BEFORE_Dijon20061215]) + + * src/qtgui/plaintorich.cpp: + not calling textsplit with onlyspans improves highlighting + +2006-12-11 14:50 +0000 dockes (c6d552528f6c) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/mimetype.cpp, src/utils/smallut.cpp, src/utils/smallut.h: + rationalize stopsuffix list usage + +2006-12-11 09:05 +0000 dockes (87037320fddf) + + * packaging/FreeBSD/recoll/pkg-plist: + try to cleanup the share/icons tree + +2006-12-10 17:03 +0000 dockes (0d0fec69b4e4 [MAPSTRMAPSTRSTR]) + + * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, + src/query/wasatorcl.cpp, src/query/wasatorcl.h: + added sort and type specs parsing + +2006-12-08 17:18 +0000 dockes (9d443b2ad416) + + * src/query/wasatorcl.h: + 1st query + +2006-12-08 10:54 +0000 dockes (dc4914858b42) + + * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h: + *** empty log message *** + +2006-12-08 07:11 +0000 dockes (df1ce4c7c9bf) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/qtgui/ssearch_w.cpp: + only autophrase if query has several terms + +2006-12-08 06:45 +0000 dockes (6b96cd852343) + + * src/qtgui/ssearch_w.cpp: + make autophrase do the right thing: add a subclause, not modify the + query string + +2006-12-07 16:38 +0000 dockes (e0b7c11d4054) + + * src/query/qtry.cpp, src/query/qxtry.cpp: deleted file. + * src/query/Makefile, src/query/qtry.cpp, src/query/qxtry.cpp, + src/query/xadump.cpp: + removed qtry and merged qxtry into xadump + +2006-12-07 13:24 +0000 dockes (11f50dc2ced9) + + * src/rcldb/rcldb.cpp: + comment + +2006-12-07 13:14 +0000 dockes (0137bc80c8a5) + + * website/rclidxfmt.html: new file. + * website/rclidxfmt.html: + *** empty log message *** + +2006-12-07 13:02 +0000 dockes (e36e165c1055) + + * src/rcldb/rcldb.cpp: + comments + +2006-12-07 08:23 +0000 dockes (6bdb3421d1ca) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + plist: + 1.6.3 + +2006-12-07 08:06 +0000 dockes (2ca80dafce2a) + + * src/internfile/mh_mail.cpp: + fix bug with bad message "From " delimiter detection + +2006-12-07 07:07 +0000 dockes (92354b8e641a) + + * src/qtgui/rclmain_w.cpp, src/utils/mimeparse.h, + src/utils/smallut.cpp, src/utils/smallut.h: + fix pb with executing viewer for files with single-quotes in + pathnames + +2006-12-07 07:06 +0000 dockes (b415958c3148) + + * src/internfile/mh_mail.cpp: + fix bug with bad message "From " delimiter detection + +2006-12-05 15:25 +0000 dockes (451489717e47) + + * src/internfile/mh_mail.cpp: + use regexp to better discriminate From delimiter lines in mbox. + Avoid reading mboxes twice + +2006-12-05 15:23 +0000 dockes (282880e83069) + + * src/qtgui/advsearch.ui, src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h, + src/qtgui/sort.ui, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h: + avoid generating abstracts before theyre needed (ie: not during + sort). have the sort tools redisplay the results when sort criteria + are applied + +2006-12-05 15:18 +0000 dockes (069f87c83682) + + * src/query/sortseq.cpp, src/query/sortseq.h: + use refcntr to access docsequence + +2006-12-05 15:17 +0000 dockes (f7bad3e61904) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + expose abstract synthesis to let users decide when they want it done + +2006-12-05 15:17 +0000 dockes (57148c851c44) + + * src/rcldb/searchdata.h: + clauseCount + +2006-12-05 15:16 +0000 dockes (d6d5ee7b750b) + + * src/utils/refcntr.h: + fix pbs with empty object + +2006-12-04 09:56 +0000 dockes (1173f38c9de4) + + * src/configure, src/configure.ac, src/qtgui/advsearch_w.h, + src/qtgui/main.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/sort_w.h, src/qtgui/spell_w.h, + src/qtgui/ssearch_w.h, src/qtgui/uiprefs_w.h, src/utils/refcntr.h: + qt4 compiles and sort of works + +2006-12-04 09:49 +0000 dockes (00bc69d47f20) + + * src/qt4gui/recoll.qrc, src/qt4gui/uifrom3: new file. + * src/qt4gui/recoll.pro.in, src/qt4gui/recoll.qrc, src/qt4gui/uifrom3: + *** empty log message *** + +2006-12-04 08:17 +0000 dockes (c92f84765756) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/preview_w.cpp, + src/qtgui/preview_w.h, src/qtgui/sort_w.cpp, + src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs_w.cpp, + src/qtgui/uiprefs_w.h: + compiles (doesnt work) on qt4 + +2006-12-04 06:19 +0000 dockes (5a7d6794967e) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/main.cpp, + src/qtgui/preview.ui, src/qtgui/preview_w.h, src/qtgui/rclmain.ui, + src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/reslist.cpp, src/qtgui/reslist.h, + src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h, + src/qtgui/sort_w.h, src/qtgui/spell.ui, src/qtgui/spell_w.h, + src/qtgui/ssearch_w.h, src/qtgui/ssearchb.ui, src/qtgui/uiprefs_w.h: + qt4 ckpt + +2006-12-02 07:32 +0000 dockes (45564d318a93) + + * src/utils/idfile.cpp: + improved tests to check for mail + +2006-12-01 10:05 +0000 dockes (8c3b51bc117f) + + * src/query/xadump.cpp: + *** empty log message *** + +2006-11-30 18:12 +0000 dockes (e41c0db701ae) + + * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, + src/query/wasatorcl.cpp, src/query/wasatorcl.h: new file. + * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, + src/query/wasatorcl.cpp, src/query/wasatorcl.h: + *** empty log message *** + +2006-11-30 13:44 +0000 dockes (5ef831ae4659) + + * website/download.html: + *** empty log message *** + +2006-11-30 13:38 +0000 dockes (6e49658236c6) + + * src/qtgui/images/cancel.png, src/qtgui/images/close.png: new file. + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + plist, packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec, + src/README, src/aspell/rclaspell.cpp, src/doc/user/usermanual.sgml, + src/index/indexer.cpp, src/index/indexer.h, src/makesrcdist.sh, + src/makestaticdist.sh, src/mk/SunOS, src/qtgui/advsearch.ui, + src/qtgui/advsearch_w.cpp, src/qtgui/guiutils.cpp, + src/qtgui/guiutils.h, src/qtgui/i18n/recoll_fr.ts, + src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, + src/qtgui/images/cancel.png, src/qtgui/images/close.png, + src/qtgui/main.cpp, src/qtgui/plaintorich.cpp, + src/qtgui/plaintorich.h, src/qtgui/preview.ui, + src/qtgui/preview_w.cpp, src/qtgui/rclmain.ui, + src/qtgui/recoll.pro.in, src/qtgui/reslist.cpp, + src/qtgui/searchclause_w.cpp, src/qtgui/spell_w.cpp, + src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui, + src/rcldb/searchdata.cpp, src/recoll.desktop, src/recollinstall.in, + src/sampleconf/recoll.conf.in, src/utils/execmd.cpp, + src/utils/mimeparse.cpp, src/utils/smallut.cpp, website/BUGS.txt, + website/CHANGES.txt, website/download.html, website/features.html, + website/index.html: + merged 1.6 maint branch modifs up to MERGED_TO_TRUNK_20061130 + +2006-11-22 09:29 +0000 dockes (568c34cf75e9) + + * src/VERSION, website/BUGS.txt, website/CHANGES.txt, + website/credits.html, website/download.html: + *** empty log message *** + +2006-11-21 14:00 +0000 dockes (f247e019bf08 [RECOLL_1_6_0]) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-11-21 13:05 +0000 dockes (23604b23773d) + + * src/aspell/rclaspell.cpp, src/configure, src/configure.ac: + mdk 2006 aspell quirks + +2006-11-21 09:18 +0000 dockes (17597459707c) + + * packaging/FreeBSD/recoll/pkg-plist, packaging/rpm/recoll.spec, + packaging/rpm/recollmdk.spec, src/doc/user/usermanual.sgml, + src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts, website/BUGS.txt, website/CHANGES.txt, + website/copydocs, website/download.html, website/index.html: + *** empty log message *** + +2006-11-21 08:47 +0000 dockes (f434e776fec8) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/spell.ui, + src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, src/qtgui/uiprefs_w.cpp: + added stem expansion mode to term explorer + +2006-11-20 18:07 +0000 dockes (bc85af9f678c) + + * src/doc/man/recoll.conf.5, src/doc/man/recollindex.1, + src/doc/user/usermanual.sgml: + doc + +2006-11-20 17:46 +0000 dockes (28cb0d8c325a) + + * src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-11-20 17:06 +0000 dockes (9252428377e4) + + * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts: + *** empty log message *** + +2006-11-20 15:35 +0000 dockes (192c101b8b7c) + + * src/qtgui/advsearch.ui: + tooltip + +2006-11-20 15:29 +0000 dockes (73ca6e78a1dd) + + * src/filters/rclxls, src/utils/transcode.cpp: + *** empty log message *** + +2006-11-20 15:28 +0000 dockes (9bb875d3bfcf) + + * src/rcldb/rcldb.cpp: + clear abstract if its only ... + +2006-11-20 15:28 +0000 dockes (5ef1b603c3be) + + * src/common/rclconfig.cpp: + test driver + +2006-11-20 15:28 +0000 dockes (1c4807a363f9) + + * src/common/rclconfig.h: + fix defaultcharset reset + +2006-11-20 11:17 +0000 dockes (ef95275586d1) + + * src/common/Makefile, src/common/textsplit.cpp, + src/common/textsplit.h: + improved textsplit speed (needs utf8iter modifs too + +2006-11-20 11:16 +0000 dockes (e05653621eb4) + + * src/utils/Makefile, src/utils/utf8iter.cpp, src/utils/utf8iter.h: + cleaned and speeded up utf8iter + +2006-11-19 18:37 +0000 dockes (756bc7569b34) + + * src/common/textsplit.cpp, src/common/textsplit.h: + optim ckpt + +2006-11-18 12:56 +0000 dockes (bf6e4de3a902) + + * src/qtgui/plaintorich.cpp: + firsttermocc init was not always done + +2006-11-18 12:31 +0000 dockes (1703e5a7b03e) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp: + improve positionning on term groups by storing/passing an occurrence + index + +2006-11-18 12:30 +0000 dockes (f065c8063ff3) + + * src/rcldb/searchdata.cpp: + correctly generate highlighting term groups when stem-expanding NEAR + queries + +2006-11-17 15:26 +0000 dockes (ee4a13877b24) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, + src/qtgui/guiutils.h: + Save adv search clause list + add delete button + +2006-11-17 12:55 +0000 dockes (679a2cb3d3e7) + + * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/reslist.cpp, src/qtgui/reslist.h: + get shift+clicklink to open new preview window instead of tab + +2006-11-17 12:32 +0000 dockes (51f7db5eff83) + + * src/qtgui/plaintorich.cpp: + small opts + fixed near region detection code + +2006-11-17 12:31 +0000 dockes (c0ba08efc3dd) + + * src/qtgui/plaintorich.h: + comments + +2006-11-17 12:31 +0000 dockes (e54183706237) + + * src/utils/utf8iter.h: + removed not strictly needed error checking code + +2006-11-17 10:09 +0000 dockes (7e44d4280e2d) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, + src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h: + Remember searchData and use it in plaintorich for phrase/group + highlighting + +2006-11-17 10:08 +0000 dockes (c175799e9e72) + + * src/qtgui/advsearch_w.cpp: + better data encap in searchdata + +2006-11-17 10:06 +0000 dockes (0ea302968170) + + * src/rcldb/rcldb.cpp, src/rcldb/searchdata.cpp, + src/rcldb/searchdata.h: + added code to remember search terms and term groups in searchdata + +2006-11-15 14:57 +0000 dockes (188b5b28427d) + + * src/common/Makefile, src/lib/Makefile, src/lib/mkMake, + src/mk/commondefs, src/qtgui/recoll.pro.in, src/rcldb/pathhash.cpp, + src/rcldb/pathhash.h, src/rcldb/rcldb.cpp, src/rcldb/searchdata.h, + src/rcldb/stemdb.h: + distributed files from common/ into rcld, internfile, common + +2006-11-15 07:27 +0000 dockes (5bfc0444c072) + + * src/internfile/Makefile: new file. + * src/internfile/Makefile: + *** empty log message *** + +2006-11-14 18:29 +0000 dockes (c45d7a2b1c63) + + * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h: + got rid of the static clause names + +2006-11-14 18:17 +0000 dockes (e4789b229585) + + * src/qtgui/advsearch.ui: + *** empty log message *** + +2006-11-14 17:56 +0000 dockes (ae916c13c591) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp: + added conjunction choice in advsearch + +2006-11-14 17:41 +0000 dockes (dfc71f06c1ce) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/searchclause_w.cpp, + src/qtgui/searchclause_w.h, src/rcldb/searchdata.cpp: + use SearchClauseW for all advsearch fields + +2006-11-14 15:13 +0000 dockes (300f3705d6cf) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp: + *** empty log message *** + +2006-11-14 14:58 +0000 dockes (c5f65c6f8fb9) + + * src/qtgui/recoll.pro.in: + *** empty log message *** + +2006-11-14 13:55 +0000 dockes (9e98c3d86016) + + * src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h: new file. + * src/doc/user/usermanual.sgml, src/qtgui/advsearch.ui, + src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, + src/qtgui/rclmain_w.cpp, src/qtgui/searchclause_w.cpp, + src/qtgui/searchclause_w.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: + added dynamic clauses to adv search. Still needs work + +2006-11-13 14:51 +0000 dockes (5c9db8d08690) + + * src/rcldb/rcldb.cpp: + *** empty log message *** + +2006-11-13 14:48 +0000 dockes (edec86240778) + + * src/rcldb/rcldb.cpp: + use wdfs for better selection of doc extracts in makeAbstract + +2006-11-13 11:59 +0000 dockes (fdf0f43cd03e) + + * src/utils/smallut.h: + *** empty log message *** + +2006-11-13 08:58 +0000 dockes (c48e54f96603) + + * src/utils/refcntr.h: new file. + * src/utils/refcntr.h: + *** empty log message *** + +2006-11-13 08:58 +0000 dockes (40853ad94507) + + * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, + src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h, + src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h: + make searchdata a more flexible struct + +2006-11-13 08:50 +0000 dockes (e585bfd6e725) + + * src/rcldb/searchdata.cpp: new file. + * src/lib/Makefile, src/lib/mkMake, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: + make searchdata a more flexible struct + +2006-11-13 08:49 +0000 dockes (db3490f9b522) + + * src/kde/kioslave/recoll/kio_recoll.cpp: + *** empty log message *** + +2006-11-13 08:15 +0000 dockes (7240ec62ffac) + + * src/qtgui/plaintorich.cpp: + new splitter interface + +2006-11-12 08:35 +0000 dockes (ff9f3aed6a5b) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/rcldb/rcldb.cpp: + phrase queries with bot spans and words must be splitted as words + only + +2006-11-11 15:30 +0000 dockes (25647c7c5aac) + + * src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui: + have more compact list header + %N + +2006-11-10 17:53 +0000 dockes (d423490bea37) + + * src/qtgui/reslist.cpp: + Really use the rich abstracts + +2006-11-10 17:18 +0000 dockes (9fc1a2d1b7af) + + * src/rcldb/rcldb.cpp: + optimized abstract building: bybye big vector + +2006-11-10 13:32 +0000 dockes (8cfbbddd355a) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: + make result list paragraph format user-adjustable + +2006-11-10 13:30 +0000 dockes (933509968125) + + * src/utils/smallut.cpp, src/utils/smallut.h: + pcSubst() + +2006-11-10 13:29 +0000 dockes (17e0ecfb5834) + + * src/internfile/internfile.cpp: + errlog + +2006-11-09 19:04 +0000 dockes (814af75ba7a8) + + * src/qtgui/preview_w.cpp: + better handle the situation of mbox file name matching search + +2006-11-09 17:38 +0000 dockes (3c996d97497a) + + * src/Makefile.in: + *** empty log message *** + +2006-11-09 17:37 +0000 dockes (c13aab8ac186) + + * src/qtgui/reslist.cpp: + nbsp to prevent line date wrap before tz + +2006-11-09 17:37 +0000 dockes (573934250b27) + + * src/rcldb/rcldb.cpp: + dont continue adding ellipsis into the abstract when its maxlen! + +2006-11-09 08:59 +0000 dockes (baafe52b9d1b) + + * src/utils/mimeparse.cpp: + test driver modifs + +2006-11-08 15:34 +0000 dockes (025fa484738a) + + * src/common/rclinit.cpp, src/utils/debuglog.cpp, + src/utils/debuglog.h: + fix pb with special log file names + +2006-11-08 15:32 +0000 dockes (a32333c18e9f) + + * src/configure, src/configure.ac: + aspell help string + +2006-11-08 13:04 +0000 dockes (f5f0e953f42e) + + * src/qtgui/plaintorich.cpp: + use vector instead of list for positions + +2006-11-08 07:22 +0000 dockes (de7777528655) + + * src/common/rclinit.cpp, src/common/rclinit.h, + src/index/recollindex.cpp: + allow daemon-specific log parameters + +2006-11-08 06:56 +0000 dockes (451b31555bc2) + + * src/utils/conftree.cpp, src/utils/conftree.h: + volatile conf + +2006-11-08 06:49 +0000 dockes (ba1e8fb12e39) + + * src/recollinstall.in: + install rclmon.sh + +2006-11-07 18:28 +0000 dockes (fb26679a6cec) + + * src/qtgui/reslist.cpp, src/utils/mimeparse.cpp: + 1.5.9: fix bad tz correction in email dates + display tz in reslist + +2006-11-07 16:51 +0000 dockes (affd0b42e8ae) + + * src/index/rclmon.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp: + traces + +2006-11-07 12:02 +0000 dockes (70ed645d27f3) + + * src/rcldb/rcldb.cpp: + use both size and mtime changes as updateneeding indicator + +2006-11-07 09:11 +0000 dockes (2491b468f55d) + + * src/qtgui/uiprefs.ui: + improved autophrase tooltip + +2006-11-07 09:04 +0000 dockes (ba7c28e1a205) + + * src/qtgui/uiprefs_w.cpp: + Cancel did not reset uiprefs dialog to stored state + +2006-11-07 08:57 +0000 dockes (c9f2b8c02171) + + * src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: + Cancel did not reset uiprefs dialog to stored state + +2006-11-07 06:41 +0000 dockes (fea8781e4829) + + * src/index/indexer.cpp: + record/show mtime instead of ctime + +2006-11-06 17:37 +0000 dockes (a82b3932ac69) + + * src/doc/user/usermanual.sgml, src/qtgui/rclmain.ui, + src/qtgui/spell_w.cpp, src/rcldb/rcldb.cpp: + wrote manual for term explorer and fixed a few problems + +2006-11-05 21:10 +0000 dockes (f4fc6544cb74) + + * src/bincimapmime/mime-parsefull.cc: + fix binc imap infinite loop on multipart with null boundary + +2006-11-05 18:02 +0000 dockes (9306096cb34f) + + * src/bincimapmime/depot.h, src/bincimapmime/session.h: deleted file. + * src/bincimapmime/address.cc, src/bincimapmime/address.h, + src/bincimapmime/convert.cc, src/bincimapmime/convert.h, + src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, + src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.h, + src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime- + inputsource.h, src/bincimapmime/mime-parsefull.cc, src/bincimapmime + /mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, + src/bincimapmime/mime-printdoc.cc, src/bincimapmime/mime- + printheader.cc, src/bincimapmime/mime-utils.h, + src/bincimapmime/mime.cc, src/bincimapmime/mime.h, + src/bincimapmime/session.h: + included bincimap 1.3.3 to 1.3.4 diffs (mostly cosmetic) + +2006-11-04 17:09 +0000 dockes (3e0e0d4b152f) + + * src/qtgui/spell.ui, src/qtgui/spell_w.cpp: + fix aspell version of term explorer + +2006-11-04 14:49 +0000 dockes (7f914235875b) + + * src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h: + change ctrl-tab to esc-spc + +2006-10-30 12:59 +0000 dockes (2454d0c418a2) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/rclmain_w.cpp, src/qtgui/spell.ui, src/qtgui/spell_w.cpp, + src/qtgui/ssearch_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + Turn spell tool into multimode spell/wild/regexp + +2006-10-25 11:50 +0000 dockes (66843e6e167c) + + * src/index/indexer.cpp: + make tmpdir only once + +2006-10-25 10:52 +0000 dockes (10c2b1b74822) + + * src/index/indexer.cpp, src/index/rclmon.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp, src/rcldb/rcldb.cpp: + added some debugging msgs (too much) + +2006-10-24 15:16 +0000 dockes (1fc3f90d5ee3) + + * src/mk/Darwin: + *** empty log message *** + +2006-10-24 14:28 +0000 dockes (33512e5ceddb) + + * src/index/indexer.cpp, src/index/indexer.h, src/index/rclmon.h, + src/index/rclmonprc.cpp, src/index/recollindex.cpp: + create stemming db on queue timeout if needed + +2006-10-24 13:22 +0000 dockes (21df8a0f4856) + + * src/index/rclmon.sh: new file. + * src/index/rclmon.sh: + *** empty log message *** + +2006-10-24 12:48 +0000 dockes (4af32c44f8ea) + + * src/index/rclmon.h, src/index/rclmonprc.cpp: + setup lockfile for monitor + +2006-10-24 11:42 +0000 dockes (f922b4dda121) + + * src/query/Makefile: + *** empty log message *** + +2006-10-24 11:42 +0000 dockes (f1da6521f1ff) + + * src/qtgui/ssearch_w.cpp: + explain error for C-TAB too many expansions + +2006-10-24 09:28 +0000 dockes (3228b6b8093a) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + fix slowness in needUpdate by using Database instead of + WritableDatabase + +2006-10-24 09:09 +0000 dockes (0d72c341e2eb) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/indexer.cpp, src/index/rclmonrcv.cpp: + centralize skippedNames computation to add dbdir always + +2006-10-23 15:01 +0000 dockes (6a07dc59db99) + + * src/index/rclmon.h, src/index/rclmonrcv.cpp: + handle directory creation + +2006-10-23 15:00 +0000 dockes (672e4b4bfe51) + + * src/utils/pathut.cpp, src/utils/pathut.h: + add path_isdir() + +2006-10-23 14:29 +0000 dockes (d395ca679c7a) + + * src/common/autoconfig.h.in, src/configure, src/configure.ac, + src/index/rclmonrcv.cpp: + raw inotify support + +2006-10-22 15:55 +0000 dockes (de0702a6c5e2) + + * src/mk/Linux: + *** empty log message *** + +2006-10-22 15:54 +0000 dockes (35832011eaf9) + + * src/rcldb/rcldb.cpp: + simplify needUpdate test + +2006-10-22 14:47 +0000 dockes (733c7646ca29) + + * src/configure, src/configure.ac, src/index/Makefile, + src/index/indexer.cpp, src/index/indexer.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp, src/index/recollindex.cpp, + src/mk/localdefs.in, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + monitor: purge docs for deleted files from db + +2006-10-20 08:31 +0000 dockes (6d54039efe79) + + * src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts: + new Ukrainian+Russian messages from Michael + +2006-10-20 08:29 +0000 dockes (ebcb12870038) + + * src/qtgui/advsearch.ui, src/qtgui/rclmain.ui, src/qtgui/uiprefs.ui: + small fixes on label strings + +2006-10-17 14:41 +0000 dockes (ea77c15d81a6) + + * src/common/autoconfig.h.in, src/configure, src/configure.ac, + src/index/rclmon.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp, src/index/recollindex.cpp: + fam autoconfig + +2006-10-16 15:33 +0000 dockes (aa570fc97bf9) + + * src/index/rclmon.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp: new file. + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/Makefile, src/index/indexer.cpp, src/index/indexer.h, + src/index/rclmon.h, src/index/rclmonprc.cpp, + src/index/rclmonrcv.cpp, src/index/recollindex.cpp: + 1st version of real time monitor + +2006-10-15 13:07 +0000 dockes (aa97f764d4a6) + + * src/qtgui/rclmain_w.cpp, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: + dbl click in spell win to add to ssearch + +2006-10-12 14:46 +0000 dockes (78a3a37209ae) + + * src/configure.ac, src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp: + recollindex -i now checks that the files are descendants of topdirs + +2006-10-12 08:39 +0000 dockes (ab66430f3f7d) + + * src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-10-11 16:09 +0000 dockes (1cf66e2b486f) + + * src/aspell/rclaspell.cpp, src/utils/execmd.cpp, src/utils/execmd.h: + improve execcmd to avoid allocating an allterms buffer when creating + dico + +2006-10-11 14:16 +0000 dockes (26e08a8fc135) + + * src/qtgui/images/d_spell.png, src/qtgui/images/spell.png, + src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: new + file. + * src/aspell/rclaspell.cpp, src/aspell/rclaspell.h, + src/common/autoconfig.h.in, src/common/rclconfig.h, src/configure, + src/configure.ac, src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp, src/mk/commondefs, src/mk/localdefs.in, + src/qtgui/images/d_spell.png, src/qtgui/images/spell.png, + src/qtgui/main.cpp, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, + src/qtgui/rclmain_w.h, src/qtgui/recoll.h, src/qtgui/recoll.pro.in, + src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, + src/sampleconf/recoll.conf.in, src/utils/smallut.cpp, + src/utils/smallut.h: + 1st full version of aspell support + +2006-10-10 10:58 +0000 dockes (ed60d657e8e9) + + * src/aspell/aspell-local.h, src/common/autoconfig.h.in: new file. + * src/aspell/aspell-local.h, src/common/autoconfig.h.in: + *** empty log message *** + +2006-10-09 16:37 +0000 dockes (93d9009c4d51) + + * src/VERSION, src/aspell/rclaspell.cpp, src/aspell/rclaspell.h, + src/index/Makefile, src/lib/Makefile, src/lib/mkMake, + src/makesrcdist.sh, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/rcldb/stemdb.cpp, src/utils/execmd.cpp, src/utils/execmd.h: + aspell checkpoint + +2006-10-09 14:05 +0000 dockes (711360b10738) + + * src/aspell/Makefile, src/aspell/rclaspell.cpp, + src/aspell/rclaspell.h: new file. + * src/aspell/Makefile, src/aspell/rclaspell.cpp, + src/aspell/rclaspell.h: + *** empty log message *** + +2006-10-03 08:34 +0000 dockes (4033d57b83da) + + * packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec: + 1.5 + +2006-10-02 13:30 +0000 dockes (562f54fc8029) + + * src/VERSION, src/makestaticdist.sh: + small glitches in makestaticdist + +2006-10-02 12:33 +0000 dockes (7be5b4b7d6c0) + + * src/VERSION, src/configure, src/configure.ac, src/query/history.h: + small glitches detected on suse / gcc 4.1 + +2006-10-02 11:25 +0000 dockes (8731b62606fe [RECOLL-1_5_8, RECOLL-1_5_3, RECOLL-1_5_6, RECOLL-1_5_7, RECOLL-1_5_4, RECOLL-1_5_5]) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist: + 1.5.2 + +2006-10-02 08:38 +0000 dockes (ee82de281263) + + * src/VERSION: + *** empty log message *** + +2006-10-02 08:26 +0000 dockes (bafb3e762d82) + + * src/sampleconf/mimeconf: + added 2 icons + +2006-10-02 08:25 +0000 dockes (c3d47772ea99) + + * src/qtgui/mtpics/image.png, src/qtgui/mtpics/source.png: new file. + * src/qtgui/mtpics/image.png, src/qtgui/mtpics/source.png: + *** empty log message *** + +2006-10-02 07:50 +0000 dockes (fe9700b5a6fe [RECOLL-1_5_2, RECOLL-1_5_1]) + + * src/INSTALL, src/README, website/BUGS.txt, website/CHANGES.txt, + website/download.html, website/index.html: + *** empty log message *** + +2006-10-02 07:45 +0000 dockes (bc3c93581184) + + * src/VERSION, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts: + 1.5.1 + +2006-09-29 11:43 +0000 dockes (bd51dd85dc0f) + + * src/doc/user/usermanual.sgml: + aspell pass + +2006-09-29 08:26 +0000 dockes (026d0b177533) + + * src/rcldb/rcldb.cpp: + syntabs: remove size limit. Handle overlapping chunks. Make sure we + use only one term per position + +2006-09-29 08:24 +0000 dockes (49342357f800) + + * src/qtgui/reslist.cpp: + reset curPvDoc on setDocSource + +2006-09-29 08:23 +0000 dockes (a9cef42dd219) + + * src/qtgui/uiprefs.ui: + bump up limits on max abstract size parameters + +2006-09-29 07:13 +0000 dockes (7973023d7c1b) + + * src/qtgui/ssearch_w.cpp: + bad/unneeded conversion to utf8 while saving ssearch history would + cause some string sizes in history to double at each program + invocation + +2006-09-28 14:32 +0000 dockes (a5bba26b0ac0) + + * src/qtgui/i18n/recoll_fr.ts: + 1.5 + +2006-09-28 14:31 +0000 dockes (71d5895b7848) + + * src/qtgui/ssearchb.ui: + improved tip + +2006-09-28 14:30 +0000 dockes (903f443a7150) + + * src/doc/user/usermanual.sgml: + reordered the tips + +2006-09-28 11:55 +0000 dockes (3bf818bd1e39) + + * src/qtgui/main.cpp: + debug messages + +2006-09-23 13:32 +0000 dockes (3cf269bf18f0) + + * website/BUGS.txt, website/CHANGES.txt, website/download.html, + website/features.html, website/index.html: + *** empty log message *** + +2006-09-23 13:13 +0000 dockes (06ed627f182d [RECOLL-1_5_0]) + + * src/INSTALL, src/README, src/makesrcdist.sh: + *** empty log message *** + +2006-09-23 13:11 +0000 dockes (0533f47f1c34) + + * src/INSTALL, src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-09-23 13:09 +0000 dockes (9b8fdf62ad07) + + * src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-09-23 07:39 +0000 dockes (33e469ad3a2e) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp: + fix file name display in tooltips + +2006-09-23 07:39 +0000 dockes (e47ebb4e22ce) + + * src/internfile/mh_mail.cpp: + fix newlines + +2006-09-23 07:21 +0000 dockes (b5b530ea2ec9) + + * src/rcldb/rcldb.cpp: + message + +2006-09-22 14:11 +0000 dockes (3ef29a8417c7) + + * src/qtgui/i18n/recoll_fr.ts, src/rcldb/rcldb.cpp: + msg + +2006-09-22 10:46 +0000 dockes (9ade76cc0df5) + + * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts, src/qtgui/uiprefs_w.cpp: + messages + +2006-09-22 08:19 +0000 dockes (c228a1515468) + + * src/qtgui/recoll.pro.in: + *** empty log message *** + +2006-09-22 07:51 +0000 dockes (df858f3508f4) + + * src/qtgui/recoll.pro.in: + names cleanup + +2006-09-22 07:42 +0000 dockes (de54384ab321) + + * src/utils/mimeparse.h: + comment + +2006-09-22 07:41 +0000 dockes (f37052248b5b) + + * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts, src/qtgui/rclmain.ui, + src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h: new file. + * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll_fr.ts, + src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts, + src/qtgui/recollmain.ui: deleted file. + * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, + src/qtgui/i18n/recoll_uk.ts, src/qtgui/main.cpp, + src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclmain.ui, + src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, + src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts, + src/qtgui/recoll_uk.ts, src/qtgui/recollmain.ui: + names cleanup: rclmain, translations + +2006-09-22 07:38 +0000 dockes (c17bf757689b) + + * src/recollinstall.in: + names cleanup: translations + +2006-09-22 07:29 +0000 dockes (2d749704a22b) + + * src/qtgui/reslist.cpp, src/qtgui/reslist.h: new file. + * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: deleted file. + * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, + src/qtgui/reslist.cpp, src/qtgui/reslist.h: + names cleanup: reslist + +2006-09-22 07:22 +0000 dockes (cd9f046bf5e3) + + * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: + clarified preview paragraph coloring in reslist + +2006-09-22 07:19 +0000 dockes (c700f9f95168) + + * src/internfile/mh_mail.cpp: + clarified depth processing and increased limit + +2006-09-21 12:56 +0000 dockes (334ef2914129) + + * src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, + src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: + synchronize preview tab and colored paragraph in result list + +2006-09-21 09:37 +0000 dockes (43c279d4d112) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, + src/qtgui/rclmain.h, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, + src/query/sortseq.cpp, src/query/sortseq.h: + remember sort criteria + +2006-09-21 05:59 +0000 dockes (e5e9c1ffa44c) + + * src/internfile/myhtmlparse.cpp: + dont throw away text even if html is weird + +2006-09-21 05:59 +0000 dockes (4e99ebec009f) + + * src/common/textsplit.cpp: + 132.jpg was not split + +2006-09-21 05:57 +0000 dockes (3bc572456a49) + + * src/common/Makefile, src/utils/Makefile: + *** empty log message *** + +2006-09-20 06:21 +0000 dockes (5829221e8612) + + * src/rcldb/stemdb.cpp: + comments + +2006-09-19 14:30 +0000 dockes (598f2c534c4c) + + * src/rcldb/stemdb.cpp: + Stems with unique parent must be in db too so that one can search on + stem (which is not a term) + +2006-09-19 14:30 +0000 dockes (98cd92c958bd) + + * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: + walk the full mime tree instead of staying at level 1 + +2006-09-19 14:19 +0000 dockes (12fcb57186c2) + + * src/configure, src/configure.ac: + *** empty log message *** + +2006-09-19 14:19 +0000 dockes (88bbc8f18b9e) + + * src/utils/mimeparse.cpp: + disable date debug msgs + +2006-09-19 14:18 +0000 dockes (a0016b0e9969) + + * src/query/xadump.cpp: + add option to dump a recoll stemdb + +2006-09-18 12:17 +0000 dockes (e662e0bbe85e) + + * src/README: + *** empty log message *** + +2006-09-15 16:50 +0000 dockes (315f1c1d3dd3) + + * src/VERSION, src/doc/user/usermanual.sgml, + src/internfile/mh_mail.cpp, src/utils/mimeparse.cpp, + src/utils/mimeparse.h: + Use own code to parse rfc822 dates, strptime() cant do + +2006-09-15 16:49 +0000 dockes (ca133771bc5b) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/recoll.pro.in, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs_w.cpp: + small typo fixes + +2006-09-15 12:36 +0000 dockes (47354227e577) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-09-14 07:13 +0000 dockes (b717321f9de4 [RECOLL-1_4_4]) + + * *** empty log message *** + +2006-09-14 07:13 +0000 dockes (919e6e0dfc56) + + * website/BUGS.txt, website/CHANGES.txt, website/copydocs, + website/credits.html, website/devel.html, website/download.html, + website/features.html, website/index.html, website/pics/index.html, + website/styles/style.css: new file. + * website/BUGS.txt, website/CHANGES.txt, website/copydocs, + website/credits.html, website/devel.html, website/download.html, + website/features.html, website/index.html, website/pics/index.html, + website/styles/style.css: + *** empty log message *** + +2006-09-13 15:31 +0000 dockes (9bd2431eaa66) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs_w.cpp: + autophrase parameter + +2006-09-13 14:57 +0000 dockes (0d952f522055) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/rclreslist.cpp, src/query/docseq.cpp, src/query/docseq.h: + colorize search terms in abstracts + +2006-09-13 13:53 +0000 dockes (5980807171a8) + + * src/index/indexer.cpp, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/ssearch_w.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h, src/sampleconf/recoll.conf.in: + make constant lengths for abstracts config params + +2006-09-13 08:13 +0000 dockes (6e43869ceb61) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, + src/qtgui/guiutils.h, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: + add feature to save asearch ignored file types as startup default + +2006-09-12 10:11 +0000 dockes (9b323c436beb) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, + src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, + src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui: + allow paging through results inside a preview window with shift-up + shift-down + +2006-09-11 14:22 +0000 dockes (f0dd93428e23) + + * src/doc/user/usermanual.sgml, src/qtgui/advsearch.ui: + try to make clearer that adv search fields will accept phrases as + well as single words + +2006-09-11 12:05 +0000 dockes (f455fbc6a42a) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, + src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, + src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui, + src/query/history.cpp, src/query/history.h: + remember history of restrict subdirs in adv search + +2006-09-11 09:08 +0000 dockes (ad274e633ffb) + + * src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, + src/qtgui/rclmain.h, src/qtgui/recoll.h, src/qtgui/uiprefs.ui, + src/query/docseq.h, src/query/history.cpp, src/query/history.h: + use the (should be renamed) history file to store external databases + lists + +2006-09-11 07:10 +0000 dockes (6cb09384f54a) + + * src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui: + maintain ssearches listbox in mru order + +2006-09-11 06:58 +0000 dockes (b62d0be5650e) + + * src/qtgui/advsearch.ui, src/qtgui/sort.ui, src/qtgui/uiprefs.ui: + ensure dialogs are sized according to font size + +2006-09-08 09:02 +0000 dockes (a5a31c9b0a37) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/rclinit.cpp, src/common/rclinit.h, src/doc/man/recoll.1, + src/doc/man/recoll.conf.5, src/doc/man/recollindex.1, + src/doc/user/usermanual.sgml, src/index/recollindex.cpp, + src/qtgui/guiutils.cpp, src/qtgui/main.cpp: + Add -c option to recoll and recollindex + +2006-09-08 08:51 +0000 dockes (315e0865ec26) + + * src/sampleconf/recoll.conf.in: + The dbdir default value is now relative to the cnf dir + +2006-09-06 09:50 +0000 dockes (e696d98fe7fe) + + * src/qtgui/uiprefs_w.cpp: + Used to reset the buildAbstract replaceAbstract options because of + setDown instead of setChecked + +2006-09-06 09:14 +0000 dockes (0dedd735c86e) + + * src/utils/mimeparse.cpp, src/utils/mimeparse.h: + implement rfc2231 decoding for mime parameter values + +2006-09-05 17:09 +0000 dockes (95fd6b3a5b9a) + + * src/internfile/mh_mail.cpp: + let mimeparse handle decoding or param values + +2006-09-05 09:52 +0000 dockes (44182523e711) + + * src/filters/rclppt, src/filters/rclxls: new file. + * src/filters/rclppt, src/filters/rclxls, src/sampleconf/mimeconf, + src/sampleconf/mimemap: + added support for ppt and xls via catdoc + +2006-09-05 08:05 +0000 dockes (587719349228) + + * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: + index and display attachment file names + +2006-09-05 08:04 +0000 dockes (6f8b09a74d14) + + * src/utils/mimeparse.cpp, src/utils/mimeparse.h: + comments only + +2006-09-04 15:13 +0000 dockes (0f11e18480b2) + + * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, + src/qtgui/preview.ui, src/qtgui/preview.ui.h, + src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, + src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, src/qtgui/ssearch_w.cpp, + src/qtgui/ssearch_w.h, src/qtgui/uiprefs_w.cpp, + src/qtgui/uiprefs_w.h: new file. + * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: + deleted file. + * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, + src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, + src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/preview.ui, + src/qtgui/preview.ui.h, src/qtgui/preview/preview.pro, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/preview/pvmain.cpp, src/qtgui/preview_w.cpp, + src/qtgui/preview_w.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/recoll.pro.in, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, + src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, src/qtgui/ssearch_w.cpp, + src/qtgui/ssearch_w.h, src/qtgui/ssearchb.ui, + src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs.ui.h, src/qtgui/uiprefs_w.cpp, + src/qtgui/uiprefs_w.h: + mostly cosmetic changes to prepare for a future qt4 port: better + separate form design from code + +2006-06-29 11:05 +0000 dockes (8f28af2cb548) + + * src/qt4gui/recollmain.ui: + *** empty log message *** + +2006-06-24 09:56 +0000 dockes (fb2180e4d577) + + * src/qt4gui/recollmain.ui: + qt4 cleanup: merged back rclmainbase and rclmain + +2006-06-24 07:40 +0000 dockes (e1b5ffd88b25) + + * src/Makefile.in, src/VERSION, src/configure, src/configure.ac, + src/doc/user/usermanual.sgml, src/qt4gui/recoll.pro.in, + src/qt4gui/recollmain.ui, src/recollinstall.in: + more qt4, unfinished + +2006-06-23 08:07 +0000 dockes (46a46e406504) + + * src/qt4gui/recoll.pro.in, src/qt4gui/recollmain.ui: new file. + * src/qt4gui/recoll.pro.in, src/qt4gui/recollmain.ui: + added qt4gui code from Gennadi Sushko + +2006-05-22 07:04 +0000 dockes (2663a50d4760) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo: + 1.4.3 + +2006-05-09 10:15 +0000 dockes (c9a62f0cb289) + + * src/rcldb/rcldb.cpp: + perform stem expansion using all active dbs + +2006-05-09 07:56 +0000 dockes (29feec461985) + + * src/qtgui/preview/preview.ui.h, src/qtgui/rclreslist.cpp: + esc quits preview + prev/next links + +2006-05-08 07:08 +0000 dockes (185da0be6900) + + * src/recollinstall.in: + install icon + +2006-05-08 07:08 +0000 dockes (7dbebc260389) + + * src/qtgui/rclreslist.cpp: + *** empty log message *** + +2006-05-07 14:18 +0000 dockes (2f273f645a91) + + * packaging/rpm/recoll.spec: + 1.4.3 + +2006-05-07 14:18 +0000 dockes (16b38a704d8e) + + * packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec: + 1.3.3 + +2006-05-07 14:10 +0000 dockes (4ab20caea142 [RECOLL-1_4_3]) + + * src/VERSION: + Release 1.4.3 + +2006-05-06 17:25 +0000 dockes (e7b4fd0f97fa) + + * src/recoll.png, src/recoll.xcf: new file. + * src/qtgui/recoll.pro.in, src/recoll.png, src/recoll.xcf: + *** empty log message *** + +2006-05-06 17:24 +0000 dockes (aae37ad598a9) + + * src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts: + new from michael + +2006-05-02 09:49 +0000 dockes (fb5bb4665925 [RECOLL-1_4_2]) + + * src/qtgui/guiutils.cpp, src/rcldb/stemdb.cpp, src/unac/unac.c: + more fbsd4 tweaks: Release 1.4.2 + +2006-04-30 07:44 +0000 dockes (d686e45d4b5e) + + * src/rcldb/rcldb.cpp: + fbsd4 tweaks + +2006-04-30 07:39 +0000 dockes (b889e57b87d6) + + * src/VERSION, src/index/indexer.cpp, src/index/indexer.h, + src/lib/Makefile, src/lib/mkMake: + fbsd4 tweaks + +2006-04-30 07:26 +0000 dockes (72f2881955d1 [RECOLL-1_4_1]) + + * src/Makefile.in, src/README: + *** empty log message *** + +2006-04-30 07:23 +0000 dockes (172a9e09b77c) + + * src/Makefile.in: + *** empty log message *** + +2006-04-30 07:20 +0000 dockes (7be76a62e017) + + * src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts, + src/qtgui/recoll_uk.ts: + lupdate+french + +2006-04-28 07:54 +0000 dockes (5b44017502c3) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/indexer.cpp, src/index/recollindex.cpp, + src/kde/kioslave/recoll/kio_recoll.cpp, src/qtgui/main.cpp, + src/query/qtry.cpp: + centralize dbdir computation in rclconfig+cat with conffdir if not + absolute + +2006-04-28 07:23 +0000 dockes (436f58f83459) + + * src/utils/transcode.cpp: + change debug log trace + +2006-04-27 09:23 +0000 dockes (3df68e37cdd9) + + * src/doc/user/usermanual.sgml, src/qtgui/guiutils.cpp, + src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, src/qtgui/ssearchb.ui, + src/qtgui/ssearchb.ui.h: + make ssearch a combobox + +2006-04-27 06:12 +0000 dockes (e7c0f6cd73f0) + + * src/configure, src/configure.ac, src/lib/Makefile, src/lib/mkMake: + fix pb with .deps not existing + +2006-04-27 06:12 +0000 dockes (83e1c6a16ca6) + + * src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + use getmatchingterms instead of getqueryterms for highlighting etc. + in preview + +2006-04-26 11:51 +0000 dockes (fa1cc55f05e9) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-04-26 11:29 +0000 dockes (d92273eb3274) + + * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h: + dblclck in reslist adds to search lineedit + +2006-04-25 09:59 +0000 dockes (16f32a4eda4c) + + * src/index/indexer.cpp, src/rcldb/rcldb.cpp: + new way for doc unique terms: only path for monodoc, only path+ipath + for doc inside multidoc, add pseudo-doc for file itself + +2006-04-25 08:17 +0000 dockes (4c947b29c23c) + + * src/common/textsplit.cpp, src/rcldb/rcldb.cpp: + fixed small glitch in abstract text splitting + +2006-04-23 13:37 +0000 dockes (ea8caddeb344) + + * src/lib/mkMake: new file. + * src/lib/mkMake: + *** empty log message *** + +2006-04-22 06:27 +0000 dockes (1b0dd24cad31) + + * src/qtgui/main.cpp, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp, + src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h, src/qtgui/ssearchb.ui, + src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/rcldb/searchdata.h: + turn-off abst. build for fname search (no terms) + prototype query + expansion (xapian e-set on chosen doc) + dbl-click in preview adds + term to ssearch + +2006-04-20 09:20 +0000 dockes (4b9c3c7bcb49) + + * src/common/rclconfig.cpp, src/lib/Makefile, src/qtgui/rclmain.cpp, + src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, + src/qtgui/ssearchb.ui.h, src/query/sortseq.cpp, src/query/sortseq.h: + mode 700 on .recoll. move showquerydetails to rclreslist + +2006-04-19 08:26 +0000 dockes (9ec7ff1d0d53) + + * src/rcldb/searchdata.h: new file. + * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, + src/qtgui/main.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, + src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h, src/rcldb/searchdata.h: + compacted res list + completions in ssearch + additional or field + +2006-04-18 08:53 +0000 dockes (7c4352949f19) + + * src/index/recollindex.cpp, src/lib/Makefile, src/qtgui/advsearch.ui, + src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, + src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, + src/qtgui/recollmain.ui, src/qtgui/ssearchb.ui, + src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs.ui.h: + new libs Makefile+autoSearchOnWS + +2006-04-15 17:15 +0000 dockes (cc178f316e64) + + * src/qtgui/main.cpp, src/query/Makefile: + small aix tweaks + +2006-04-15 16:51 +0000 dockes (356148054ef1) + + * src/mk/AIX: new file. + * src/mk/AIX: + *** empty log message *** + +2006-04-13 09:50 +0000 dockes (fe982a2684e4) + + * src/rcldb/stemdb.cpp, src/rcldb/stemdb.h: new file. + * src/lib/Makefile, src/rcldb/rcldb.cpp, src/rcldb/stemdb.cpp, + src/rcldb/stemdb.h: + extracted stem database from rcldb to make it smaller + +2006-04-12 10:41 +0000 dockes (6892025a5c8e) + + * src/index/indexer.cpp, src/index/indexer.h, src/qtgui/idxthread.cpp, + src/qtgui/idxthread.h, src/qtgui/rclmain.cpp, + src/qtgui/recollmain.ui, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + improve indexing status reporting + +2006-04-12 07:26 +0000 dockes (44ac63815611) + + * src/qtgui/rclmain.cpp, src/rcldb/rcldb.cpp: + Fix history not working after thread index run + +2006-04-11 07:14 +0000 dockes (bd453ed96f6a) + + * src/rcldb/rcldb.cpp: + fix rare case where stem itself was forgotten in list of possible + derivatives + +2006-04-11 06:49 +0000 dockes (dd7f793fdf8e) + + * src/common/textsplit.cpp, src/rcldb/rcldb.cpp, + src/utils/smallut.cpp, src/utils/smallut.h: + comments and moving some util routines out of rcldb.cpp + +2006-04-08 14:00 +0000 dockes (d60e656c348f) + + * src/VERSION, src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-04-07 13:10 +0000 dockes (dc4ff4178b85) + + * src/qtgui/advsearch.ui.h, src/rcldb/rcldb.cpp: + check for and forbid pure negative query + +2006-04-07 13:08 +0000 dockes (7da00eb0c7aa) + + * src/qtgui/guiutils.cpp: + RECOLL_EXTRA_DBS environment variable + +2006-04-07 13:07 +0000 dockes (f040ff3bf0aa) + + * src/doc/user/usermanual.sgml: + use indexing instead of indexation + +2006-04-07 08:51 +0000 dockes (52451e342e49) + + * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: + comments+conventions + +2006-04-06 17:39 +0000 dockes (7d2906a0371d) + + * packaging/FreeBSD/recoll/pkg-plist: + merge modif from committer + +2006-04-06 14:28 +0000 dockes (52d4a2c2a341) + + * src/sampleconf/recoll.conf.in: + stem only for english by default + +2006-04-06 13:09 +0000 dockes (fa565da09aa7 [RECOLL-1_4_0]) + + * src/VERSION: + 1.4.0 + +2006-04-06 13:08 +0000 dockes (1436c843e74e) + + * src/VERSION, src/rcldb/rcldb.h, src/recollinstall.in: + rpmlint wants 755 for execs + +2006-04-06 12:34 +0000 dockes (687369f6736c) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-04-05 15:41 +0000 dockes (359711d5fbe3) + + * src/recollinstall.in: + fix the installed file perms + +2006-04-05 13:39 +0000 dockes (fdd0d33d5c2e) + + * src/qtgui/guiutils.cpp, src/qtgui/uiprefs.ui, + src/qtgui/uiprefs.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + small fixes for extra db selection + +2006-04-05 13:30 +0000 dockes (3277935457e9) + + * src/doc/user/usermanual.sgml: + small fixes + +2006-04-05 12:50 +0000 dockes (98d8d7d74aee) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h: + additional search databases + +2006-04-05 06:26 +0000 dockes (e8f1cc7c2bbf) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + simplified class structure + +2006-04-04 16:03 +0000 dockes (ddb66052e3e8 [RECOLL-1_4_0pre1]) + + * src/filters/rcldjvu, src/filters/rclmedia, src/filters/rclps, + src/filters/rclsoff: + handle paths with embedded spaces + +2006-04-04 15:44 +0000 dockes (933f89f10033) + + * src/filters/rcluncomp: + handle paths with embedded spaces + +2006-04-04 13:49 +0000 dockes (dec4932652ae) + + * src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp, src/qtgui/idxthread.cpp, + src/qtgui/idxthread.h, src/qtgui/rclmain.cpp: + make indexation more easily cancellable + +2006-04-04 12:37 +0000 dockes (17342a5b330b) + + * src/doc/user/usermanual.sgml, src/index/indexer.cpp, + src/index/indexer.h: + check for symlinks in the topdirs list. Generate diags in + confIndexer + +2006-04-04 10:38 +0000 dockes (ec632eb29364) + + * src/qtgui/guiutils.cpp, src/qtgui/rclreslist.cpp: + setup initial default window size smaller + +2006-04-04 09:36 +0000 dockes (d175998d9270) + + * src/common/unacpp.cpp, src/unac/unac.c: + clarify/clean up mem buffer handling + +2006-04-04 09:35 +0000 dockes (b14f9df37817) + + * src/utils/conftree.h: + fix potential minor memory leak when copying conftrees + +2006-04-04 09:34 +0000 dockes (aaddcbb06c7a) + + * src/index/indexer.cpp, src/index/indexer.h: + cosmetic: add m_ prefix to private vars + +2006-04-04 07:55 +0000 dockes (1bda0dcafd17) + + * src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h, + src/qtgui/rclmain.cpp: + Get things to compile with QT_NO_STL + +2006-04-03 14:16 +0000 dockes (4957b439000e) + + * packaging/FreeBSD/recoll/Makefile: + add mods from port tree + +2006-04-03 12:59 +0000 dockes (62a51f626e46) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo: + *** empty log message *** + +2006-04-03 11:43 +0000 dockes (0449d2ba4099 [RECOLL-1_3_3]) + + * src/VERSION: + 1.3.3 + +2006-04-03 11:43 +0000 dockes (6b54e368d2d1) + + * src/common/rclconfig.cpp: + small port fixes for fbsd4 and solaris + +2006-04-03 09:42 +0000 dockes (cd9fe4976fae) + + * src/utils/execmd.cpp: + warning + +2006-04-01 21:02 +0000 dockes (eef792b97ce8 [RECOLL-1_3_2]) + + * src/VERSION, src/qtgui/rclmain.cpp: + limit max length of displayed query details. 1.3.2 + +2006-04-01 09:15 +0000 dockes (315da01fb1a5 [RECOLL-1_3_1]) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-04-01 09:15 +0000 dockes (e9f0a85fc18e) + + * src/INSTALL, src/README, src/qtgui/rclreslist.cpp, + src/qtgui/ssearchb.ui: + updated INSTALL+README. Fix tab focus in main window + +2006-04-01 08:07 +0000 dockes (916faf93fb66) + + * src/qtgui/rclmain.cpp: + urlencode file name before executing ext app with url param + +2006-04-01 07:48 +0000 dockes (adbde9cd60b9) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + plist: + 1.3.1 + +2006-04-01 07:34 +0000 dockes (4cd3e4e4074c) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap: + Allow ext edit for c/c++ files. 1.3.1 2? + +2006-03-31 17:19 +0000 dockes (35db6f17bdd8) + + * src/VERSION, src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, + src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts: + fixed reslist header charset issues. 1.3.1 first + +2006-03-31 09:02 +0000 dockes (ae3d9c9deb6d) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-03-31 07:51 +0000 dockes (0fccf51c6905 [RECOLL-1_3_1pre3]) + + * src/qtgui/recoll_uk.ts: new file. + * src/qtgui/recoll_uk.ts: + *** empty log message *** + +2006-03-30 13:00 +0000 dockes (b41828dda0ac) + + * src/common/Makefile: + cleanup rclconfig + +2006-03-30 10:31 +0000 dockes (afbdbc31ff1c) + + * src/sampleconf/recoll.conf.in: + dont set defaultcharset to 8859-1: will let nls info be used + +2006-03-30 10:31 +0000 dockes (582fa2a09db3) + + * src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-03-30 08:19 +0000 dockes (89efa1c78c3c [RECOLL-1_3_1pre2]) + + * src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts: + lupdate + +2006-03-30 07:54 +0000 dockes (0b236faa0b9d) + + * src/qtgui/advsearch.ui: + cleaned up layout + +2006-03-29 17:31 +0000 dockes (7cb115f5789c) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, + src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h: + gui: replaced checkboxes for all/filename in simple search with + droplist + +2006-03-29 13:08 +0000 dockes (ce199bb02759) + + * src/VERSION, src/common/Makefile, src/common/rclconfig.cpp, + src/common/rclconfig.h, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h, src/qtgui/rclreslist.cpp, + src/sampleconf/mimeconf, src/sampleconf/mimemap: + result list: show preview and edit links only when they can be used + +2006-03-29 11:18 +0000 dockes (5f22b93705b4) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/rclinit.cpp, src/index/indexer.cpp, + src/qtgui/preview/preview.ui.h, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/pathut.cpp, src/utils/pathut.h, src/utils/transcode.cpp, + src/utils/transcode.h: + try to better handle non-ascii file names + +2006-03-28 12:49 +0000 dockes (a081a1b65de1) + + * src/doc/man/recoll.conf.5, src/doc/user/usermanual.sgml, + src/qtgui/recoll.pro.in, src/recollinstall.in, + src/sampleconf/recoll.conf.in: + 1.3.1pre1 + +2006-03-28 12:18 +0000 dockes (7429c22d162b) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-03-28 09:38 +0000 dockes (25e1ed25acc5) + + * src/filters/rclmedia, src/qtgui/mtpics/sownd.png: new file. + * src/filters/rclmedia, src/qtgui/mtpics/sownd.png, + src/sampleconf/mimeconf, src/sampleconf/mimemap: + filter for indexing mp3 tags + +2006-03-28 09:36 +0000 dockes (fb852147db29) + + * src/internfile/mh_unknown.h: new file. + * src/internfile/mh_unknown.h: + added code to specifically index/search file names + +2006-03-22 16:24 +0000 dockes (4467274ce405) + + * src/index/indexer.cpp, src/index/indexer.h, src/qtgui/idxthread.cpp, + src/qtgui/idxthread.h, src/qtgui/rclmain.cpp, + src/qtgui/recollmain.ui: + show current filename as feedback during indexation + +2006-03-22 14:25 +0000 dockes (5dae5f8a140d) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/utils/conftree.cpp, src/utils/conftree.h: + Replace user config with central values + override + +2006-03-22 11:17 +0000 dockes (1f04e3bfeb4a) + + * src/qtgui/rclreslist.cpp: + fix size display + +2006-03-21 15:11 +0000 dockes (88d6359d2739) + + * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: + implement right click menu in result list + +2006-03-21 13:46 +0000 dockes (56610f5d03b3) + + * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, + src/qtgui/rclreslist.h: + replaced (double)clicks in the result list with links + +2006-03-21 13:27 +0000 dockes (cc41e73a4f5a) + + * src/qtgui/rclreslist.cpp: + ckpt + +2006-03-21 11:04 +0000 dockes (b1dc67961a45) + + * src/index/mimetype.cpp: + sanity check on file -i return + +2006-03-21 09:15 +0000 dockes (8589c7c01f25) + + * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: new file. + * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: deleted file. + * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, + src/qtgui/recollmain.ui, src/qtgui/reslistb.ui, + src/qtgui/reslistb.ui.h: + reslistb form replaced by object derived from QTextBrowser + +2006-03-20 16:05 +0000 dockes (70c0ec0275a9) + + * src/VERSION, src/index/indexer.cpp, src/internfile/internfile.cpp, + src/internfile/mimehandler.cpp, src/qtgui/advsearch.ui, + src/qtgui/advsearch.ui.h, src/qtgui/ssearchb.ui, + src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + added code to specifically index/search file names + +2006-03-20 15:14 +0000 dockes (86bb2d64fdd9) + + * src/internfile/mh_text.cpp: + get rid of unused temp + +2006-03-20 09:54 +0000 dockes (fea74448199d) + + * src/utils/pathut.h: + comments + +2006-03-20 09:54 +0000 dockes (bf4772fd96ff) + + * src/sampleconf/mimemap: + add # to ignd suffixes + +2006-03-20 09:51 +0000 dockes (218c67bcb769) + + * src/common/rclconfig.cpp, src/common/rclconfig.h: + try to get default charset from LANG if not in config + +2006-03-20 09:50 +0000 dockes (2d633e45c451) + + * src/makestaticdist.sh: + desktop file + +2006-03-16 14:00 +0000 dockes (b45dd89bb177) + + * src/recoll.desktop: new file. + * src/recoll.desktop: + initial version from Michael Shigorin + +2006-03-16 13:49 +0000 dockes (e3e216dfacb6) + + * src/qtgui/recoll_ru.ts: new file. + * src/qtgui/recoll_ru.ts: + initial version from Michael Shigorin + +2006-03-04 10:09 +0000 dockes (983d0984e972 [RECOLL-1_2_3]) + + * src/VERSION, src/doc/user/usermanual.sgml: + 1.2.3 + +2006-02-21 12:57 +0000 dockes (29500b27662b) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-02-21 12:56 +0000 dockes (0bc6bf836dfe) + + * src/Makefile.in, src/configure, src/configure.ac: + ensure Makefile uses same qmake as configure + +2006-02-21 12:52 +0000 dockes (9a69d49b1448) + + * src/query/docseq.h, src/query/sortseq.h: + sorted sequence title would never show + +2006-02-07 10:26 +0000 dockes (8881db16fe21) + + * src/qtgui/reslistb.ui.h, src/query/docseq.cpp, src/query/docseq.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + fix problems with doc fetch sequence (have to know where to stop) + +2006-02-07 09:44 +0000 dockes (fbfb30458fc2) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h: + replace computation of term positions in editor text with search for + 1st query term + +2006-02-03 11:47 +0000 dockes (1dbf9bcedfc0) + + * src/filters/rcldvi: + option to use catdvi + +2006-02-03 10:53 +0000 dockes (f219261a580b) + + * src/filters/rcldjvu, src/filters/rcldvi: new file. + * src/filters/rcldjvu, src/filters/rcldvi, src/filters/rclps, + src/sampleconf/mimeconf, src/sampleconf/mimemap: + added dvi and djvu support + +2006-02-02 09:45 +0000 dockes (71a4b9e391e0) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo: + 1.2.2 + +2006-02-02 08:58 +0000 dockes (c2f3b36a7169 [RECOLL-1_2_2]) + + * src/rcldb/rcldb.cpp, src/utils/pathut.cpp: + suppress 2 compilation warnings (one was actual 64bits bug but + inocuous + +2006-02-02 08:35 +0000 dockes (4d473bd0d9a8) + + * src/Makefile.in, src/VERSION, src/configure, src/configure.ac, + src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h: + fix small cc glitches: qt3.1, xapian-config + +2006-02-01 14:34 +0000 dockes (a4deac6ede77 [RECOLL-1_2_1]) + + * src/qtgui/guiutils.cpp, src/qtgui/reslistb.ui.h: + fbsd4 cc + +2006-02-01 14:27 +0000 dockes (b005945089dc) + + * src/VERSION: + *** empty log message *** + +2006-02-01 14:18 +0000 dockes (1f6da4b2f946) + + * src/common/textsplit.cpp: + use string::erase() not clear() + +2006-02-01 09:00 +0000 dockes (09b3a24a6173 [RECOLL-1_2_0]) + + * src/recollinstall.in: + *** empty log message *** + +2006-02-01 08:19 +0000 dockes (bef8d87339d0) + + * packaging/rpm/recoll.spec: + *** empty log message *** + +2006-02-01 07:14 +0000 dockes (5c4deca7b177) + + * src/excludefile, src/utils/base64.cpp: + *** empty log message *** + +2006-02-01 07:12 +0000 dockes (77e021af3fa0) + + * src/INSTALL, src/README, src/doc/user/usermanual.sgml, + src/excludefile, src/makesrcdist.sh: + *** empty log message *** + +2006-01-31 11:39 +0000 dockes (73f22e91d844) + + * src/qtgui/reslistb.ui.h: + Clicking on "No results found" will also display the expanded query + +2006-01-31 11:39 +0000 dockes (c225bd05e9c1) + + * src/qtgui/recoll.h: + close/reopen db by default: let us see results of recollindex -i + +2006-01-30 12:51 +0000 dockes (cd40d5627d38) + + * src/qtgui/recoll_fr.ts: + *** empty log message *** + +2006-01-30 11:15 +0000 dockes (962649c706ef) + + * src/common/rclconfig.h, src/common/rclinit.h, + src/common/textsplit.h, src/common/unacpp.h, src/common/uproplist.h, + src/index/csguess.h, src/index/indexer.h, src/index/mimetype.h, + src/internfile/htmlparse.cpp, src/internfile/htmlparse.h, + src/internfile/indextext.h, src/internfile/internfile.h, + src/internfile/mh_exec.h, src/internfile/mh_html.h, + src/internfile/mh_mail.h, src/internfile/mh_text.h, + src/internfile/mimehandler.h, src/internfile/myhtmlparse.cpp, + src/internfile/myhtmlparse.h, src/qtgui/advsearch.ui.h, + src/qtgui/guiutils.h, src/qtgui/idxthread.h, + src/qtgui/plaintorich.h, src/qtgui/preview/preview.ui.h, + src/qtgui/rclmain.h, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, + src/qtgui/reslistb.ui.h, src/qtgui/sort.ui.h, + src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui.h, src/query/docseq.h, + src/query/history.h, src/query/sortseq.h, src/rcldb/pathhash.h, + src/rcldb/rcldb.h, src/utils/base64.h, src/utils/cancelcheck.h, + src/utils/conftree.h, src/utils/copyfile.h, src/utils/debuglog.h, + src/utils/execmd.h, src/utils/fstreewalk.h, src/utils/idfile.h, + src/utils/mimeparse.h, src/utils/pathut.h, src/utils/readfile.h, + src/utils/smallut.h, src/utils/transcode.h, src/utils/utf8iter.h, + src/utils/wipedir.h: + *** empty log message *** + +2006-01-30 10:01 +0000 dockes (f683194d38a4) + + * src/qtgui/preview/preview.ui.h: + dont highlight terms in very big docs: too slow + +2006-01-30 09:32 +0000 dockes (dc8cbf051f54) + + * src/mk/localdefs.in: + -O2 + +2006-01-30 09:28 +0000 dockes (af56f00261eb) + + * src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h: + help browser selection in prefs + +2006-01-30 09:28 +0000 dockes (df275d18bee6) + + * src/utils/execmd.cpp: + *** empty log message *** + +2006-01-30 09:28 +0000 dockes (6d7b08c3bba0) + + * src/common/textsplit.cpp: + moved span cleanup where it belonged + +2006-01-28 15:36 +0000 dockes (b65e6344a9e4) + + * src/common/textsplit.cpp, src/common/textsplit.h: + *** empty log message *** + +2006-01-28 10:23 +0000 dockes (507b05e72779) + + * src/common/textsplit.cpp, src/common/textsplit.h, src/configure, + src/configure.ac, src/query/xadump.cpp, src/utils/utf8iter.h: + more textsplit tweaking + +2006-01-27 13:43 +0000 dockes (8ed38cba7965) + + * src/utils/cancelcheck.h: new file. + * src/utils/cancelcheck.h: + *** empty log message *** + +2006-01-27 13:43 +0000 dockes (fa13d8fe2fc9) + + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h: new file. + * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h: + extracted code from main and others + +2006-01-27 13:42 +0000 dockes (96572eee9528) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/rclmain.cpp: + implement cancellation in preview loading + +2006-01-27 13:38 +0000 dockes (3ad2458e654a) + + * src/internfile/myhtmlparse.cpp: + strip whitespace and newlines (as the original version), except in + pre tags + +2006-01-27 13:37 +0000 dockes (80dbbac5b981) + + * src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, + src/filters/rclsoff: + fix to output
when needed + other misc pbs + +2006-01-27 13:34 +0000 dockes (538235c10cd7) + + * src/rcldb/rcldb.cpp: + define some constants and increase abstract context width + +2006-01-27 11:25 +0000 dockes (1d381cea9ec3) + + * src/internfile/htmlparse.cpp: + missing amp entity translation + +2006-01-26 17:59 +0000 dockes (15b82e0f9689) + + * src/internfile/mh_exec.cpp: + check for cancellation + +2006-01-26 17:59 +0000 dockes (81f5d1264b7d) + + * src/utils/execmd.cpp, src/utils/execmd.h: + also test cancel on select timeout + +2006-01-26 17:44 +0000 dockes (77efdf7b7e93) + + * src/utils/execmd.cpp, src/utils/execmd.h: + make execCmd exception-safe + +2006-01-26 14:02 +0000 dockes (ffd1ec38fb9f) + + * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/recoll.h, + src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h: + abstract params + +2006-01-26 14:01 +0000 dockes (c34965eaaa05) + + * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: + abstracts + doc sizes + +2006-01-26 12:30 +0000 dockes (c3718d2ceeae) + + * src/query/docseq.cpp: + let the db do whats needed to get a result count + +2006-01-26 12:29 +0000 dockes (bc0a233de310) + + * src/utils/smallut.cpp, src/utils/smallut.h: + chrono + +2006-01-26 12:28 +0000 dockes (69be9a0edd98) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + abstract building from position data + +2006-01-26 07:03 +0000 dockes (2c5403cbdbc1) + + * src/qtgui/recoll.pro: deleted file. + * src/qtgui/recoll.pro: + replaced by recoll.pro.in + +2006-01-26 07:03 +0000 dockes (7a03d26ad54d) + + * src/qtgui/recoll.pro, src/qtgui/recoll.pro.in, src/utils/smallut.h: + *** empty log message *** + +2006-01-26 07:02 +0000 dockes (de94ebf3cb51) + + * src/index/indexer.cpp: + pass size info to db.add + +2006-01-25 08:39 +0000 dockes (fc5ab7249caa) + + * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: + reenable stripping newlines + +2006-01-25 08:09 +0000 dockes (1ce613930379) + + * src/query/Makefile, src/query/xadump.cpp: + xadump improvements + +2006-01-24 12:22 +0000 dockes (6a16d14c076e) + + * src/qtgui/rclmain.cpp: + fix signal type + +2006-01-24 12:22 +0000 dockes (322a0f010b59) + + * src/utils/execmd.cpp, src/utils/execmd.h: + add feedback and possible cancellation + +2006-01-23 17:21 +0000 dockes (d16bcca9bc1e) + + * src/qtgui/images/d_nextpage.png, src/qtgui/images/d_prevpage.png: + new file. + * src/qtgui/images/d_nextpage.png, src/qtgui/images/d_prevpage.png, + src/qtgui/rclmain.cpp, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui: + slightly improved the icon situation + +2006-01-23 16:52 +0000 dockes (a51e0cfa77db) + + * src/qtgui/images/asearch.png, src/qtgui/images/history.png, + src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, + src/qtgui/images/sortparms.png: + *** empty log message *** + +2006-01-23 15:43 +0000 dockes (907a44f71ddc) + + * src/qtgui/images/editcopy, src/qtgui/images/editcut, + src/qtgui/images/editpaste, src/qtgui/images/filenew, + src/qtgui/images/fileopen, src/qtgui/images/filesave, + src/qtgui/images/print, src/qtgui/images/redo, + src/qtgui/images/searchfind, src/qtgui/images/undo: deleted file. + * src/qtgui/images/editcopy, src/qtgui/images/editcut, + src/qtgui/images/editpaste, src/qtgui/images/filenew, + src/qtgui/images/fileopen, src/qtgui/images/filesave, + src/qtgui/images/print, src/qtgui/images/redo, + src/qtgui/images/searchfind, src/qtgui/images/undo: + *** empty log message *** + +2006-01-23 13:32 +0000 dockes (b27df12a0147) + + * src/common/rclconfig.cpp, src/common/rclinit.cpp, + src/common/textsplit.cpp, src/common/unacpp.cpp, + src/index/csguess.cpp, src/index/indexer.cpp, + src/index/mimetype.cpp, src/index/recollindex.cpp, + src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, + src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp, + src/internfile/mimehandler.cpp, src/query/docseq.cpp, + src/query/history.cpp, src/query/qtry.cpp, src/query/qxtry.cpp, + src/query/sortseq.cpp, src/query/xadump.cpp, src/rcldb/pathhash.cpp, + src/rcldb/rcldb.cpp, src/utils/base64.cpp, src/utils/conftree.cpp, + src/utils/copyfile.cpp, src/utils/debuglog.cpp, + src/utils/execmd.cpp, src/utils/fstreewalk.cpp, + src/utils/idfile.cpp, src/utils/mimeparse.cpp, src/utils/pathut.cpp, + src/utils/readfile.cpp, src/utils/smallut.cpp, + src/utils/transcode.cpp, src/utils/utf8iter.cpp, + src/utils/wipedir.cpp: + reference to GPL in all .cpp files + +2006-01-23 13:32 +0000 dockes (c2c52e3c568f) + + * src/qtgui/idxthread.cpp, src/qtgui/main.cpp, + src/qtgui/plaintorich.cpp, src/qtgui/rclmain.cpp, + src/qtgui/recoll.h, src/qtgui/recoll.pro, src/qtgui/reslistb.ui.h, + src/qtgui/uiprefs.ui.h: + more refactoring + +2006-01-23 07:15 +0000 dockes (639d2208e231) + + * src/qtgui/rclmain.cpp: + *** empty log message *** + +2006-01-23 07:07 +0000 dockes (29cad268f7ba) + + * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/reslistb.ui, + src/qtgui/reslistb.ui.h, src/qtgui/ssearchb.ui.h: + more modularization + +2006-01-22 18:46 +0000 dockes (c329a0d633e1) + + * src/qtgui/recoll.pro.in: new file. + * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/recoll.pro, src/qtgui/recoll.pro.in, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, + src/qtgui/ssearchb.ui: + extract functionality from main window + +2006-01-22 15:16 +0000 dockes (f8f81a690e3d) + + * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: + *** empty log message *** + +2006-01-22 13:56 +0000 dockes (b62fca0983d3) + + * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, + src/qtgui/ssearchb.ui.h: new file. + * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, + src/qtgui/ssearchb.ui.h: + *** empty log message *** + +2006-01-22 07:41 +0000 dockes (50553b4f8d29 [T1_2]) + + * src/qtgui/ssearchb.ui: + *** empty log message *** + +2006-01-22 07:25 +0000 dockes (f5ecee171cca) + + * src/qtgui/ssearchb.ui: new file. + * src/qtgui/ssearchb.ui: + *** empty log message *** + +2006-01-21 15:36 +0000 dockes (283be80e303b) + + * src/configure: + *** empty log message *** + +2006-01-21 15:36 +0000 dockes (57061cf4c252) + + * src/Makefile.in, src/configure, src/configure.ac, + src/makesrcdist.sh, src/qtgui/recoll.pro: + enable building from inside qtgui/ + +2006-01-21 15:25 +0000 dockes (ce790ab8e905) + + * packaging/rpm/recollmdk.spec: new file. + * packaging/rpm/recollmdk.spec: + *** empty log message *** + +2006-01-21 10:47 +0000 dockes (47b92b35b369) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-01-20 14:58 +0000 dockes (9dfcca9b0073) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h, + src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.h: + qt main program cleanup + +2006-01-20 12:46 +0000 dockes (04782d3c08bb) + + * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h: new file. + * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, + src/qtgui/recoll.pro, src/qtgui/recoll_fr.ts, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + separated code from design by subclassing recollmain + +2006-01-20 10:01 +0000 dockes (f1c90fc5dd19) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/kde/kioslave/recoll/00README.txt, src/mk/commondefs, + src/mk/localdefs.in, src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, + src/qtgui/main.cpp, src/utils/conftree.h, src/utils/debuglog.h: + cleanup + +2006-01-19 17:11 +0000 dockes (b6465d0ee08c) + + * src/Makefile.in: new file. + * src/Makefile: deleted file. + * src/Makefile, src/Makefile.in, src/common/rclconfig.cpp, + src/common/rclconfig.h, src/configure, src/configure.ac, + src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, + src/mk/localdefs.in, src/qtgui/main.cpp, src/qtgui/recoll.pro, + src/recollinstall.in: + slight config cleanup + +2006-01-19 15:08 +0000 dockes (211c1066ac8f) + + * src/kde/kioslave/recoll/00README.txt: new file. + * src/kde/kioslave/recoll/00README.txt: + end of test, doesnt look very useful + +2006-01-19 14:57 +0000 dockes (302ee688e96a) + + * src/kde/kioslave/recoll/kio_recoll.la: new file. + * src/kde/kioslave/recoll/Makefile, + src/kde/kioslave/recoll/kio_recoll.cpp, + src/kde/kioslave/recoll/kio_recoll.h, + src/kde/kioslave/recoll/kio_recoll.la: + end of initial experimentation + +2006-01-19 12:03 +0000 dockes (ffb549062074) + + * src/utils/Makefile: + *** empty log message *** + +2006-01-19 12:01 +0000 dockes (0e6b7d796f28) + + * packaging/FreeBSD/recoll/Makefile, src/Makefile, src/VERSION, + src/bincimapmime/Makefile, src/common/Makefile, + src/doc/user/usermanual.sgml, src/index/Makefile, + src/kde/kioslave/recoll/Makefile, + src/kde/kioslave/recoll/kio_recoll.cpp, + src/kde/kioslave/recoll/kio_recoll.h, src/lib/Makefile, + src/makestaticdist.sh, src/mk/Darwin, src/mk/FreeBSD, src/mk/Linux, + src/mk/SunOS, src/mk/commondefs, src/mk/localdefs.in, + src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/recollmain.ui.h, src/query/Makefile, src/utils/Makefile, + src/utils/smallut.cpp, src/utils/smallut.h: + misc small mods to help with building kio_recoll + +2006-01-18 13:41 +0000 dockes (ebf94c8fc21c) + + * src/kde/kioslave/recoll/Makefile, + src/kde/kioslave/recoll/kio_recoll.cpp, + src/kde/kioslave/recoll/kio_recoll.h, + src/kde/kioslave/recoll/recoll.protocol: new file. + * src/kde/kioslave/recoll/Makefile, + src/kde/kioslave/recoll/kio_recoll.cpp, + src/kde/kioslave/recoll/kio_recoll.h, + src/kde/kioslave/recoll/recoll.protocol: + *** empty log message *** + +2006-01-17 10:08 +0000 dockes (9784891fd0a7) + + * src/utils/mimeparse.h: + comments and clarification + +2006-01-17 09:31 +0000 dockes (08549e5e4a9e) + + * src/index/indexer.cpp, src/utils/fstreewalk.cpp, + src/utils/fstreewalk.h: + cleanup and comments + +2006-01-14 13:09 +0000 dockes (d7ac146b7dd5) + + * src/configure, src/configure.ac: + do a better search for qt configuration + +2006-01-14 11:48 +0000 dockes (d073ecc93317) + + * src/Makefile, src/configure, src/configure.ac: + do a better search for qt configuration + +2006-01-12 09:29 +0000 dockes (2dfd16f6a9a4 [RECOLL-1_1_0]) + + * src/qtgui/recoll_fr.ts: + *** empty log message *** + +2006-01-12 09:16 +0000 dockes (deb6607d43bf) + + * src/README: + *** empty log message *** + +2006-01-12 09:13 +0000 dockes (7635781b18c5) + + * src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp: + handle removed docs in history + +2006-01-11 17:41 +0000 dockes (bd54a740def9) + + * src/qtgui/recollmain.ui.h: + *** empty log message *** + +2006-01-11 15:09 +0000 dockes (108917b10bf3) + + * src/qtgui/uiprefs.ui.h: new file. + * src/qtgui/uiprefs.ui.h: + *** empty log message *** + +2006-01-11 15:08 +0000 dockes (a03b6696412a) + + * src/doc/user/usermanual.sgml, src/index/Makefile, + src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/query/docseq.h, + src/query/sortseq.cpp, src/query/sortseq.h, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h: + translation of result list title. Show query details when clicking + on header + +2006-01-10 17:46 +0000 dockes (d4cc3428e381) + + * src/recollinstall.in: + *** empty log message *** + +2006-01-10 14:53 +0000 dockes (c873b3133cdd) + + * packaging/rpm/recoll.spec: + *** empty log message *** + +2006-01-10 13:52 +0000 dockes (ab4934e066f9) + + * src/recollinstall.in: + *** empty log message *** + +2006-01-10 13:41 +0000 dockes (23d6e8ae7155) + + * src/recollinstall.in: + *** empty log message *** + +2006-01-10 13:32 +0000 dockes (526cfe52f2e1) + + * src/recollinstall.in: + *** empty log message *** + +2006-01-10 13:27 +0000 dockes (a2f47b62ca03) + + * src/recollinstall.in: + *** empty log message *** + +2006-01-10 13:16 +0000 dockes (72d6ccffea15) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + plist, src/recollinstall.in: + install man pages + +2006-01-10 12:58 +0000 dockes (3a7d0fd4ceb7) + + * src/Makefile, src/common/rclconfig.cpp: + warning + +2006-01-10 12:55 +0000 dockes (aaeb49f89a98) + + * src/rcldb/rcldb.cpp: + include unistd + +2006-01-10 12:06 +0000 dockes (9b804748017f) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-01-10 11:07 +0000 dockes (01e4fe9772b0) + + * src/common/rclconfig.h, src/doc/user/usermanual.sgml, + src/index/recollindex.cpp, src/sampleconf/recoll.conf.in: + doc + got rid of unused defaultlanguage config param + +2006-01-10 09:10 +0000 dockes (34638d9bd009) + + * src/doc/man/recoll.conf.5: new file. + * src/doc/man/recoll.conf.5: + *** empty log message *** + +2006-01-10 08:14 +0000 dockes (a9b485ada811) + + * src/doc/man/recoll.1, src/doc/man/recollindex.1: new file. + * src/doc/man/recoll.1, src/doc/man/recollindex.1: + *** empty log message *** + +2006-01-09 16:53 +0000 dockes (29f37b7888d3) + + * src/excludefile, src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/Makefile, src/utils/pathut.cpp, src/utils/pathut.h: + allow independant creation / deletion of stem dbs + +2006-01-06 13:55 +0000 dockes (8831260252d9) + + * src/rcldb/rcldb.cpp: + do a better test for a capitalized query term (no stem expand) + +2006-01-06 13:20 +0000 dockes (82e02042773f) + + * src/qtgui/uiprefs.ui: new file. + * src/qtgui/uiprefs.ui: + *** empty log message *** + +2006-01-06 13:19 +0000 dockes (29cdbe2390e4) + + * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, + src/utils/caseconvert.h, src/utils/gencasefold.sh: deleted file. + * src/lib/Makefile, src/rcldb/rcldb.cpp, src/unac/unac.c, + src/unac/unac.h, src/utils/CaseFolding.txt, src/utils/Makefile, + src/utils/caseconvert.cpp, src/utils/caseconvert.h, + src/utils/gencasefold.sh: + integrated case-folding into unac for better performance + +2006-01-06 13:18 +0000 dockes (7840fc0ec48b) + + * src/common/Makefile, src/common/unacpp.cpp, src/common/unacpp.h, + src/rcldb/rcldb.cpp: + integrated case-folding into unac for better performance + +2006-01-06 13:10 +0000 dockes (15e715082e40) + + * unac/CaseFolding-3.2.0.txt: new file. + * unac/CaseFolding-3.2.0.txt, unac/builder.in, unac/unac.c, + unac/unac.h: + implemented additional case-folding + +2006-01-06 13:08 +0000 dockes (f27aa43e32ef [UNAC_1_7_0]) + + * unac/.version, unac/AUTHORS, unac/COPYING, unac/ChangeLog, + unac/INSTALL, unac/Makefile.am, unac/Makefile.in, unac/NEWS, + unac/README, unac/THANKS, unac/UnicodeData-3.2.0.txt, + unac/acinclude.m4, unac/aclocal.m4, unac/builder.in, + unac/config.guess, unac/config.h.in, unac/config.sub, + unac/configure, unac/configure.ac, unac/depcomp, unac/getopt.c, + unac/getopt.h, unac/install-sh, unac/ltconfig, unac/ltmain.sh, + unac/missing, unac/mkinstalldirs, unac/stamp-h.in, unac/t_unac.in, + unac/unac.3, unac/unac.c, unac/unac.h, unac/unac.pc.in, + unac/unac.spec.in, unac/unaccent.1, unac/unaccent.c, + unac/unactest.c, unac/unactest1.c: new file. + * unac/.version, unac/AUTHORS, unac/COPYING, unac/ChangeLog, + unac/INSTALL, unac/Makefile.am, unac/Makefile.in, unac/NEWS, + unac/README, unac/THANKS, unac/UnicodeData-3.2.0.txt, + unac/acinclude.m4, unac/aclocal.m4, unac/builder.in, + unac/config.guess, unac/config.h.in, unac/config.sub, + unac/configure, unac/configure.ac, unac/depcomp, unac/getopt.c, + unac/getopt.h, unac/install-sh, unac/ltconfig, unac/ltmain.sh, + unac/missing, unac/mkinstalldirs, unac/stamp-h.in, unac/t_unac.in, + unac/unac.3, unac/unac.c, unac/unac.h, unac/unac.pc.in, + unac/unac.spec.in, unac/unaccent.1, unac/unaccent.c, + unac/unactest.c, unac/unactest1.c: + initial import + +2006-01-06 07:59 +0000 dockes (52c86ee701fd) + + * src/index/Makefile, src/qtgui/recoll.pro: + ensure relink for changed lib + +2006-01-05 16:37 +0000 dockes (a2ef019b6308) + + * src/common/unacpp.cpp, src/common/unacpp.h, src/lib/Makefile, + src/rcldb/rcldb.cpp, src/utils/Makefile: + Use proper unicode lowercasing + +2006-01-05 16:16 +0000 dockes (158267ddbcb6) + + * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, + src/utils/caseconvert.h, src/utils/gencasefold.sh: new file. + * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, + src/utils/caseconvert.h, src/utils/gencasefold.sh: + *** empty log message *** + +2006-01-05 10:27 +0000 dockes (f1af15efef34) + + * packaging/rpm/recoll.spec: new file. + * packaging/rpm/recoll.spec: + *** empty log message *** + +2006-01-05 10:24 +0000 dockes (55284d2ed66e) + + * src/Makefile, src/recollinstall.in: + install tweaks for rpm compatibility + +2006-01-04 11:33 +0000 dockes (236c587eb180) + + * src/VERSION, src/common/rclconfig.h, src/makesrcdist.sh, + src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recoll_fr.ts, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/recollinstall.in, src/utils/smallut.cpp, src/utils/smallut.h: + add menu entry to start browser on html doc + +2006-01-04 11:16 +0000 dockes (2075c2a6d71e) + + * src/INSTALL, src/README: + *** empty log message *** + +2006-01-04 11:09 +0000 dockes (9a4cceb219aa) + + * src/doc/user/Makefile, src/doc/user/docbook.css, + src/doc/user/usermanual.sgml: new file. + * src/doc/user/Makefile, src/doc/user/docbook.css, + src/doc/user/usermanual.sgml: + *** empty log message *** + +2006-01-03 11:35 +0000 dockes (188ffc87b7d3) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-12-16 10:08 +0000 dockes (789da9d2380c) + + * src/query/Makefile, src/query/xadump.cpp, src/unac/unac.c, + src/utils/mimeparse.cpp: + 64 bits fixes + +2005-12-16 10:06 +0000 dockes (cf18fa6d2a7b) + + * src/Makefile, src/mk/localdefs.in, src/qtgui/main.cpp, + src/qtgui/recoll.pro, src/recollinstall.in: + get prefix to really work + +2005-12-16 08:00 +0000 dockes (cca6b156e460) + + * src/excludefile: + dont copy localdefs + +2005-12-16 07:58 +0000 dockes (7b20df9408ce) + + * src/mk/localdefs: deleted file. + * src/mk/localdefs: + *** empty log message *** + +2005-12-15 14:39 +0000 dockes (959564d835fd) + + * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/sampleconf/recoll.conf.in: + user prefs tweaks. Allow switching stemlang from ui + +2005-12-15 13:41 +0000 dockes (bf3c45bf931d) + + * src/qtgui/main.cpp: + *** empty log message *** + +2005-12-14 16:15 +0000 dockes (229d1902798e) + + * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + user interface preferences settable from ui + +2005-12-14 11:00 +0000 dockes (3e5f6f1c000d) + + * src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp, src/internfile/mh_html.cpp, + src/internfile/mh_text.cpp, src/qtgui/preview/preview.ui.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/Makefile: + allow indexing individual files. Fix pb with preview and charsets + (local defcharset ignored) + +2005-12-13 17:20 +0000 dockes (0895be2b8196) + + * src/qtgui/main.cpp, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h: + add allTerms checkbutton, save state in settings + +2005-12-13 17:20 +0000 dockes (b522d74e613c) + + * src/qtgui/advsearch.ui: + avoid activating random buttons when typing CR... + +2005-12-13 12:43 +0000 dockes (0448daf8c23e) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist, src/common/rclconfig.cpp, + src/doc/prog/Doxyfile, src/doc/prog/Makefile, + src/doc/prog/filters.txt, src/qtgui/main.cpp, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/utils/fstreewalk.cpp, src/utils/pathut.cpp, + src/utils/pathut.h, src/utils/smallut.cpp, src/utils/wipedir.cpp: + pgup/down in result list + +2005-12-08 08:44 +0000 dockes (ec006d171797) + + * src/common/Makefile, src/internfile/htmlparse.cpp, + src/internfile/htmlparse.h, src/internfile/internfile.cpp, + src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp, + src/internfile/myhtmlparse.h: + process text from html files without a tag + +2005-12-07 15:41 +0000 dockes (a44bf0c6a081 [RECOLL-1_0_14]) + + * src/VERSION, src/internfile/mh_mail.cpp, + src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, + src/query/docseq.cpp, src/utils/utf8iter.h: + freebsd 4 port + +2005-12-06 15:59 +0000 dockes (812bc8f9232b) + + * packaging/FreeBSD/recoll/distinfo: + 0.13 really now + +2005-12-06 15:41 +0000 dockes (3a7b74624ff4) + + * src/recollinstall.in: + strip execs + +2005-12-06 15:20 +0000 dockes (fa8c19799a41) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + plist: + recoll-0.13 + +2005-12-06 15:10 +0000 dockes (b6df28b0d0e3) + + * src/README: + *** empty log message *** + +2005-12-06 15:10 +0000 dockes (e66dba4d628c [RECOLL-1_0_13]) + + * src/Makefile, src/VERSION, src/recollinstall.in: + no recollinstall install + +2005-12-06 12:55 +0000 dockes (cbfcc5627111) + + * packaging/FreeBSD/recoll/pkg-descr: + *** empty log message *** + +2005-12-06 10:30 +0000 dockes (d132e05e40ac) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist: + *** empty log message *** + +2005-12-06 09:40 +0000 dockes (f93d6a9b2336) + + * src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp: + previous html fix didnt work + +2005-12-06 08:35 +0000 dockes (a3eec94f6861) + + * src/VERSION, src/internfile/internfile.cpp, + src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp: + fix nasty html parse bug introduced in 1.0.9 + +2005-12-06 07:16 +0000 dockes (c1ccf42bf359 [RECOLL-1_0_12, RECOLL-1_0_11]) + + * src/qtgui/recollmain.ui: + move search/clear buttons to the left side + +2005-12-05 17:47 +0000 dockes (37952b251aee) + + * src/VERSION: + 1.0.11? + +2005-12-05 16:45 +0000 dockes (eecd7a311e8f) + + * src/qtgui/recollmain.ui.h: + no %F on solaris8 + +2005-12-05 16:13 +0000 dockes (cd9899dcdec1) + + * src/utils/copyfile.cpp: + *** empty log message *** + +2005-12-05 16:13 +0000 dockes (7e7e675138b2) + + * src/query/docseq.cpp, src/query/docseq.h: + avoid unneeded getDoc(0) + normalize private var names + +2005-12-05 15:00 +0000 dockes (6aa562bb0180) + + * src/INSTALL, src/Makefile, src/README, src/qtgui/main.cpp: + *** empty log message *** + +2005-12-05 14:09 +0000 dockes (d3954ac2c5ec) + + * src/utils/copyfile.cpp, src/utils/copyfile.h: new file. + * src/common/rclconfig.cpp, src/lib/Makefile, src/mk/localdefs, + src/mk/localdefs.in, src/utils/copyfile.cpp, src/utils/copyfile.h: + create personal config if it does not exist + +2005-12-05 12:02 +0000 dockes (6d38fb24e3b1) + + * src/qtgui/images/asearch.png, src/qtgui/images/history.png, + src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, + src/qtgui/images/sortparms.png: new file. + * src/qtgui/images/asearch.png, src/qtgui/images/history.png, + src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, + src/qtgui/images/sortparms.png, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/qtgui/sort.ui.h, + src/query/docseq.cpp, src/query/sortseq.cpp: + use toolbar buttons for prev/next + misc cleanups + +2005-12-05 10:39 +0000 dockes (55a212b17808) + + * src/rcldb/rcldb.cpp: + also index file path as terms + +2005-12-04 17:10 +0000 dockes (a4005adeece9) + + * src/qtgui/recoll.pro: + more + +2005-12-04 17:10 +0000 dockes (15ce414ea700) + + * src/common/textsplit.cpp: + split stdin + +2005-12-04 14:58 +0000 dockes (369372321681) + + * src/qtgui/recollmain.ui: + *** empty log message *** + +2005-12-02 16:18 +0000 dockes (b8ea8500fe26) + + * src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, + src/query/sortseq.cpp, src/query/sortseq.h, src/rcldb/rcldb.h: + 1st version of sorting interface. Needs polishing + +2005-12-02 16:17 +0000 dockes (fba2b55c4ba7) + + * src/filters/rclpdf: + new version of pdftotext broke us + +2005-12-02 16:17 +0000 dockes (a31234c89a73) + + * src/common/rclconfig.cpp, src/recollinstall.in, + src/sampleconf/recoll.conf.in: + install filters to /usr/local + +2005-12-02 14:18 +0000 dockes (7b585689ce4a) + + * src/query/sortseq.cpp: + *** empty log message *** + +2005-12-01 16:23 +0000 dockes (c7393c3bc8b5) + + * src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/query/sortseq.cpp, + src/query/sortseq.h: new file. + * src/lib/Makefile, src/qtgui/recoll.pro, src/qtgui/recollmain.ui.h, + src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/query/sortseq.cpp, + src/query/sortseq.h: + sorting 1st steps + +2005-11-30 18:37 +0000 dockes (ddba9ec4f65f) + + * src/configure: + make recollinstall executable + +2005-11-30 18:28 +0000 dockes (35f236d5ad1f) + + * src/configure.ac: + make recollinstall executable + +2005-11-30 18:26 +0000 dockes (580ae261b629) + + * src/sampleconf/recoll.conf.in: + keep log level at 4 for index feedback + +2005-11-30 18:20 +0000 dockes (2fb51c4552fb) + + * src/sampleconf/recoll.conf.in: + decrease log level + +2005-11-30 18:10 +0000 dockes (0ad46d9bcaa5) + + * src/query/history.cpp: + *** empty log message *** + +2005-11-30 18:05 +0000 dockes (653e0a145731) + + * src/qtgui/form1.ui.h: deleted file. + * src/excludefile, src/qtgui/form1.ui.h: + *** empty log message *** + +2005-11-30 18:04 +0000 dockes (dfff4ecb1918) + + * src/qtgui/form1.ui: deleted file. + * src/excludefile, src/qtgui/form1.ui: + *** empty log message *** + +2005-11-30 18:01 +0000 dockes (a63a8d7c49f3) + + * src/excludefile: + *** empty log message *** + +2005-11-30 17:58 +0000 dockes (7676c325de57) + + * src/excludefile: + *** empty log message *** + +2005-11-30 17:58 +0000 dockes (6ddc4c210c87) + + * src/utils/transcode.cpp: + try harder to convert bad encodings + +2005-11-30 10:36 +0000 dockes (7e0aab848f91 [RECOLL-1_0_10]) + + * src/README, src/qtgui/recollmain.ui: + *** empty log message *** + +2005-11-30 10:35 +0000 dockes (1f97b79ea735) + + * src/VERSION: + v1.0.10 + +2005-11-30 10:25 +0000 dockes (3c2bcb1ec527) + + * src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + disable/enable buttons dep. on state + +2005-11-30 09:46 +0000 dockes (a75b091acbae) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, + src/sampleconf/mimeconf: + *** empty log message *** + +2005-11-30 09:46 +0000 dockes (30a527e5014f) + + * src/index/indexer.cpp, src/index/indexer.h, + src/index/recollindex.cpp, src/rcldb/rcldb.cpp: + add option to rezero db before index + +2005-11-28 15:31 +0000 dockes (d9e31422258b) + + * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, + src/query/docseq.cpp, src/query/docseq.h, src/query/history.cpp, + src/query/history.h: + store and display dates in history. Needs more work + +2005-11-25 14:36 +0000 dockes (18bc54d4e426) + + * src/qtgui/recollmain.ui.h, src/query/history.cpp, + src/utils/conftree.cpp, src/utils/smallut.cpp, src/utils/smallut.h: + show history newest first + prune duplicate entries + +2005-11-25 10:26 +0000 dockes (3ad346d3f29e) + + * src/qtgui/main.cpp, src/qtgui/recoll_fr.ts, src/recollinstall.in: + install translations to share/recoll/translations + +2005-11-25 10:02 +0000 dockes (6ed5669a337b) + + * src/query/docseq.cpp, src/query/docseq.h: new file. + * src/lib/Makefile, src/qtgui/main.cpp, src/qtgui/recoll.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/docseq.cpp, src/query/docseq.h: + 1st version of doc history + +2005-11-25 09:14 +0000 dockes (69bab5c09012) + + * src/index/indexer.cpp, src/index/mimetype.cpp, + src/sampleconf/mimeconf: + *** empty log message *** + +2005-11-25 09:13 +0000 dockes (55e99bcc0a46) + + * src/common/rclconfig.cpp, src/common/rclconfig.h: + get all mime list from mimeconf, not mimemap + +2005-11-25 09:12 +0000 dockes (87febfb9c3be) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + added method to retrieve doc from path/ipath + +2005-11-25 08:53 +0000 dockes (756168516697) + + * src/Makefile, src/internfile/mimehandler.cpp, src/rcldb/rcldb.h: + *** empty log message *** + +2005-11-25 08:50 +0000 dockes (6fda25d19678) + + * src/utils/conftree.cpp, src/utils/conftree.h, src/utils/smallut.cpp, + src/utils/smallut.h: + add methods useful for history. move stuff to smallut + +2005-11-25 08:49 +0000 dockes (bd6b75c162a5) + + * src/utils/base64.cpp: + Strip extra null byte that we were appending + +2005-11-24 18:21 +0000 dockes (ba604719481c) + + * src/query/history.cpp, src/query/history.h: new file. + * src/query/Makefile, src/query/history.cpp, src/query/history.h, + src/query/qtry.cpp, src/query/xadump.cpp: + *** empty log message *** + +2005-11-24 07:16 +0000 dockes (1fc7382994a5) + + * src/recollinstall.in, src/sampleconf/recoll.conf.in: new file. + * src/bincimapmime/address.cc, src/bincimapmime/convert.cc, + src/bincimapmime/iodevice.cc, src/bincimapmime/iofactory.cc, + src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime- + parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, + src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- + printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime + /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/trbinc.cc, + src/common/rclconfig.cpp, src/common/textsplit.cpp, + src/common/unacpp.cpp, src/configure, src/configure.ac, + src/index/csguess.cpp, src/index/indexer.cpp, + src/index/mimetype.cpp, src/internfile/htmlparse.cpp, + src/internfile/htmlparse.h, src/internfile/internfile.cpp, + src/internfile/mh_exec.cpp, src/internfile/mh_html.cpp, + src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp, + src/internfile/mimehandler.cpp, src/makestaticdist.sh, + src/qtgui/advsearch.ui.h, src/qtgui/main.cpp, + src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui.h, + src/qtgui/preview/pvmain.cpp, src/qtgui/recollmain.ui.h, + src/query/qtry.cpp, src/query/qxtry.cpp, src/query/xadump.cpp, + src/rcldb/pathhash.cpp, src/rcldb/rcldb.cpp, src/recollinstall.in, + src/sampleconf/recoll.conf.in, src/utils/base64.cpp, + src/utils/execmd.cpp, src/utils/fstreewalk.cpp, + src/utils/idfile.cpp, src/utils/mimeparse.cpp, src/utils/pathut.cpp, + src/utils/readfile.cpp, src/utils/smallut.cpp, src/utils/smallut.h, + src/utils/transcode.cpp, src/utils/utf8iter.cpp, + src/utils/wipedir.cpp: + *** empty log message *** + +2005-11-23 13:12 +0000 dockes (a8ff464ec720) + + * src/recollinstall, src/sampleconf/recoll.conf: deleted file. + * src/recollinstall, src/sampleconf/recoll.conf: + *** empty log message *** + +2005-11-23 11:11 +0000 dockes (4ba2ad248537) + + * src/utils/execmd.cpp: + *** empty log message *** + +2005-11-23 11:00 +0000 dockes (66cac25635e1) + + * src/INSTALL, src/README, src/rcldb/rcldb.cpp: + *** empty log message *** + +2005-11-23 10:57 +0000 dockes (45f106d04652 [RECOLL-1_0_9]) + + * src/Makefile: + use prefix instead of PREFIX + +2005-11-23 10:19 +0000 dockes (e7a6edd38c56) + + * src/Makefile, src/VERSION, src/filters/rclrtf, src/index/Makefile, + src/index/mimetype.cpp, src/utils/debuglog.cpp, + src/utils/mimeparse.cpp: + *** empty log message *** + +2005-11-23 10:18 +0000 dockes (4e530d6556d2) + + * src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/recollmain.ui.h: + document already shown test was wrong, wouldnt show more docs from + same file + +2005-11-23 10:17 +0000 dockes (9944ac86338d) + + * src/utils/execmd.cpp: + need to do _exit not exit after exec failure + +2005-11-23 10:16 +0000 dockes (085c66533884) + + * src/internfile/mh_html.cpp, src/utils/smallut.cpp, + src/utils/smallut.h: + improve charset name comparison + +2005-11-21 17:18 +0000 dockes (9c398b7ee69e [RECOLL-1_0_8]) + + * src/configure, src/configure.ac, src/index/mimetype.cpp, + src/internfile/myhtmlparse.cpp, src/mk/Linux, src/mk/SunOS, + src/recollinstall, src/utils/execmd.cpp: + glitches in linux/solaris compil. + install + +2005-11-21 16:16 +0000 dockes (7594b3dd0dc5) + + * src/README: + *** empty log message *** + +2005-11-21 16:06 +0000 dockes (8a82b3826a4a) + + * src/VERSION: + *** empty log message *** + +2005-11-21 16:05 +0000 dockes (9cc42706006d) + + * src/filters/rclrtf: new file. + * src/filters/rclrtf, src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/recoll.conf: + add support for rtf + +2005-11-21 16:04 +0000 dockes (8169ca3ae210) + + * src/Makefile, src/makestaticdist.sh, src/recollinstall: + install pics and samples to $PREFIX/local/recoll + +2005-11-21 14:32 +0000 dockes (f0aaac1df843) + + * src/filters/rclgaim: + just needs awk + +2005-11-21 14:31 +0000 dockes (88649af9a0ac [RECOLL-1_0_7]) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/indexer.cpp, src/index/mimetype.cpp, src/index/mimetype.h, + src/internfile/internfile.cpp, src/internfile/mh_html.cpp, + src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, + src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h, + src/lib/Makefile, src/qtgui/recollmain.ui.h, + src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/recoll.conf: + mimemap processing recentered in rclconfig. Handle directory-local + suffix to mime-type definitions. Implement gaim log handling + +2005-11-18 17:03 +0000 dockes (ae7d483398d2) + + * src/filters/rclgaim: new file. + * src/filters/rclgaim: + *** empty log message *** + +2005-11-18 15:19 +0000 dockes (9c8cb27e5749) + + * src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mh_exec.cpp, src/internfile/mimehandler.h, + src/utils/execmd.h: + misc cleanup + tell filters if working for preview or index + +2005-11-18 13:52 +0000 dockes (9d83fd6a7d8c) + + * src/utils/execmd.cpp, src/utils/execmd.h: + add putenv interface + +2005-11-18 13:23 +0000 dockes (c3d0cfc77a9f) + + * src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, + src/internfile/mh_text.cpp, src/internfile/mh_text.h: new file. + * src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, + src/internfile/mh_html.cpp, src/internfile/mh_html.h, + src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, + src/internfile/mh_text.cpp, src/internfile/mh_text.h, + src/internfile/mimehandler.cpp, src/lib/Makefile: + restructuring on mimehandler files + +2005-11-17 17:39 +0000 dockes (e530dcacaf42) + + * src/VERSION: + *** empty log message *** + +2005-11-17 17:36 +0000 dockes (64437283f61f) + + * src/rcldb/rcldb.cpp: + use OP_FILTER instead of OP_AND to filter on file types + +2005-11-17 12:47 +0000 dockes (e9efe66d79c0) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/qtgui/main.cpp, src/qtgui/recollmain.ui, + src/sampleconf/recoll.conf, src/utils/conftree.cpp, + src/utils/conftree.h: + allow tilde expansion for section names in config file + +2005-11-16 18:31 +0000 dockes (e319e6fa047d) + + * src/qtgui/recollmain.ui.h: + *** empty log message *** + +2005-11-16 17:30 +0000 dockes (70dbf29f84e0) + + * src/excludefile: + *** empty log message *** + +2005-11-16 17:29 +0000 dockes (4c957598f6fd [RECOLL-1_0_6]) + + * src/mk/localdefs, src/rcldb/rcldb.cpp: + use and_maybe in adv search + +2005-11-16 15:07 +0000 dockes (a19870cd6761) + + * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, + src/qtgui/main.cpp, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/recoll.h, + src/qtgui/recollmain.ui.h, src/sampleconf/mimeconf, + src/sampleconf/recoll.conf: + Optionnally show mime type icons in result list + +2005-11-16 15:05 +0000 dockes (6464421540ca) + + * src/qtgui/mtpics/README, src/qtgui/mtpics/document.png, + src/qtgui/mtpics/drawing.png, src/qtgui/mtpics/html.png, + src/qtgui/mtpics/message.png, src/qtgui/mtpics/mozilla_doc.png, + src/qtgui/mtpics/pdf.png, src/qtgui/mtpics/postscript.png, + src/qtgui/mtpics/presentation.png, src/qtgui/mtpics/soffice.png, + src/qtgui/mtpics/spreadsheet.png, src/qtgui/mtpics/txt.png, + src/qtgui/mtpics/wordprocessing.png: new file. + * src/qtgui/mtpics/README, src/qtgui/mtpics/document.png, + src/qtgui/mtpics/drawing.png, src/qtgui/mtpics/html.png, + src/qtgui/mtpics/message.png, src/qtgui/mtpics/mozilla_doc.png, + src/qtgui/mtpics/pdf.png, src/qtgui/mtpics/postscript.png, + src/qtgui/mtpics/presentation.png, src/qtgui/mtpics/soffice.png, + src/qtgui/mtpics/spreadsheet.png, src/qtgui/mtpics/txt.png, + src/qtgui/mtpics/wordprocessing.png: + *** empty log message *** + +2005-11-16 11:22 +0000 dockes (f29236269564) + + * src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h: + Implemented better feedback during preview loading + +2005-11-16 08:17 +0000 dockes (44b8c2233623) + + * src/Makefile, src/VERSION, src/qtgui/main.cpp, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h: + about dialog, remember previous mainwin geometry + +2005-11-14 09:59 +0000 dockes (f196f00bd521) + + * src/internfile/internfile.cpp, src/internfile/internfile.h, + src/qtgui/recollmain.ui.h: + fix rare case where indexed file could not be previewed because of + change in file identification config param + +2005-11-14 09:57 +0000 dockes (5610887cf602) + + * src/index/indexer.cpp: + comment + +2005-11-14 09:56 +0000 dockes (b6c7dd9504b9) + + * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + stem expansion was never done for adv search + +2005-11-12 14:36 +0000 dockes (87b02b667eef) + + * src/README, src/mk/Linux: + *** empty log message *** + +2005-11-12 14:33 +0000 dockes (5743f1558790) + + * src/mk/localdefs.in: + typo + +2005-11-12 14:31 +0000 dockes (0dd4948b5c2f) + + * src/Makefile, src/configure, src/configure.ac: + more config tweaks + +2005-11-12 14:24 +0000 dockes (6d47a227c1b2) + + * src/utils/conftree.cpp, src/utils/conftree.h, + src/utils/debuglog.cpp, src/utils/debuglog.h: new file. + * src/utils/conftree.cpp, src/utils/conftree.h, + src/utils/debuglog.cpp, src/utils/debuglog.h: + local versions of utility files + +2005-11-12 14:23 +0000 dockes (c77e47fdc6fb) + + * src/Makefile: + *** empty log message *** + +2005-11-12 14:19 +0000 dockes (49499e32e341) + + * src/configure.ac, src/mk/localdefs, src/mk/localdefs.in: new file. + * src/Makefile, src/configure, src/configure.ac, src/mk/Darwin, + src/mk/FreeBSD, src/mk/Linux, src/mk/SunOS, src/mk/commondefs, + src/mk/localdefs, src/mk/localdefs.in: + introduced some autoconf + +2005-11-12 11:26 +0000 dockes (b13e733c2796) + + * src/Makefile, src/bincimapmime/Makefile, src/common/Makefile, + src/index/Makefile, src/lib/Makefile, src/mk/commondefs, + src/qtgui/recoll.pro, src/query/Makefile, src/sampleconf/mimemap, + src/utils/Makefile: + cleaned-up makes + +2005-11-10 08:47 +0000 dockes (06490e6e7dc1) + + * src/index/Makefile, src/index/indexer.cpp, src/index/indexer.h, + src/index/mimetype.cpp, src/index/mimetype.h, + src/internfile/internfile.cpp, src/sampleconf/recoll.conf: + add config parameter to decide if we use the file command as a final + step of mimetype identification + +2005-11-10 08:46 +0000 dockes (d9a64999d22d) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap: + add .Z compressed files + +2005-11-09 21:40 +0000 dockes (1dd753a59d1c) + + * src/sampleconf/mimemap: + add .odt -> openoffice. Add .php and others to ignored types + +2005-11-09 21:39 +0000 dockes (a8b54cf24c83) + + * src/common/rclinit.cpp: + test cleanup and sigcleanup not zero for small uts that dont need + this + +2005-11-08 21:02 +0000 dockes (344fc56239c8) + + * src/internfile/internfile.cpp, src/internfile/mh_html.cpp, + src/internfile/mh_html.h, src/internfile/mh_mail.cpp, + src/internfile/mh_mail.h, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h: + renamed MimeHandler::worker to mkDoc + comments for doxygen + +2005-11-08 21:02 +0000 dockes (1ac76bfea47d) + + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist, src/doc/prog/filters.txt, + src/doc/prog/top.txt: new file. + * packaging/FreeBSD/recoll/Makefile, + packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- + descr, packaging/FreeBSD/recoll/pkg-plist, src/doc/prog/Doxyfile, + src/doc/prog/Makefile, src/doc/prog/filters.txt, + src/doc/prog/top.txt: + *** empty log message *** + +2005-11-08 21:00 +0000 dockes (54bcdfd186f1) + + * src/doc/prog/Doxyfile, src/doc/prog/Makefile: new file. + * src/doc/prog/Doxyfile, src/doc/prog/Makefile: + *** empty log message *** + +2005-11-07 15:52 +0000 dockes (a0bde5fbc55b [RECOLL-1_0_5]) + + * src/INSTALL, src/Makefile, src/README, src/excludefile, + src/makesrcdist.sh, src/makestaticdist.sh: + *** empty log message *** + +2005-11-07 15:37 +0000 dockes (c6a8f5375981) + + * src/README: + *** empty log message *** + +2005-11-07 15:36 +0000 dockes (5ca00f4db306) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-11-07 15:11 +0000 dockes (8ae633ae4194) + + * src/VERSION: + *** empty log message *** + +2005-11-07 15:06 +0000 dockes (6be191f54656) + + * src/Makefile, src/mk/commondefs, src/recollinstall: + fixed installation script + +2005-11-07 11:21 +0000 dockes (e48ddf065716) + + * src/VERSION: + *** empty log message *** + +2005-11-06 15:07 +0000 dockes (fef6e5d66e29 [RECOLL-1_05]) + + * src/qtgui/idxthread.cpp, src/qtgui/main.cpp, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/utils/base64.cpp: + slightly better status printing while loading preview + +2005-11-06 11:16 +0000 dockes (0fa0ac2c3e5b) + + * src/rcldb/pathhash.cpp, src/rcldb/pathhash.h, src/utils/base64.cpp, + src/utils/base64.h, src/utils/md5.cpp, src/utils/md5.h: new file. + * src/lib/Makefile, src/rcldb/pathhash.cpp, src/rcldb/pathhash.h, + src/rcldb/rcldb.cpp, src/utils/base64.cpp, src/utils/base64.h, + src/utils/md5.cpp, src/utils/md5.h, src/utils/mimeparse.cpp: + limit path therm length through hashing + +2005-11-05 15:30 +0000 dockes (eea6ede9ce9a) + + * src/INSTALL, src/README, src/VERSION: + *** empty log message *** + +2005-11-05 15:29 +0000 dockes (c99e6c9d50df) + + * src/rcldb/rcldb.cpp: + debug message + +2005-11-05 15:17 +0000 dockes (a3463f8f8c63) + + * src/mk/commondefs: + unused def + +2005-11-05 14:40 +0000 dockes (47c04f4507d0 [RECOLL-1_04]) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/rclinit.cpp, src/common/rclinit.h, src/index/indexer.cpp, + src/index/recollindex.cpp, src/internfile/mh_mail.cpp, src/mk/SunOS, + src/qtgui/main.cpp, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + separate file and document dates (mainly for email folders). Better + check configuration at startup + +2005-11-02 12:36 +0000 dockes (e0d52b43cd5c) + + * src/lib/Makefile, src/mk/commondefs: + add def for RANLIB + +2005-11-01 10:55 +0000 dockes (2b858432af00) + + * src/mk/Darwin: new file. + * src/mk/Darwin: + *** empty log message *** + +2005-10-31 08:59 +0000 dockes (65fd4f89de80) + + * src/internfile/mh_mail.cpp, src/utils/mimeparse.cpp: + fixed base64 decoding of email parts: str[x] = ch does not adjust + length! and be more lenient with encoding errors + +2005-10-22 13:10 +0000 dockes (9a5b142d31f3) + + * src/README: + *** empty log message *** + +2005-10-22 13:10 +0000 dockes (d5ccf5480db1 [RECOLL-1_03]) + + * src/VERSION, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + update status line when starting lengthy operations + +2005-10-22 07:29 +0000 dockes (df8ad947685b) + + * src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + get clicks in res list to behave: drag->no click. dblclick->no + single click + +2005-10-22 05:35 +0000 dockes (c566d157cfd3) + + * src/qtgui/recoll_fr.ts: new file. + * src/qtgui/main.cpp, src/qtgui/recoll.pro, src/qtgui/recoll_fr.ts: + i8n + +2005-10-21 15:45 +0000 dockes (34b797e01868) + + * src/mk/commondefs: new file. + * src/mk/commondefs: + *** empty log message *** + +2005-10-21 15:41 +0000 dockes (08f9ad818cb3 [RECOLL-1_02]) + + * src/makestaticdist.sh, src/recollinstall: + more verbosity in install + +2005-10-21 15:22 +0000 dockes (aa642ead5a8e) + + * src/INSTALL: + *** empty log message *** + +2005-10-21 15:11 +0000 dockes (1c74d6d926b7) + + * src/INSTALL: + *** empty log message *** + +2005-10-21 14:14 +0000 dockes (662fe9bab837) + + * src/excludefile: + *** empty log message *** + +2005-10-21 14:11 +0000 dockes (1856de4bf3f6) + + * src/makestaticdist.sh: new file. + * src/Makefile, src/makestaticdist.sh: + static bin dists + +2005-10-21 13:34 +0000 dockes (0c861c8b6029) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-21 13:33 +0000 dockes (7256b6e4e2ff) + + * src/Makefile, src/excludefile, src/index/Makefile, + src/makesrcdist.sh, src/mk/FreeBSD, src/mk/Linux, src/mk/SunOS, + src/qtgui/recoll.pro: + rearrange make includes+prepare bin static distrib + +2005-10-21 12:15 +0000 dockes (a9773a1a4715) + + * src/unac/unac.c: + fix args to iconv to get rid of warnings + +2005-10-21 08:14 +0000 dockes (f50d252ec29b) + + * src/Makefile, src/VERSION, src/excludefile, src/mk/FreeBSD, + src/mk/Linux, src/qtgui/preview/pvmain.cpp, src/utils/smallut.cpp: + more small build tweaks. use mkdtemp if available + +2005-10-20 16:20 +0000 dockes (b5fe53035720 [RECOLL-1_01]) + + * src/qtgui/advsearch.ui, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h: + CR->search in advanced dialog. ^W close tab in preview + +2005-10-20 15:42 +0000 dockes (a9e9ecfba2d2) + + * src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, + src/filters/rclsoff, src/mk/SunOS: + small fixes for SunOS + +2005-10-20 12:17 +0000 dockes (bc70bba2564c) + + * src/README, src/makesrcdist.sh: + *** empty log message *** + +2005-10-20 12:17 +0000 dockes (4e8de2aee40d) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-20 12:17 +0000 dockes (39b33b1f4e36) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-20 12:16 +0000 dockes (45a324ad4baa) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-20 12:16 +0000 dockes (73b1f99aef21) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-20 12:12 +0000 dockes (b3a8d1bceb51) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-20 11:38 +0000 dockes (5966cd48c62c) + + * src/sampleconf/recoll.conf: + defaultlanguage->english + +2005-10-20 11:33 +0000 dockes (4ba3bd42973e) + + * src/recollinstall: new file. + * src/bincimapmime/Makefile, src/filters/rcldoc, src/filters/rclpdf, + src/filters/rclps, src/filters/rclsoff, + src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/recollinstall: + small installation tweaks + +2005-10-20 08:34 +0000 dockes (8ce6cff4ca9c) + + * src/Makefile, src/VERSION, src/bincimapmime/Makefile, + src/excludefile, src/lib/Makefile, src/mk/FreeBSD, + src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui.h, + src/qtgui/recoll.pro: + small warning and compilation adjustments + +2005-10-20 07:51 +0000 dockes (b6f58b26d846 [RECOLL-1_0]) + + * src/configure: new file. + * src/README, src/configure: + *** empty log message *** + +2005-10-19 16:29 +0000 dockes (46a91fdb7a8e) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-10-19 16:27 +0000 dockes (92e16891b11d) + + * src/INSTALL: + *** empty log message *** + +2005-10-19 16:09 +0000 dockes (0dda1bd16921) + + * src/README, src/VERSION: + *** empty log message *** + +2005-10-19 15:22 +0000 dockes (88cadb2e703e) + + * src/qtgui/recollmain.ui: + *** empty log message *** + +2005-10-19 14:14 +0000 dockes (61cd7c267dec) + + * src/common/rclconfig.cpp, src/qtgui/advsearch.ui.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/idfile.cpp, + src/utils/idfile.h: + implemented filtering on file subtree + +2005-10-19 10:21 +0000 dockes (598116a30bfb) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, + src/filters/rclsoff, src/qtgui/advsearch.ui, + src/qtgui/advsearch.ui.h, src/qtgui/main.cpp, + src/qtgui/plaintorich.cpp, src/qtgui/recoll.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + most of adv search working. Still need subtree/filename filters + +2005-10-17 13:36 +0000 dockes (6ce40ecb81f6) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/preview/pvmain.cpp, src/qtgui/recoll.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/utils/Makefile: + implemented dialog/glue for advanced search + +2005-10-15 12:18 +0000 dockes (b57626e188f9) + + * src/index/indexer.cpp, src/internfile/mh_mail.cpp, + src/utils/mimeparse.cpp, src/utils/mimeparse.h: + decode encoded mail headers, plus use message date instead of file + mtime + +2005-10-10 13:25 +0000 dockes (3797f12a0832) + + * src/common/textsplit.h: + comments + +2005-10-10 13:24 +0000 dockes (a339c123dcb9) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: + ckpt + +2005-10-10 12:29 +0000 dockes (e88bad1f996b) + + * src/qtgui/advsearch.ui, src/qtgui/main.cpp, + src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, + src/qtgui/preview/pvmain.cpp, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h: + ckpt + +2005-09-27 06:20 +0000 dockes (8b147a42b660) + + * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: new + file. + * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, + src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: + *** empty log message *** + +2005-09-26 16:17 +0000 dockes (783900fcd3e7) + + * src/qtgui/recoll.pro: + *** empty log message *** + +2005-09-22 16:22 +0000 dockes (1e6ccf2c2fdc) + + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: new file. + * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: + *** empty log message *** + +2005-09-22 15:00 +0000 dockes (db2d876f2a2b) + + * src/qtgui/recollmain.ui.h: + *** empty log message *** + +2005-09-22 14:09 +0000 dockes (4455c0eeffd4) + + * src/common/textsplit.cpp: + adjust start/end of word when trimming + +2005-09-22 11:10 +0000 dockes (3b9d4fc5b507) + + * src/common/textsplit.cpp: + fix problems with word followed by . + +2005-05-18 08:42 +0000 dockes (03bc1f1290cd) + + * src/qtgui/recoll.pro: + *** empty log message *** + +2005-05-17 11:46 +0000 dockes (cff6e901fde8) + + * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h: new file. + * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, + src/qtgui/recoll.pro: + *** empty log message *** + +2005-05-17 06:30 +0000 dockes (9a44703bd049 [RECOLL-0_7]) + + * src/README: + *** empty log message *** + +2005-05-17 06:30 +0000 dockes (d2265051082d) + + * src/qtgui/recollmain.ui.h: + escape < to < in rich text + +2005-04-08 07:32 +0000 dockes (3917ab1cc937) + + * src/README: + *** empty log message *** + +2005-04-08 07:32 +0000 dockes (2f2439c9590a) + + * src/mk/SunOS: new file. + * src/Makefile, src/mk/SunOS, src/utils/Makefile: + works on solaris8 + +2005-04-07 09:05 +0000 dockes (0264f1839b92) + + * src/utils/idfile.cpp, src/utils/idfile.h: new file. + * src/index/mimetype.cpp, src/lib/Makefile, src/sampleconf/mimemap, + src/utils/Makefile, src/utils/idfile.cpp, src/utils/idfile.h: + replaced /usr/bin/file exec with internal code + +2005-04-06 10:20 +0000 dockes (ba9162debe5a) + + * src/bincimapmime/AUTHORS, src/bincimapmime/COPYING: new file. + * src/INSTALL, src/VERSION, src/bincimapmime/AUTHORS, + src/bincimapmime/COPYING, src/bincimapmime/mime-inputsource.h, + src/index/indexer.cpp, src/internfile/mh_mail.cpp, + src/makesrcdist.sh, src/mk/FreeBSD, src/mk/Linux, + src/qtgui/main.cpp, src/rcldb/rcldb.cpp, src/sampleconf/recoll.conf, + src/utils/smallut.h, src/utils/wipedir.cpp: + re-port to linux + +2005-04-06 09:18 +0000 dockes (d8add828aa6b) + + * src/README: + *** empty log message *** + +2005-04-06 09:13 +0000 dockes (7d5759a43255) + + * src/README: + *** empty log message *** + +2005-04-05 09:35 +0000 dockes (6232ca052972) + + * src/common/rclinit.cpp, src/common/rclinit.h: new file. + * src/common/rclinit.cpp, src/common/rclinit.h, + src/index/mimetype.cpp, src/index/recollindex.cpp, + src/internfile/internfile.cpp, src/internfile/mh_mail.cpp, + src/lib/Makefile, src/qtgui/main.cpp, src/rcldb/rcldb.cpp, + src/sampleconf/mimemap: + *** empty log message *** + +2005-04-04 13:18 +0000 dockes (e69c810eb5b1) + + * src/index/indexer.cpp, src/index/mimetype.cpp, + src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, + src/rcldb/rcldb.cpp, src/sampleconf/mimeconf, + src/utils/fstreewalk.cpp, src/utils/fstreewalk.h: + *** empty log message *** + +2005-03-31 10:04 +0000 dockes (9428bb11ff77) + + * src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- + parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, + src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime.h, + src/bincimapmime/trbinc.cc, src/common/rclconfig.cpp, + src/internfile/mh_html.cpp, src/internfile/mh_html.h, + src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, + src/rcldb/rcldb.cpp: + mail handling 1st working version + +2005-03-25 09:40 +0000 dockes (408a2650e963 [RECOLL-0_6]) + + * src/bincimapmime/00README.recoll, src/bincimapmime/trbinc.cc, + src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: new file. + * src/bincimapmime/00README.recoll, src/bincimapmime/mime- + printbody.cc, src/bincimapmime/mime.h, src/bincimapmime/trbinc.cc, + src/common/Makefile, src/index/Makefile, src/index/indexer.cpp, + src/index/mimetype.cpp, src/internfile/internfile.cpp, + src/internfile/internfile.h, src/internfile/mh_html.cpp, + src/internfile/mh_html.h, src/internfile/mh_mail.cpp, + src/internfile/mh_mail.h, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h, src/internfile/myhtmlparse.cpp, + src/lib/Makefile, src/mk/FreeBSD, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui.h, src/rcldb/rcldb.h, + src/sampleconf/mimeconf, src/utils/mimeparse.cpp, + src/utils/mimeparse.h: + mail ckpt + +2005-03-17 15:35 +0000 dockes (55a0c15039bf) + + * src/index/indexer.cpp, src/index/indexer.h, + src/internfile/internfile.cpp, src/internfile/mh_html.h: + only comments. Before multidoc files + +2005-03-17 14:02 +0000 dockes (b1f57902f3c1) + + * src/bincimapmime/Makefile, src/bincimapmime/iodevice.cc, + src/index/indexer.cpp, src/qtgui/recollmain.ui.h, + src/sampleconf/mimeconf, src/utils/execmd.cpp, src/utils/execmd.h, + src/utils/mimeparse.cpp, src/utils/smallut.cpp, src/utils/smallut.h, + src/utils/utf8iter.h: + checkpoint after long pause + +2005-03-16 07:35 +0000 dockes (4d4d71cd89ea) + + * src/bincimapmime/Makefile, src/bincimapmime/address.cc, + src/bincimapmime/address.h, src/bincimapmime/config.h, + src/bincimapmime/convert.cc, src/bincimapmime/convert.h, + src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, + src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.cc, + src/bincimapmime/iofactory.h, src/bincimapmime/mime-getpart.cc, + src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- + parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, + src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- + printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime + /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/mime.h, + src/bincimapmime/session.h: new file. + * src/bincimapmime/Makefile, src/bincimapmime/address.cc, + src/bincimapmime/address.h, src/bincimapmime/config.h, + src/bincimapmime/convert.cc, src/bincimapmime/convert.h, + src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, + src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.cc, + src/bincimapmime/iofactory.h, src/bincimapmime/mime-getpart.cc, + src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- + parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, + src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- + printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime + /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/mime.h, + src/bincimapmime/session.h: + initial import from bincimap-1.3.3 + +2005-02-11 11:48 +0000 dockes (7b2bdc5c6ed9) + + * src/README, src/makesrcdist.sh: + *** empty log message *** + +2005-02-11 11:48 +0000 dockes (ffca521040c2) + + * src/README: + *** empty log message *** + +2005-02-11 11:20 +0000 dockes (7c54c58f0fd1) + + * src/common/uproplist.h, src/utils/utf8testin.txt: new file. + * src/common/textsplit.cpp, src/common/uproplist.h, + src/utils/Makefile, src/utils/utf8iter.cpp, src/utils/utf8iter.h, + src/utils/utf8testin.txt: + improved word extraction a bit (unicode punctuation) + +2005-02-10 19:52 +0000 dockes (ba4dd19f41c4) + + * src/utils/utf8iter.cpp, src/utils/utf8iter.h: new file. + * src/common/textsplit.cpp, src/utils/Makefile, + src/utils/utf8iter.cpp, src/utils/utf8iter.h: + *** empty log message *** + +2005-02-10 15:21 +0000 dockes (44892bfc8d49) + + * src/index/indexer.cpp, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/execmd.cpp, + src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, + src/utils/smallut.cpp, src/utils/smallut.h: + implemented stem databases + +2005-02-09 13:34 +0000 dockes (7517469a76b5) + + * src/index/Makefile, src/index/mimetype.cpp: + *** empty log message *** + +2005-02-09 12:07 +0000 dockes (e5d0612227af) + + * src/filters/rcldoc, src/filters/rclsoff, src/utils/wipedir.cpp, + src/utils/wipedir.h: new file. + * src/VERSION, src/filters/rcldoc, src/filters/rclsoff, + src/index/indexer.cpp, src/index/mimetype.cpp, + src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/myhtmlparse.cpp, src/lib/Makefile, + src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, + src/sampleconf/mimeconf, src/sampleconf/mimemap, src/utils/Makefile, + src/utils/smallut.cpp, src/utils/smallut.h, src/utils/wipedir.cpp, + src/utils/wipedir.h: + added support for openoffice and word + optimized decomp temp dir + usage + +2005-02-08 17:35 +0000 dockes (e5a6d4a27e1f) + + * src/INSTALL, src/README: + *** empty log message *** + +2005-02-08 15:08 +0000 dockes (f89783d5d828) + + * src/excludefile, src/makesrcdist.sh: new file. + * src/README, src/excludefile, src/makesrcdist.sh: + *** empty log message *** + +2005-02-08 15:03 +0000 dockes (4ec10decb898) + + * src/README: + *** empty log message *** + +2005-02-08 14:55 +0000 dockes (07541712859f) + + * src/README: + *** empty log message *** + +2005-02-08 14:54 +0000 dockes (fa3ad0590138 [RECOLL-0_5]) + + * src/Makefile, src/README, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/sampleconf/recoll.conf: + *** empty log message *** + +2005-02-08 14:45 +0000 dockes (d04d78bb1af4) + + * src/INSTALL, src/internfile/myhtmlparse.cpp, src/qtgui/recoll.pro: + *** empty log message *** + +2005-02-08 11:59 +0000 dockes (b5f33d8a83cb) + + * src/common/textsplit.cpp, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + fixed next/prev screen pb + pb with accents when matching in preview + +2005-02-08 10:56 +0000 dockes (ea8c32a3b71e) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/rcldb/rcldb.cpp: + phrases ok except for preview position + +2005-02-08 09:34 +0000 dockes (8f72bd8ca147) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/qtgui/recoll.pro, src/qtgui/recollmain.ui.h, + src/query/xadump.cpp, src/rcldb/rcldb.cpp, src/utils/execmd.cpp: + fixes in textsplit + +2005-02-07 13:17 +0000 dockes (3e10d31a55a9) + + * src/common/textsplit.cpp, src/common/textsplit.h, + src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + simple term highlighting in query preview + +2005-02-04 14:21 +0000 dockes (77a59732f8aa) + + * src/COPYING, src/INSTALL, src/README, src/VERSION, + src/filters/rcluncomp, src/internfile/internfile.cpp, + src/internfile/internfile.h, src/mk/Linux, + src/qtgui/images/editcopy, src/qtgui/images/editcut, + src/qtgui/images/editpaste, src/qtgui/images/filenew, + src/qtgui/images/fileopen, src/qtgui/images/filesave, + src/qtgui/images/print, src/qtgui/images/redo, + src/qtgui/images/searchfind, src/qtgui/images/undo: new file. + * src/COPYING, src/INSTALL, src/Makefile, src/README, src/VERSION, + src/common/Makefile, src/common/unacpp.cpp, src/filters/rcluncomp, + src/index/Makefile, src/index/csguess.cpp, src/index/indexer.cpp, + src/internfile/internfile.cpp, src/internfile/internfile.h, + src/internfile/mimehandler.cpp, src/lib/Makefile, src/mk/FreeBSD, + src/mk/Linux, src/qtgui/idxthread.cpp, src/qtgui/images/editcopy, + src/qtgui/images/editcut, src/qtgui/images/editpaste, + src/qtgui/images/filenew, src/qtgui/images/fileopen, + src/qtgui/images/filesave, src/qtgui/images/print, + src/qtgui/images/redo, src/qtgui/images/searchfind, + src/qtgui/images/undo, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/Makefile, src/rcldb/rcldb.cpp, src/utils/Makefile, + src/utils/pathut.cpp, src/utils/transcode.cpp: + uncompression+linux port + +2005-02-04 09:39 +0000 dockes (482687ce34da) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/index/indexer.cpp, src/internfile/mh_html.cpp, + src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, + src/lib/Makefile, src/qtgui/recollmain.ui.h, src/utils/smallut.cpp, + src/utils/smallut.h: + *** empty log message *** + +2005-02-04 09:30 +0000 dockes (5fac5dd8a1c4) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/recoll.conf: + *** empty log message *** + +2005-02-04 09:21 +0000 dockes (2ad004ec5fd7) + + * src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/recoll.conf: new file. + * src/sampleconf/mimeconf, src/sampleconf/mimemap, + src/sampleconf/recoll.conf: + *** empty log message *** + +2005-02-02 17:57 +0000 dockes (4819b0b410e7) + + * src/filters/rclps: new file. + * src/filters/rclps: + *** empty log message *** + +2005-02-01 17:52 +0000 dockes (023ac2c1c87f) + + * src/internfile/mimehandler.cpp, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp: + *** empty log message *** + +2005-02-01 17:20 +0000 dockes (4eb8337baa03) + + * src/filters/rclpdf, src/internfile/mh_html.h, src/mk/FreeBSD, + src/qtgui/idxthread.h, src/qtgui/recoll.h: new file. + * src/filters/rclpdf, src/index/indexer.cpp, + src/internfile/mh_html.cpp, src/internfile/mh_html.h, + src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, + src/lib/Makefile, src/mk/FreeBSD, src/qtgui/idxthread.h, + src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, + src/utils/Makefile, src/utils/execmd.cpp: + added external filters and pdf handling + +2005-02-01 08:42 +0000 dockes (b82908e25c6b) + + * src/common/Makefile, src/index/Makefile, src/index/recollindex.cpp, + src/lib/Makefile, src/qtgui/idxthread.cpp, src/qtgui/main.cpp, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/Makefile, src/rcldb/rcldb.cpp, src/utils/Makefile: + *** empty log message *** + +2005-01-31 14:31 +0000 dockes (c8a32d0e0056) + + * src/index/indexer.cpp, src/qtgui/idxthread.cpp, + src/utils/smallut.cpp, src/utils/smallut.h: new file. + * src/common/rclconfig.cpp, src/index/indexer.cpp, + src/index/indexer.h, src/index/recollindex.cpp, src/lib/Makefile, + src/qtgui/idxthread.cpp, src/qtgui/main.cpp, src/qtgui/recoll.pro, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/qtry.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/Makefile, src/utils/pathut.cpp, src/utils/pathut.h, + src/utils/smallut.cpp, src/utils/smallut.h: + first incarnation of indexing thread + +2005-01-29 15:41 +0000 dockes (3dd05c65d8ed) + + * src/index/recollindex.cpp, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h, src/lib/Makefile, src/qtgui/main.cpp, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile: + external viewer+ deleted doc purging + +2005-01-28 15:25 +0000 dockes (8c6b04552a34) + + * src/Makefile, src/internfile/indextext.h: new file. + * src/Makefile, src/internfile/indextext.h, + src/internfile/myhtmlparse.cpp, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: + ckpt + +2005-01-28 09:37 +0000 dockes (bf2c00ad72d0) + + * src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp, + src/internfile/myhtmlparse.h, src/lib/Makefile, src/rcldb/rcldb.cpp: + merged modifs from xapian/omega 0.8.5 + +2005-01-28 08:56 +0000 dockes (a5e2a08ce1b8) + + * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: + import from xapian 0.8.5 + +2005-01-28 08:50 +0000 dockes (73f5b0ed50d8) + + * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: + Initial recoll modifs for utf8 + +2005-01-28 08:46 +0000 dockes (04f0053d01e4) + + * src/internfile/mh_html.cpp, src/rcldb/rcldb.cpp: + xapian 0.8.3 + +2005-01-28 08:45 +0000 dockes (ec7863976555) + + * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: new + file. + * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: + *** empty log message *** + +2005-01-28 08:41 +0000 dockes (c5c570040571) + + * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: new file. + * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: + xapian 0.8.3 + +2005-01-26 13:03 +0000 dockes (5a37e2aa9a53) + + * src/index/recollindex.cpp, src/internfile/mh_html.cpp, + src/internfile/mimehandler.cpp, src/rcldb/rcldb.cpp: + sort of indexes html + +2005-01-26 11:47 +0000 dockes (eec829a74f2d) + + * src/internfile/mh_html.cpp: new file. + * src/internfile/mh_html.cpp, src/internfile/mimehandler.cpp, + src/internfile/mimehandler.h, src/lib/Makefile, + src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, + src/query/qtry.cpp, src/rcldb/rcldb.cpp, src/utils/Makefile: + ckpt + +2005-01-26 11:45 +0000 dockes (1c17d5d56a6b) + + * src/utils/mimeparse.cpp, src/utils/mimeparse.h: new file. + * src/utils/mimeparse.cpp, src/utils/mimeparse.h: + mime header parsing embryo + +2005-01-25 14:37 +0000 dockes (1d5b47c225bf) + + * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h: new + file. + * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h: + *** empty log message *** + +2005-01-25 14:37 +0000 dockes (46d42849ee3a) + + * src/lib/Makefile, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h: new file. + * src/common/Makefile, src/common/rclconfig.cpp, src/index/Makefile, + src/index/indexer.h, src/index/recollindex.cpp, src/lib/Makefile, + src/qtgui/main.cpp, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, + src/qtgui/recollmain.ui.h, src/query/Makefile, src/query/qtry.cpp, + src/query/xadump.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/Makefile, src/utils/transcode.h: + gui connected to rcldb (init) + +2005-01-24 13:17 +0000 dockes (e0104075bdd3) + + * src/common/Makefile, src/index/Makefile, src/qtgui/form1.ui, + src/qtgui/form1.ui.h, src/qtgui/main.cpp, src/query/qtry.cpp, + src/query/qxtry.cpp, src/utils/Makefile: new file. + * src/common/Makefile, src/common/rclconfig.cpp, + src/common/textsplit.h, src/common/unacpp.cpp, src/index/Makefile, + src/qtgui/form1.ui, src/qtgui/form1.ui.h, src/qtgui/main.cpp, + src/query/Makefile, src/query/qtry.cpp, src/query/qxtry.cpp, + src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile: + *** empty log message *** + +2004-12-17 15:50 +0000 dockes (4f7a0a26f6d7) + + * src/query/xadump.cpp, src/rcldb/rcldb.cpp: + very basic indexing working + +2004-12-17 15:36 +0000 dockes (325aea11f893) + + * src/common/unacpp.cpp, src/common/unacpp.h: new file. + * src/common/unacpp.cpp, src/common/unacpp.h, src/rcldb/rcldb.cpp: + *** empty log message *** + +2004-12-17 15:04 +0000 dockes (930a5f50b45e) + + * src/unac/AUTHORS, src/unac/COPYING, src/unac/README, + src/unac/README.recoll, src/unac/unac.c, src/unac/unac.h: new file. + * src/unac/AUTHORS, src/unac/COPYING, src/unac/README, + src/unac/README.recoll, src/unac/unac.c, src/unac/unac.h: + unac 1.7.0 + +2004-12-17 13:01 +0000 dockes (70ded59ba246) + + * src/query/Makefile, src/query/xadump.cpp: new file. + * src/common/rclconfig.h, src/common/textsplit.cpp, + src/common/textsplit.h, src/index/recollindex.cpp, + src/query/Makefile, src/query/xadump.cpp, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h: + *** empty log message *** + +2004-12-15 15:00 +0000 dockes (1e3483587b45) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/textsplit.cpp, src/index/csguess.cpp, + src/index/csguess.h, src/index/indexer.h, src/index/mimetype.cpp, + src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/transcode.cpp: + warnings cleanup + +2004-12-15 09:43 +0000 dockes (502752de59d5) + + * src/utils/transcode.cpp, src/utils/transcode.h: new file. + * src/utils/transcode.cpp, src/utils/transcode.h: + *** empty log message *** + +2004-12-15 08:21 +0000 dockes (520f5e294f10) + + * src/index/csguess.cpp, src/index/csguess.h: new file. + * src/index/csguess.cpp, src/index/csguess.h: + just converted (indent+comments) from estraier + +2004-12-14 17:54 +0000 dockes (12a23501eee8) + + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/textsplit.h, src/index/indexer.h, src/rcldb/rcldb.cpp, + src/rcldb/rcldb.h, src/utils/readfile.cpp, src/utils/readfile.h: new + file. + * src/common/rclconfig.cpp, src/common/rclconfig.h, + src/common/textsplit.cpp, src/common/textsplit.h, + src/index/indexer.h, src/index/mimetype.cpp, src/index/mimetype.h, + src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, + src/utils/execmd.cpp, src/utils/pathut.cpp, src/utils/pathut.h, + src/utils/readfile.cpp, src/utils/readfile.h: + *** empty log message *** + +2004-12-13 15:42 +0000 dockes (8c1fce132f19) + + * src/common/textsplit.cpp, src/index/mimetype.cpp, + src/index/mimetype.h, src/index/recollindex.cpp: new file. + * src/common/textsplit.cpp, src/index/mimetype.cpp, + src/index/mimetype.h, src/index/recollindex.cpp: + *** empty log message *** + +2004-12-12 08:58 +0000 dockes (17a132340425) + + * src/utils/execmd.cpp, src/utils/execmd.h: new file. + * src/utils/execmd.cpp, src/utils/execmd.h, src/utils/fstreewalk.cpp: + *** empty log message *** + +2004-12-10 18:13 +0000 dockes (1de12131e4a4) + + * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, + src/utils/pathut.cpp, src/utils/pathut.h: new file. + * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, + src/utils/pathut.cpp, src/utils/pathut.h: + *** empty log message *** + +2004-12-10 18:13 +0000 unknown (318176766db7) + + * Standard project directories initialized by cvs2svn. + diff --git a/src/INSTALL b/src/INSTALL new file mode 100644 index 00000000..e8ae6a49 --- /dev/null +++ b/src/INSTALL @@ -0,0 +1,1348 @@ + +More documentation can be found in the doc/ directory or at http://www.recoll.org + + + Link: home: Recoll user manual + Link: up: Recoll user manual + Link: prev: 4.3. API + Link: next: 5.2. Supporting packages + + Chapter 5. Installation and configuration + Prev Next + + ---------------------------------------------------------------------- + +Chapter 5. Installation and configuration + +5.1. Installing a binary copy + + Recoll binary copies are always distributed as regular packages for your + system. They can be obtained either through the system's normal software + distribution framework (e.g. Debian/Ubuntu apt, FreeBSD ports, etc.), or + from some type of "backports" repository providing versions newer than the + standard ones, or found on the Recoll WEB site in some cases. + + There used to exist another form of binary install, as pre-compiled source + trees, but these are just less convenient than the packages and don't + exist any more. + + The package management tools will usually automatically deal with hard + dependancies for packages obtained from a proper package repository. You + will have to deal with them by hand for downloaded packages (for example, + when dpkg complains about missing dependancies). + + In all cases, you will have to check or install supporting applications + for the file types that you want to index beyond those that are natively + processed by Recoll (text, HTML, email files, and a few others). + + You should also maybe have a look at the configuration section (but this + may not be necessary for a quick test with default parameters). Most + parameters can be more conveniently set from the GUI interface. + + ---------------------------------------------------------------------- + + Prev Next + 4.3. API Home 5.2. Supporting packages + Link: home: Recoll user manual + Link: up: Chapter 5. Installation and configuration + Link: prev: Chapter 5. Installation and configuration + Link: next: 5.3. Building from source + + 5.2. Supporting packages + Prev Chapter 5. Installation and configuration Next + + ---------------------------------------------------------------------- + +5.2. Supporting packages + + Recoll uses external applications to index some file types. You need to + install them for the file types that you wish to have indexed (these are + run-time optional dependencies. None is needed for building or running + Recoll except for indexing their specific file type). + + After an indexing pass, the commands that were found missing can be + displayed from the recoll File menu. The list is stored in the missing + text file inside the configuration directory. + + A list of common file types which need external commands follows. Many of + the handlers need the iconv command, which is not always listed as a + dependancy. + + Please note that, due to the relatively dynamic nature of this + information, the most up to date version is now kept on + http://www.recoll.org/features.html along with links to the home pages or + best source/patches pages, and misc tips. The list below is not updated + often and may be quite stale. + + For many Linux distributions, most of the commands listed can be installed + from the package repositories. However, the packages are sometimes + outdated, or not the best version for Recoll, so you should take a look at + http://www.recoll.org/features.html if a file type is important to you. + + As of Recoll release 1.14, a number of XML-based formats that were handled + by ad hoc handler code now use the xsltproc command, which usually comes + with libxslt. These are: abiword, fb2 (ebooks), kword, openoffice, svg. + + Now for the list: + + o Openoffice files need unzip and xsltproc. + + o PDF files need pdftotext which is part of Poppler (usually comes with + the poppler-utils package). Avoid the original one from Xpdf. + + o Postscript files need pstotext. The original version has an issue with + shell character in file names, which is corrected in recent packages. + See http://www.recoll.org/features.html for more detail. + + o MS Word needs antiword. It is also useful to have wvWare installed as + it may be be used as a fallback for some files which antiword does not + handle. + + o MS Excel and PowerPoint are processed by internal Python handlers. + + o MS Open XML (docx) needs xsltproc. + + o Wordperfect files need wpd2html from the libwpd (or libwpd-tools on + Ubuntu) package. + + o RTF files need unrtf, which, in its older versions, has much trouble + with non-western character sets. Many Linux distributions carry + outdated unrtf versions. Check http://www.recoll.org/features.html for + details. + + o TeX files need untex or detex. Check + http://www.recoll.org/features.html for sources if it's not packaged + for your distribution. + + o dvi files need dvips. + + o djvu files need djvutxt and djvused from the DjVuLibre package. + + o Audio files: Recoll releases 1.14 and later use a single Python + handler based on mutagen for all audio file types. + + o Pictures: Recoll uses the Exiftool Perl package to extract tag + information. Most image file formats are supported. Note that there + may not be much interest in indexing the technical tags (image size, + aperture, etc.). This is only of interest if you store personal tags + or textual descriptions inside the image files. + + o chm: files in Microsoft help format need Python and the pychm module + (which needs chmlib). + + o ICS: up to Recoll 1.13, iCalendar files need Python and the icalendar + module. icalendar is not needed for newer versions, which use internal + code. + + o Zip archives need Python (and the standard zipfile module). + + o Rar archives need Python, the rarfile Python module and the unrar + utility. + + o Midi karaoke files need Python and the Midi module + + o Konqueror webarchive format with Python (uses the Tarfile module). + + o Mimehtml web archive format (support based on the email handler, which + introduces some mild weirdness, but still usable). + + Text, HTML, email folders, and Scribus files are processed internally. Lyx + is used to index Lyx files. Many handlers need iconv and the standard sed + and awk. + + ---------------------------------------------------------------------- + + Prev Up Next + Chapter 5. Installation and configuration Home 5.3. Building from source + Link: home: Recoll user manual + Link: up: Chapter 5. Installation and configuration + Link: prev: 5.2. Supporting packages + Link: next: 5.4. Configuration overview + + 5.3. Building from source + Prev Chapter 5. Installation and configuration Next + + ---------------------------------------------------------------------- + +5.3. Building from source + + 5.3.1. Prerequisites + + If you can install any or all of the following through the package manager + for your system, all the better. Especially Qt is a very big piece of + software, but you will most probably be able to find a binary package. + + You may have to compile Xapian but this is easy. + + The shopping list: + + o C++ compiler. Up to Recoll version 1.13.04, its absence can manifest + itself by strange messages about a missing iconv_open. + + o Development files for Xapian core. + + Important + + If you are building Xapian for an older CPU (before Pentium 4 or + Athlon 64), you need to add the --disable-sse flag to the configure + command. Else all Xapian application will crash with an illegal + instruction error. + + o Development files for Qt 4 . Recoll has not been tested with Qt 5 yet. + Recoll 1.15.9 was the last version to support Qt 3. If you do not want + to install or build the Qt Webkit module, Recoll has a configuration + option to disable its use (see further). + + o Development files for X11 and zlib. + + o You may also need libiconv. On Linux systems, the iconv interface is + part of libc and you should not need to do anything special. + + Check the Recoll download page for up to date version information. + + 5.3.2. Building + + Recoll has been built on Linux, FreeBSD, Mac OS X, and Solaris, most + versions after 2005 should be ok, maybe some older ones too (Solaris 8 is + ok). If you build on another system, and need to modify things, I would + very much welcome patches. + + Configure options: + + o --without-aspell will disable the code for phonetic matching of search + terms. + + o --with-fam or --with-inotify will enable the code for real time + indexing. Inotify support is enabled by default on recent Linux + systems. + + o --with-qzeitgeist will enable sending Zeitgeist events about the + visited search results, and needs the qzeitgeist package. + + o --disable-webkit is available from version 1.17 to implement the + result list with a Qt QTextBrowser instead of a WebKit widget if you + do not or can't depend on the latter. + + o --disable-idxthreads is available from version 1.19 to suppress + multithreading inside the indexing process. You can also use the + run-time configuration to restrict recollindex to using a single + thread, but the compile-time option may disable a few more unused + locks. This only applies to the use of multithreading for the core + index processing (data input). The Recoll monitor mode always uses at + least two threads of execution. + + o --disable-python-module will avoid building the Python module. + + o --disable-xattr will prevent fetching data from file extended + attributes. Beyond a few standard attributes, fetching extended + attributes data can only be useful is some application stores data in + there, and also needs some simple configuration (see comments in the + fields configuration file). + + o --enable-camelcase will enable splitting camelCase words. This is not + enabled by default as it has the unfortunate side-effect of making + some phrase searches quite confusing: ie, "MySQL manual" would be + matched by "MySQL manual" and "my sql manual" but not "mysql manual" + (only inside phrase searches). + + o --with-file-command Specify the version of the 'file' command to use + (ie: --with-file-command=/usr/local/bin/file). Can be useful to enable + the gnu version on systems where the native one is bad. + + o --disable-qtgui Disable the Qt interface. Will allow building the + indexer and the command line search program in absence of a Qt + environment. + + o --disable-x11mon Disable X11 connection monitoring inside recollindex. + Together with --disable-qtgui, this allows building recoll without Qt + and X11. + + o --disable-pic will compile Recoll with position-dependant code. This + is incompatible with building the KIO or the Python or PHP extensions, + but might yield very marginally faster code. + + o Of course the usual autoconf configure options, like --prefix apply. + + Normal procedure: + + cd recoll-xxx + ./configure + make + (practices usual hardship-repelling invocations) + + + There is little auto-configuration. The configure script will mainly link + one of the system-specific files in the mk directory to mk/sysconf. If + your system is not known yet, it will tell you as much, and you may want + to manually copy and modify one of the existing files (the new file name + should be the output of uname -s). + + 5.3.2.1. Building on Solaris + + We did not test building the GUI on Solaris for recent versions. You will + need at least Qt 4.4. There are some hints on an old web site page, they + may still be valid. + + Someone did test the 1.19 indexer and Python module build, they do work, + with a few minor glitches. Be sure to use GNU make and install. + + 5.3.3. Installation + + Either type make install or execute recollinstall prefix, in the root of + the source tree. This will copy the commands to prefix/bin and the sample + configuration files, scripts and other shared data to prefix/share/recoll. + + If the installation prefix given to recollinstall is different from either + the system default or the value which was specified when executing + configure (as in configure --prefix /some/path), you will have to set the + RECOLL_DATADIR environment variable to indicate where the shared data is + to be found (ie for (ba)sh: export + RECOLL_DATADIR=/some/path/share/recoll). + + You can then proceed to configuration. + + ---------------------------------------------------------------------- + + Prev Up Next + 5.2. Supporting packages Home 5.4. Configuration overview + Link: home: Recoll user manual + Link: up: Chapter 5. Installation and configuration + Link: prev: 5.3. Building from source + + 5.4. Configuration overview + Prev Chapter 5. Installation and configuration + + ---------------------------------------------------------------------- + +5.4. Configuration overview + + Most of the parameters specific to the recoll GUI are set through the + Preferences menu and stored in the standard Qt place + ($HOME/.config/Recoll.org/recoll.conf). You probably do not want to edit + this by hand. + + Recoll indexing options are set inside text configuration files located in + a configuration directory. There can be several such directories, each of + which defines the parameters for one index. + + The configuration files can be edited by hand or through the Index + configuration dialog (Preferences menu). The GUI tool will try to respect + your formatting and comments as much as possible, so it is quite possible + to use both ways. + + The most accurate documentation for the configuration parameters is given + by comments inside the default files, and we will just give a general + overview here. + + By default, for each index, there are two sets of configuration files. + System-wide configuration files are kept in a directory named like + /usr/[local/]share/recoll/examples, and define default values, shared by + all indexes. For each index, a parallel set of files defines the + customized parameters. + + In addition (as of Recoll version 1.19.7), it is possible to specify two + additional configuration directories which will be stacked before and + after the user configuration directory. These are defined by the + RECOLL_CONFTOP and RECOLL_CONFMID environment variables. Values from + configuration files inside the top directory will override user ones, + values from configuration files inside the middle directory will override + system ones and be overriden by user ones. These two variables may be of + use to applications which augment Recoll functionality, and need to add + configuration data without disturbing the user's files. Please note that + the two, currently single, values will probably be interpreted as + colon-separated lists in the future: do not use colon characters inside + the directory paths. + + The default location of the configuration is the .recoll directory in your + home. Most people will only use this directory. + + This location can be changed, or others can be added with the + RECOLL_CONFDIR environment variable or the -c option parameter to recoll + and recollindex. + + If the .recoll directory does not exist when recoll or recollindex are + started, it will be created with a set of empty configuration files. + recoll will give you a chance to edit the configuration file before + starting indexing. recollindex will proceed immediately. To avoid + mistakes, the automatic directory creation will only occur for the default + location, not if -c or RECOLL_CONFDIR were used (in the latter cases, you + will have to create the directory). + + All configuration files share the same format. For example, a short + extract of the main configuration file might look as follows: + + # Space-separated list of directories to index. + topdirs = ~/docs /usr/share/doc + + [~/somedirectory-with-utf8-txt-files] + defaultcharset = utf-8 + + + There are three kinds of lines: + + o Comment (starts with #) or empty. + + o Parameter affectation (name = value). + + o Section definition ([somedirname]). + + Depending on the type of configuration file, section definitions either + separate groups of parameters or allow redefining some parameters for a + directory sub-tree. They stay in effect until another section definition, + or the end of file, is encountered. Some of the parameters used for + indexing are looked up hierarchically from the current directory location + upwards. Not all parameters can be meaningfully redefined, this is + specified for each in the next section. + + When found at the beginning of a file path, the tilde character (~) is + expanded to the name of the user's home directory, as a shell would do. + + White space is used for separation inside lists. List elements with + embedded spaces can be quoted using double-quotes. + + Encoding issues. Most of the configuration parameters are plain ASCII. Two + particular sets of values may cause encoding issues: + + o File path parameters may contain non-ascii characters and should use + the exact same byte values as found in the file system directory. + Usually, this means that the configuration file should use the system + default locale encoding. + + o The unac_except_trans parameter should be encoded in UTF-8. If your + system locale is not UTF-8, and you need to also specify non-ascii + file paths, this poses a difficulty because common text editors cannot + handle multiple encodings in a single file. In this relatively + unlikely case, you can edit the configuration file as two separate + text files with appropriate encodings, and concatenate them to create + the complete configuration. + + 5.4.1. Environment variables + + RECOLL_CONFDIR + + Defines the main configuration directory. + + RECOLL_TMPDIR, TMPDIR + + Locations for temporary files, in this order of priority. The + default if none of these is set is to use /tmp. Big temporary + files may be created during indexing, mostly for decompressing, + and also for processing, e.g. email attachments. + + RECOLL_CONFTOP, RECOLL_CONFMID + + Allow adding configuration directories with priorities below and + above the user directory (see above the Configuration overview + section for details). + + RECOLL_EXTRA_DBS, RECOLL_ACTIVE_EXTRA_DBS + + Help for setting up external indexes. See this paragraph for + explanations. + + RECOLL_DATADIR + + Defines replacement for the default location of Recoll data files, + normally found in, e.g., /usr/share/recoll). + + RECOLL_FILTERSDIR + + Defines replacement for the default location of Recoll filters, + normally found in, e.g., /usr/share/recoll/filters). + + ASPELL_PROG + + aspell program to use for creating the spelling dictionary. The + result has to be compatible with the libaspell which Recoll is + using. + + VARNAME + + Blabla + + 5.4.2. The main configuration file, recoll.conf + + recoll.conf is the main configuration file. It defines things like what to + index (top directories and things to ignore), and the default character + set to use for document types which do not specify it internally. + + The default configuration will index your home directory. If this is not + appropriate, start recoll to create a blank configuration, click Cancel, + and edit the configuration file before restarting the command. This will + start the initial indexing, which may take some time. + + Most of the following parameters can be changed from the Index + Configuration menu in the recoll interface. Some can only be set by + editing the configuration file. + + 5.4.2.1. Parameters affecting what documents we index: + + topdirs + + Specifies the list of directories or files to index (recursively + for directories). You can use symbolic links as elements of this + list. See the followLinks option about following symbolic links + found under the top elements (not followed by default). + + skippedNames + + A space-separated list of wilcard patterns for names of files or + directories that should be completely ignored. The list defined in + the default file is: + + skippedNames = #* bin CVS Cache cache* caughtspam tmp .thumbnails .svn \ + *~ .beagle .git .hg .bzr loop.ps .xsession-errors \ + .recoll* xapiandb recollrc recoll.conf + + The list can be redefined at any sub-directory in the indexed + area. + + The top-level directories are not affected by this list (that is, + a directory in topdirs might match and would still be indexed). + + The list in the default configuration does not exclude hidden + directories (names beginning with a dot), which means that it may + index quite a few things that you do not want. On the other hand, + email user agents like thunderbird usually store messages in + hidden directories, and you probably want this indexed. One + possible solution is to have .* in skippedNames, and add things + like ~/.thunderbird or ~/.evolution in topdirs. + + Not even the file names are indexed for patterns in this list. See + the noContentSuffixes variable for an alternative approach which + indexes the file names. + + noContentSuffixes + + This is a list of file name endings (not wildcard expressions, nor + dot-delimited suffixes). Only the names of matching files will be + indexed (no attempt at MIME type identification, no decompression, + no content indexing). This can be redefined for subdirectories, + and edited from the GUI. The default value is: + + noContentSuffixes = .md5 .map \ + .o .lib .dll .a .sys .exe .com \ + .mpp .mpt .vsd \ + .img .img.gz .img.bz2 .img.xz .image .image.gz .image.bz2 .image.xz \ + .dat .bak .rdf .log.gz .log .db .msf .pid \ + ,v ~ # + + skippedPaths and daemSkippedPaths + + A space-separated list of patterns for paths of files or + directories that should be skipped. There is no default in the + sample configuration file, but the code always adds the + configuration and database directories in there. + + skippedPaths is used both by batch and real time indexing. + daemSkippedPaths can be used to specify things that should be + indexed at startup, but not monitored. + + Example of use for skipping text files only in a specific + directory: + + skippedPaths = ~/somedir/*.txt + + + skippedPathsFnmPathname + + The values in the *skippedPaths variables are matched by default + with fnmatch(3), with the FNM_PATHNAME flag. This means that '/' + characters must be matched explicitely. You can set + skippedPathsFnmPathname to 0 to disable the use of FNM_PATHNAME + (meaning that /*/dir3 will match /dir1/dir2/dir3). + + zipSkippedNames + + A space-separated list of patterns for names of files or + directories that should be ignored inside zip archives. This is + used directly by the zip handler, and has a function similar to + skippedNames, but works independantly. Can be redefined for + filesystem subdirectories. For versions up to 1.19, you will need + to update the Zip handler and install a supplementary Python + module. The details are described on the Recoll wiki. + + followLinks + + Specifies if the indexer should follow symbolic links while + walking the file tree. The default is to ignore symbolic links to + avoid multiple indexing of linked files. No effort is made to + avoid duplication when this option is set to true. This option can + be set individually for each of the topdirs members by using + sections. It can not be changed below the topdirs level. + + indexedmimetypes + + Recoll normally indexes any file which it knows how to read. This + list lets you restrict the indexed MIME types to what you specify. + If the variable is unspecified or the list empty (the default), + all supported types are processed. Can be redefined for + subdirectories. + + excludedmimetypes + + This list lets you exclude some MIME types from indexing. Can be + redefined for subdirectories. + + compressedfilemaxkbs + + Size limit for compressed (.gz or .bz2) files. These need to be + decompressed in a temporary directory for identification, which + can be very wasteful if 'uninteresting' big compressed files are + present. Negative means no limit, 0 means no processing of any + compressed file. Defaults to -1. + + textfilemaxmbs + + Maximum size for text files. Very big text files are often + uninteresting logs. Set to -1 to disable (default 20MB). + + textfilepagekbs + + If set to other than -1, text files will be indexed as multiple + documents of the given page size. This may be useful if you do + want to index very big text files as it will both reduce memory + usage at index time and help with loading data to the preview + window. A size of a few megabytes would seem reasonable (default: + 1MB). + + membermaxkbs + + This defines the maximum size in kilobytes for an archive member + (zip, tar or rar at the moment). Bigger entries will be skipped. + + indexallfilenames + + Recoll indexes file names in a special section of the database to + allow specific file names searches using wild cards. This + parameter decides if file name indexing is performed only for + files with MIME types that would qualify them for full text + indexing, or for all files inside the selected subtrees, + independently of MIME type. + + usesystemfilecommand + + Decide if we execute a system command (file -i by default) as a + final step for determining the MIME type for a file (the main + procedure uses suffix associations as defined in the mimemap + file). This can be useful for files with suffix-less names, but it + will also cause the indexing of many bogus "text" files. + + systemfilecommand + + Command to use for mime for mime type determination if + usesystefilecommand is set. Recent versions of xdg-mime sometimes + work better than file. + + processwebqueue + + If this is set, process the directory where Web browser plugins + copy visited pages for indexing. + + webqueuedir + + The path to the web indexing queue. This is hard-coded in the + Firefox plugin as ~/.recollweb/ToIndex so there should be no need + to change it. + + 5.4.2.2. Parameters affecting how we generate terms: + + Changing some of these parameters will imply a full reindex. Also, when + using multiple indexes, it may not make sense to search indexes that don't + share the values for these parameters, because they usually affect both + search and index operations. + + indexStripChars + + Decide if we strip characters of diacritics and convert them to + lower-case before terms are indexed. If we don't, searches + sensitive to case and diacritics can be performed, but the index + will be bigger, and some marginal weirdness may sometimes occur. + The default is a stripped index (indexStripChars = 1) for now. + When using multiple indexes for a search, this parameter must be + defined identically for all. Changing the value implies an index + reset. + + maxTermExpand + + Maximum expansion count for a single term (e.g.: when using + wildcards). The default of 10000 is reasonable and will avoid + queries that appear frozen while the engine is walking the term + list. + + maxXapianClauses + + Maximum number of elementary clauses we can add to a single Xapian + query. In some cases, the result of term expansion can be + multiplicative, and we want to avoid using excessive memory. The + default of 100 000 should be both high enough in most cases and + compatible with current typical hardware configurations. + + nonumbers + + If this set to true, no terms will be generated for numbers. For + example "123", "1.5e6", 192.168.1.4, would not be indexed + ("value123" would still be). Numbers are often quite interesting + to search for, and this should probably not be set except for + special situations, ie, scientific documents with huge amounts of + numbers in them. This can only be set for a whole index, not for a + subtree. + + nocjk + + If this set to true, specific east asian (Chinese Korean Japanese) + characters/word splitting is turned off. This will save a small + amount of cpu if you have no CJK documents. If your document base + does include such text but you are not interested in searching it, + setting nocjk may be a significant time and space saver. + + cjkngramlen + + This lets you adjust the size of n-grams used for indexing CJK + text. The default value of 2 is probably appropriate in most + cases. A value of 3 would allow more precision and efficiency on + longer words, but the index will be approximately twice as large. + + indexstemminglanguages + + A list of languages for which the stem expansion databases will be + built. See recollindex(1) or use the recollindex -l command for + possible values. You can add a stem expansion database for a + different language by using recollindex -s, but it will be deleted + during the next indexing. Only languages listed in the + configuration file are permanent. + + defaultcharset + + The name of the character set used for files that do not contain a + character set definition (ie: plain text files). This can be + redefined for any sub-directory. If it is not set at all, the + character set used is the one defined by the nls environment ( + LC_ALL, LC_CTYPE, LANG), or iso8859-1 if nothing is set. + + unac_except_trans + + This is a list of characters, encoded in UTF-8, which should be + handled specially when converting text to unaccented lowercase. + For example, in Swedish, the letter a with diaeresis has full + alphabet citizenship and should not be turned into an a. Each + element in the space-separated list has the special character as + first element and the translation following. The handling of both + the lowercase and upper-case versions of a character should be + specified, as appartenance to the list will turn-off both standard + accent and case processing. Example for Swedish: + + unac_except_trans = aaaa AAaa a:a: A:a: o:o: O:o: + + + Note that the translation is not limited to a single character, + you could very well have something like u:ue in the list. + + The default value set for unac_except_trans can't be listed here + because I have trouble with SGML and UTF-8, but it only contains + ligature decompositions: german ss, oe, ae, fi, fl. + + This parameter can't be defined for subdirectories, it is global, + because there is no way to do otherwise when querying. If you have + document sets which would need different values, you will have to + index and query them separately. + + maildefcharset + + This can be used to define the default character set specifically + for email messages which don't specify it. This is mainly useful + for readpst (libpst) dumps, which are utf-8 but do not say so. + + localfields + + This allows setting fields for all documents under a given + directory. Typical usage would be to set an "rclaptg" field, to be + used in mimeview to select a specific viewer. If several fields + are to be set, they should be separated with a semi-colon (';') + character, which there is currently no way to escape. Also note + the initial semi-colon. Example: localfields= ;rclaptg=gnus;other + = val, then select specifier viewer with mimetype|tag=... in + mimeview. + + testmodifusemtime + + If true, use mtime instead of default ctime to determine if a file + has been modified (in addition to size, which is always used). + Setting this can reduce re-indexing on systems where extended + attributes are modified (by some other application), but not + indexed (changing extended attributes only affects ctime). Notes: + + o This may prevent detection of change in some marginal file + rename cases (the target would need to have the same size and + mtime). + + o You should probably also set noxattrfields to 1 in this case, + except if you still prefer to perform xattr indexing, for + example if the local file update pattern makes it of value + (as in general, there is a risk for pure extended attributes + updates without file modification to go undetected). + + Perform a full index reset after changing the value of this + parameter. + + noxattrfields + + Recoll versions 1.19 and later automatically translate file + extended attributes into document fields (to be processed + according to the parameters from the fields file). Setting this + variable to 1 will disable the behaviour. + + metadatacmds + + This allows executing external commands for each file and storing + the output in Recoll document fields. This could be used for + example to index external tag data. The value is a list of field + names and commands, don't forget an initial semi-colon. Example: + + [/some/area/of/the/fs] + metadatacmds = ; tags = tmsu tags %f; otherfield = somecmd -xx %f + + + As a specially disgusting hack brought by Recoll 1.19.7, if a + "field name" begins with rclmulti, the data returned by the + command is expected to contain multiple field values, in + configuration file format. This allows setting several fields by + executing a single command. Example: + + metadatacmds = ; rclmulti1 = somecmd %f + + + If somecmd returns data in the form of: + + field1 = value1 + field2 = value for field2 + + + field1 and field2 will be set inside the document metadata. + + 5.4.2.3. Parameters affecting where and how we store things: + + dbdir + + The name of the Xapian data directory. It will be created if + needed when the index is initialized. If this is not an absolute + path, it will be interpreted relative to the configuration + directory. The value can have embedded spaces but starting or + trailing spaces will be trimmed. You cannot use quotes here. + + idxstatusfile + + The name of the scratch file where the indexer process updates its + status. Default: idxstatus.txt inside the configuration directory. + + maxfsoccuppc + + Maximum file system occupation before we stop indexing. The value + is a percentage, corresponding to what the "Capacity" df output + column shows. The default value is 0, meaning no checking. + + mboxcachedir + + The directory where mbox message offsets cache files are held. + This is normally $RECOLL_CONFDIR/mboxcache, but it may be useful + to share a directory between different configurations. + + mboxcacheminmbs + + The minimum mbox file size over which we cache the offsets. There + is really no sense in caching offsets for small files. The default + is 5 MB. + + webcachedir + + This is only used by the web browser plugin indexing code, and + defines where the cache for visited pages will live. Default: + $RECOLL_CONFDIR/webcache + + webcachemaxmbs + + This is only used by the web browser plugin indexing code, and + defines the maximum size for the web page cache. Default: 40 MB. + Quite unfortunately, this is only taken into account when creating + the cache file. You need to delete the file for a change to be + taken into account. + + idxflushmb + + Threshold (megabytes of new text data) where we flush from memory + to disk index. Setting this can help control memory usage. A value + of 0 means no explicit flushing, letting Xapian use its own + default, which is flushing every 10000 (or XAPIAN_FLUSH_THRESHOLD) + documents, which gives little memory usage control, as memory + usage also depends on average document size. The default value is + 10, and it is probably a bit low. If your system usually has free + memory, you can try higher values between 20 and 80. In my + experience, values beyond 100 are always counterproductive. + + 5.4.2.4. Parameters affecting multithread processing + + The Recoll indexing process recollindex can use multiple threads to speed + up indexing on multiprocessor systems. The work done to index files is + divided in several stages and some of the stages can be executed by + multiple threads. The stages are: + + 1. File system walking: this is always performed by the main thread. + 2. File conversion and data extraction. + 3. Text processing (splitting, stemming, etc.) + 4. Xapian index update. + + You can also read a longer document about the transformation of Recoll + indexing to multithreading. + + The threads configuration is controlled by two configuration file + parameters. + + thrQSizes + + This variable defines the job input queues configuration. There + are three possible queues for stages 2, 3 and 4, and this + parameter should give the queue depth for each stage (three + integer values). If a value of -1 is used for a given stage, no + queue is used, and the thread will go on performing the next + stage. In practise, deep queues have not been shown to increase + performance. A value of 0 for the first queue tells Recoll to + perform autoconfiguration (no need for the two other values in + this case) - this is the default configuration. + + thrTCounts + + This defines the number of threads used for each stage. If a value + of -1 is used for one of the queue depths, the corresponding + thread count is ignored. It makes no sense to use a value other + than 1 for the last stage because updating the Xapian index is + necessarily single-threaded (and protected by a mutex). + + The following example would use three queues (of depth 2), and 4 threads + for converting source documents, 2 for processing their text, and one to + update the index. This was tested to be the best configuration on the test + system (quadri-processor with multiple disks). + + thrQSizes = 2 2 2 + thrTCounts = 4 2 1 + + The following example would use a single queue, and the complete + processing for each document would be performed by a single thread + (several documents will still be processed in parallel in most cases). The + threads will use mutual exclusion when entering the index update stage. In + practise the performance would be close to the precedent case in general, + but worse in certain cases (e.g. a Zip archive would be performed purely + sequentially), so the previous approach is preferred. YMMV... The 2 last + values for thrTCounts are ignored. + + thrQSizes = 2 -1 -1 + thrTCounts = 6 1 1 + + The following example would disable multithreading. Indexing will be + performed by a single thread. + + thrQSizes = -1 -1 -1 + + 5.4.2.5. Miscellaneous parameters: + + autodiacsens + + IF the index is not stripped, decide if we automatically trigger + diacritics sensitivity if the search term has accented characters + (not in unac_except_trans). Else you need to use the query + language and the D modifier to specify diacritics sensitivity. + Default is no. + + autocasesens + + IF the index is not stripped, decide if we automatically trigger + character case sensitivity if the search term has upper-case + characters in any but the first position. Else you need to use the + query language and the C modifier to specify character-case + sensitivity. Default is yes. + + loglevel,daemloglevel + + Verbosity level for recoll and recollindex. A value of 4 lists + quite a lot of debug/information messages. 2 only lists errors. + The daemversion is specific to the indexing monitor daemon. + + logfilename, daemlogfilename + + Where the messages should go. 'stderr' can be used as a special + value, and is the default. The daemversion is specific to the + indexing monitor daemon. + + checkneedretryindexscript + + This defines the name for a command executed by recollindex when + starting indexing. If the exit status of the command is 0, + recollindex retries to index all files which previously could not + be indexed because of data extraction errors. The default value is + a script which checks if any of the common bin directories have + changed (indicating that a helper program may have been + installed). + + mondelaypatterns + + This allows specify wildcard path patterns (processed with + fnmatch(3) with 0 flag), to match files which change too often and + for which a delay should be observed before re-indexing. This is a + space-separated list, each entry being a pattern and a time in + seconds, separated by a colon. You can use double quotes if a path + entry contains white space. Example: + + mondelaypatterns = *.log:20 "this one has spaces*:10" + + + monixinterval + + Minimum interval (seconds) for processing the indexing queue. The + real time monitor does not process each event when it comes in, + but will wait this time for the queue to accumulate to diminish + overhead and in order to aggregate multiple events to the same + file. Default 30 S. + + monauxinterval + + Period (in seconds) at which the real time monitor will regenerate + the auxiliary databases (spelling, stemming) if needed. The + default is one hour. + + monioniceclass, monioniceclassdata + + These allow defining the ionice class and data used by the indexer + (default class 3, no data). + + filtermaxseconds + + Maximum handler execution time, after which it is aborted. Some + postscript programs just loop... + + filtermaxmbytes + + Recoll 1.20.7 and later. Maximum handler memory utilisation. This + uses setrlimit(RLIMIT_AS) on most systems (total virtual memory + space size limit). Some programs may start with 500 MBytes of + mapped shared libraries, so take this into account when choosing a + value. The default is a liberal 2000MB. + + filtersdir + + A directory to search for the external input handler scripts used + to index some types of files. The value should not be changed, + except if you want to modify one of the default scripts. The value + can be redefined for any sub-directory. + + iconsdir + + The name of the directory where recoll result list icons are + stored. You can change this if you want different images. + + idxabsmlen + + Recoll stores an abstract for each indexed file inside the + database. The text can come from an actual 'abstract' section in + the document or will just be the beginning of the document. It is + stored in the index so that it can be displayed inside the result + lists without decoding the original file. The idxabsmlen parameter + defines the size of the stored abstract. The default value is 250 + bytes. The search interface gives you the choice to display this + stored text or a synthetic abstract built by extracting text + around the search terms. If you always prefer the synthetic + abstract, you can reduce this value and save a little space. + + idxmetastoredlen + + Maximum stored length for metadata fields. This does not affect + indexing (the whole field is processed anyway), just the amount of + data stored in the index for the purpose of displaying fields + inside result lists or previews. The default value is 150 bytes + which may be too low if you have custom fields. + + aspellLanguage + + Language definitions to use when creating the aspell dictionary. + The value must match a set of aspell language definition files. + You can type "aspell config" to see where these are installed + (look for data-dir). The default if the variable is not set is to + use your desktop national language environment to guess the value. + + noaspell + + If this is set, the aspell dictionary generation is turned off. + Useful for cases where you don't need the functionality or when it + is unusable because aspell crashes during dictionary generation. + + mhmboxquirks + + This allows definining location-related quirks for the mailbox + handler. Currently only the tbird flag is defined, and it should + be set for directories which hold Thunderbird data, as their + folder format is weird. + + 5.4.3. The fields file + + This file contains information about dynamic fields handling in Recoll. + Some very basic fields have hard-wired behaviour, and, mostly, you should + not change the original data inside the fields file. But you can create + custom fields fitting your data and handle them just like they were native + ones. + + The fields file has several sections, which each define an aspect of + fields processing. Quite often, you'll have to modify several sections to + obtain the desired behaviour. + + We will only give a short description here, you should refer to the + comments inside the default file for more detailed information. + + Field names should be lowercase alphabetic ASCII. + + [prefixes] + + A field becomes indexed (searchable) by having a prefix defined in + this section. + + [stored] + + A field becomes stored (displayable inside results) by having its + name listed in this section (typically with an empty value). + + [aliases] + + This section defines lists of synonyms for the canonical names + used inside the [prefixes] and [stored] sections + + [queryaliases] + + This section also defines aliases for the canonic field names, + with the difference that the substitution will only be used at + query time, avoiding any possibility that the value would pick-up + random metadata from documents. + + handler-specific sections + + Some input handlers may need specific configuration for handling + fields. Only the email message handler currently has such a + section (named [mail]). It allows indexing arbitrary email headers + in addition to the ones indexed by default. Other such sections + may appear in the future. + + Here follows a small example of a personal fields file. This would extract + a specific email header and use it as a searchable field, with data + displayable inside result lists. (Side note: as the email handler does no + decoding on the values, only plain ascii headers can be indexed, and only + the first occurrence will be used for headers that occur several times). + + [prefixes] + # Index mailmytag contents (with the given prefix) + mailmytag = XMTAG + + [stored] + # Store mailmytag inside the document data record (so that it can be + # displayed - as %(mailmytag) - in result lists). + mailmytag = + + [queryaliases] + filename = fn + containerfilename = cfn + + [mail] + # Extract the X-My-Tag mail header, and use it internally with the + # mailmytag field name + x-my-tag = mailmytag + + 5.4.3.1. Extended attributes in the fields file + + Recoll versions 1.19 and later process user extended file attributes as + documents fields by default. + + Attributes are processed as fields of the same name, after removing the + user prefix on Linux. + + The [xattrtofields] section of the fields file allows specifying + translations from extended attributes names to Recoll field names. An + empty translation disables use of the corresponding attribute data. + + 5.4.4. The mimemap file + + mimemap specifies the file name extension to MIME type mappings. + + For file names without an extension, or with an unknown one, the system's + file -i command will be executed to determine the MIME type (this can be + switched off inside the main configuration file). + + The mappings can be specified on a per-subtree basis, which may be useful + in some cases. Example: gaim logs have a .txt extension but should be + handled specially, which is possible because they are usually all located + in one place. + + The recoll_noindex mimemap variable has been moved to recoll.conf and + renamed to noContentSuffixes, while keeping the same function, as of + Recoll version 1.21. For older Recoll versions, see the documentation for + noContentSuffixes but use recoll_noindex in mimemap. + + 5.4.5. The mimeconf file + + mimeconf specifies how the different MIME types are handled for indexing, + and which icons are displayed in the recoll result lists. + + Changing the parameters in the [index] section is probably not a good idea + except if you are a Recoll developer. + + The [icons] section allows you to change the icons which are displayed by + recoll in the result lists (the values are the basenames of the png images + inside the iconsdir directory (specified in recoll.conf). + + 5.4.6. The mimeview file + + mimeview specifies which programs are started when you click on an Open + link in a result list. Ie: HTML is normally displayed using firefox, but + you may prefer Konqueror, your openoffice.org program might be named + oofice instead of openoffice etc. + + Changes to this file can be done by direct editing, or through the recoll + GUI preferences dialog. + + If Use desktop preferences to choose document editor is checked in the + Recoll GUI preferences, all mimeview entries will be ignored except the + one labelled application/x-all (which is set to use xdg-open by default). + + In this case, the xallexcepts top level variable defines a list of MIME + type exceptions which will be processed according to the local entries + instead of being passed to the desktop. This is so that specific Recoll + options such as a page number or a search string can be passed to + applications that support them, such as the evince viewer. + + As for the other configuration files, the normal usage is to have a + mimeview inside your own configuration directory, with just the + non-default entries, which will override those from the central + configuration file. + + All viewer definition entries must be placed under a [view] section. + + The keys in the file are normally MIME types. You can add an application + tag to specialize the choice for an area of the filesystem (using a + localfields specification in mimeconf). The syntax for the key is + mimetype|tag + + The nouncompforviewmts entry, (placed at the top level, outside of the + [view] section), holds a list of MIME types that should not be + uncompressed before starting the viewer (if they are found compressed, ie: + mydoc.doc.gz). + + The right side of each assignment holds a command to be executed for + opening the file. The following substitutions are performed: + + o %D. Document date + + o %f. File name. This may be the name of a temporary file if it was + necessary to create one (ie: to extract a subdocument from a + container). + + o %i. Internal path, for subdocuments of containers. The format depends + on the container type. If this appears in the command line, Recoll + will not create a temporary file to extract the subdocument, expecting + the called application (possibly a script) to be able to handle it. + + o %M. MIME type + + o %p. Page index. Only significant for a subset of document types, + currently only PDF, Postscript and DVI files. Can be used to start the + editor at the right page for a match or snippet. + + o %s. Search term. The value will only be set for documents with indexed + page numbers (ie: PDF). The value will be one of the matched search + terms. It would allow pre-setting the value in the "Find" entry inside + Evince for example, for easy highlighting of the term. + + o %u. Url. + + In addition to the predefined values above, all strings like %(fieldname) + will be replaced by the value of the field named fieldname for the + document. This could be used in combination with field customisation to + help with opening the document. + + 5.4.7. The ptrans file + + ptrans specifies query-time path translations. These can be useful in + multiple cases. + + The file has a section for any index which needs translations, either the + main one or additional query indexes. The sections are named with the + Xapian index directory names. No slash character should exist at the end + of the paths (all comparisons are textual). An exemple should make things + sufficiently clear + + [/home/me/.recoll/xapiandb] + /this/directory/moved = /to/this/place + + [/path/to/additional/xapiandb] + /server/volume1/docdir = /net/server/volume1/docdir + /server/volume2/docdir = /net/server/volume2/docdir + + + 5.4.8. Examples of configuration adjustments + + 5.4.8.1. Adding an external viewer for an non-indexed type + + Imagine that you have some kind of file which does not have indexable + content, but for which you would like to have a functional Open link in + the result list (when found by file name). The file names end in .blob and + can be displayed by application blobviewer. + + You need two entries in the configuration files for this to work: + + o In $RECOLL_CONFDIR/mimemap (typically ~/.recoll/mimemap), add the + following line: + + .blob = application/x-blobapp + + Note that the MIME type is made up here, and you could call it + diesel/oil just the same. + + o In $RECOLL_CONFDIR/mimeview under the [view] section, add: + + application/x-blobapp = blobviewer %f + + We are supposing that blobviewer wants a file name parameter here, you + would use %u if it liked URLs better. + + If you just wanted to change the application used by Recoll to display a + MIME type which it already knows, you would just need to edit mimeview. + The entries you add in your personal file override those in the central + configuration, which you do not need to alter. mimeview can also be + modified from the Gui. + + 5.4.8.2. Adding indexing support for a new file type + + Let us now imagine that the above .blob files actually contain indexable + text and that you know how to extract it with a command line program. + Getting Recoll to index the files is easy. You need to perform the above + alteration, and also to add data to the mimeconf file (typically in + ~/.recoll/mimeconf): + + o Under the [index] section, add the following line (more about the + rclblob indexing script later): + + application/x-blobapp = exec rclblob + + o Under the [icons] section, you should choose an icon to be displayed + for the files inside the result lists. Icons are normally 64x64 pixels + PNG files which live in /usr/[local/]share/recoll/images. + + o Under the [categories] section, you should add the MIME type where it + makes sense (you can also create a category). Categories may be used + for filtering in advanced search. + + The rclblob handler should be an executable program or script which exists + inside /usr/[local/]share/recoll/filters. It will be given a file name as + argument and should output the text or html contents on the standard + output. + + The filter programming section describes in more detail how to write an + input handler. + + ---------------------------------------------------------------------- + + Prev Up + 5.3. Building from source Home diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..184ed136 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,570 @@ + +CXXFLAGS ?= @CXXFLAGS@ +LIBXAPIAN=@LIBXAPIAN@ +XAPIANCXXFLAGS=@XAPIANCXXFLAGS@ +LIBICONV=@LIBICONV@ +INCICONV=@INCICONV@ +LIBFAM = @LIBFAM@ +RCLLIBVERSION=@RCLLIBVERSION@ +X_CFLAGS=@X_CFLAGS@ +X_PRE_LIBS=@X_PRE_LIBS@ +X_LIBS=@X_LIBS@ +X_EXTRA_LIBS=@X_EXTRA_LIBS@ +X_LIBX11=@X_LIBX11@ +DEFS=@DEFS@ + +COMMONCPPFLAGS = -I. \ + -I$(top_srcdir)/aspell \ + -I$(top_srcdir)/bincimapmime \ + -I$(top_srcdir)/common \ + -I$(top_srcdir)/index \ + -I$(top_srcdir)/internfile \ + -I$(top_srcdir)/rcldb \ + -I$(top_srcdir)/unac \ + -I$(top_srcdir)/utils \ + -I$(top_srcdir)/xaposix \ + -DBUILDING_RECOLL + +AM_CPPFLAGS = -Wall -Wno-unused \ + $(COMMONCPPFLAGS) \ + $(INCICONV) \ + $(XAPIANCXXFLAGS) \ + $(X_CFLAGS) \ + -DRECOLL_DATADIR=\"${pkgdatadir}\" \ + -D_GNU_SOURCE \ + $(DEFS) + +ACLOCAL_AMFLAGS = -I m4 + +if NOTHREADS + LIBTHREADS= +else + LIBTHREADS= $(LIBSYSTHREADS) +endif + +librcldir = $(libdir)/recoll +librcl_LTLIBRARIES = librecoll.la + +librecoll_la_SOURCES = \ +aspell/aspell-local.h \ +aspell/rclaspell.cpp \ +aspell/rclaspell.h \ +bincimapmime/config.h \ +bincimapmime/convert.cc \ +bincimapmime/convert.h \ +bincimapmime/mime-inputsource.h \ +bincimapmime/mime-parsefull.cc \ +bincimapmime/mime-parseonlyheader.cc \ +bincimapmime/mime-printbody.cc \ +bincimapmime/mime-utils.h \ +bincimapmime/mime.cc \ +bincimapmime/mime.h \ +common/beaglequeuecache.cpp \ +common/beaglequeuecache.h \ +common/conf_post.h \ +common/cstr.cpp \ +common/cstr.h \ +common/rclconfig.cpp \ +common/rclconfig.h \ +common/rclinit.cpp \ +common/rclinit.h \ +common/syngroups.cpp \ +common/syngroups.h \ +common/textsplit.cpp \ +common/textsplit.h \ +common/unacpp.cpp \ +common/unacpp.h \ +common/uproplist.h \ +index/beaglequeue.cpp \ +index/beaglequeue.h \ +index/bglfetcher.cpp \ +index/bglfetcher.h \ +index/checkretryfailed.cpp \ +index/checkretryfailed.h \ +index/fetcher.cpp \ +index/fetcher.h \ +index/fsfetcher.cpp \ +index/fsfetcher.h \ +index/fsindexer.cpp \ +index/fsindexer.h \ +index/indexer.cpp \ +index/indexer.h \ +index/mimetype.cpp \ +index/mimetype.h \ +index/rclmon.h \ +index/recollindex.h \ +index/subtreelist.cpp \ +index/subtreelist.h \ +internfile/Filter.h \ +internfile/extrameta.cpp \ +internfile/extrameta.h \ +internfile/htmlparse.cpp \ +internfile/htmlparse.h \ +internfile/indextext.h \ +internfile/internfile.cpp \ +internfile/internfile.h \ +internfile/mh_exec.cpp \ +internfile/mh_exec.h \ +internfile/mh_execm.cpp \ +internfile/mh_execm.h \ +internfile/mh_html.cpp \ +internfile/mh_html.h \ +internfile/mh_mail.cpp \ +internfile/mh_mail.h \ +internfile/mh_mbox.cpp \ +internfile/mh_mbox.h \ +internfile/mh_symlink.h \ +internfile/mh_text.cpp \ +internfile/mh_text.h \ +internfile/mh_unknown.h \ +internfile/mimehandler.cpp \ +internfile/mimehandler.h \ +internfile/myhtmlparse.cpp \ +internfile/myhtmlparse.h \ +internfile/txtdcode.cpp \ +internfile/uncomp.cpp \ +internfile/uncomp.h \ +query/docseq.cpp \ +query/docseq.h \ +query/docseqdb.cpp \ +query/docseqdb.h \ +query/docseqdocs.h \ +query/docseqhist.cpp \ +query/docseqhist.h \ +query/dynconf.cpp \ +query/dynconf.h \ +query/filtseq.cpp \ +query/filtseq.h \ +query/plaintorich.cpp \ +query/plaintorich.h \ +query/recollq.cpp \ +query/recollq.h \ +query/reslistpager.cpp \ +query/reslistpager.h \ +query/sortseq.cpp \ +query/sortseq.h \ +query/wasaparse.ypp \ +query/wasaparseaux.cpp \ +query/wasaparserdriver.h \ +query/wasatorcl.h \ +rcldb/daterange.cpp \ +rcldb/daterange.h \ +rcldb/expansiondbs.cpp \ +rcldb/expansiondbs.h \ +rcldb/rclabstract.cpp \ +rcldb/rcldb.cpp \ +rcldb/rcldb.h \ +rcldb/rcldb_p.h \ +rcldb/rcldoc.cpp \ +rcldb/rcldoc.h \ +rcldb/rcldups.cpp \ +rcldb/rclquery.cpp \ +rcldb/rclquery.h \ +rcldb/rclquery_p.h \ +rcldb/rclterms.cpp \ +rcldb/searchdata.cpp \ +rcldb/searchdata.h \ +rcldb/searchdatatox.cpp \ +rcldb/searchdataxml.cpp \ +rcldb/stemdb.cpp \ +rcldb/stemdb.h \ +rcldb/stoplist.cpp \ +rcldb/stoplist.h \ +rcldb/synfamily.cpp \ +rcldb/synfamily.h \ +rcldb/termproc.h \ +rcldb/xmacros.h \ +unac/unac.cpp \ +unac/unac.h \ +unac/unac_version.h \ +utils/appformime.cpp \ +utils/appformime.h \ +utils/base64.cpp \ +utils/base64.h \ +utils/cancelcheck.h \ +utils/circache.cpp \ +utils/circache.h \ +utils/closefrom.cpp \ +utils/closefrom.h \ +utils/conftree.cpp \ +utils/conftree.h \ +utils/copyfile.cpp \ +utils/copyfile.h \ +utils/cpuconf.cpp \ +utils/cpuconf.h \ +utils/debuglog.cpp \ +utils/debuglog.h \ +utils/ecrontab.cpp \ +utils/ecrontab.h \ +utils/execmd.cpp \ +utils/execmd.h \ +utils/fileudi.cpp \ +utils/fileudi.h \ +utils/fstreewalk.cpp \ +utils/fstreewalk.h \ +utils/hldata.h \ +utils/idfile.cpp \ +utils/idfile.h \ +utils/md5.cpp \ +utils/md5.h \ +utils/md5ut.cpp \ +utils/md5ut.h \ +utils/mimeparse.cpp \ +utils/mimeparse.h \ +utils/netcon.cpp \ +utils/netcon.h \ +utils/pathut.cpp \ +utils/pathut.h \ +utils/ptmutex.h \ +utils/pxattr.cpp \ +utils/pxattr.h \ +utils/rclionice.cpp \ +utils/rclionice.h \ +utils/readfile.cpp \ +utils/readfile.h \ +utils/refcntr.h \ +utils/smallut.cpp \ +utils/smallut.h \ +utils/strmatcher.cpp \ +utils/strmatcher.h \ +utils/transcode.cpp \ +utils/transcode.h \ +utils/utf8iter.h \ +utils/wipedir.cpp \ +utils/wipedir.h \ +utils/workqueue.h \ +utils/x11mon.cpp \ +utils/x11mon.h + +BUILT_SOURCES = query/wasaparse.cpp +AM_YFLAGS = -d + +# We use -release: the lib is only shared +# between recoll programs from the same release. +# -version-info $(VERSION_INFO) +librecoll_la_LDFLAGS = -release $(VERSION) \ + -Wl,--no-undefined -Wl,--warn-unresolved-symbols + +librecoll_la_LIBADD = $(LIBXAPIAN) $(LIBICONV) $(X_LIBX11) $(LIBTHREADS) + +# There is probably a better way to do this. The KIO needs to be linked +# with librecoll, but librecoll is installed into a non-standard place +# (/usr/lib/recoll). Debian packaging has something against setting an +# rpath on the kio (cause it's not the same package as the lib), so I don't +# know how to link it dynamically. The other thing I don't know is how to +# force automake to build a static lib with the PIC objects. So the +# following target, which is only used from the KIO build, deletes any .a +# and .so and rebuilds the .a with the pic objs (the kio build calls +# configured --disable-static). +# Of course this is very uncomfortably close to automake/libtool internals +# and may not work on all systems. +PicStatic: $(librecoll_la_OBJECTS) + rm -f .libs/librecoll.a + rm -f .libs/librecoll.so + libtool --mode=link gcc -g -O -o librecoll.la \ + $(librecoll_la_OBJECTS) + +bin_PROGRAMS = recollindex +if MAKECMDLINE + bin_PROGRAMS += recollq +endif + +if MAKEXADUMP + bin_PROGRAMS += xadump +endif + +recollindex_SOURCES = \ + index/recollindex.cpp \ + index/rclmonprc.cpp \ + index/rclmonrcv.cpp +recollindex_LDADD = librecoll.la + +recollq_SOURCES = query/recollqmain.cpp +recollq_LDADD = librecoll.la + +xadump_SOURCES = query/xadump.cpp +xadump_LDADD = librecoll.la $(LIBXAPIAN) $(LIBICONV) + +# Note: I'd prefer the generated query parser files not to be distributed +# at all, but failed to achieve this +EXTRA_DIST = \ +bincimapmime/00README.recoll bincimapmime/AUTHORS bincimapmime/COPYING \ +\ +desktop/hotrecoll.py \ +desktop/recoll.appdata.xml \ +desktop/recollindex.desktop \ +desktop/recoll_index_on_ac.sh \ +desktop/recoll-searchgui.desktop \ +desktop/recoll.png desktop/recoll.svg desktop/recoll.xcf \ +\ +doc/man \ +doc/prog \ +doc/user/*.html doc/user/*.css doc/user/*.txt doc/user/*.xml doc/user/Makefile \ +\ +filters \ +\ +index/rclmon.sh \ +\ +kde/kioslave/kio_recoll/00README.txt \ +kde/kioslave/kio_recoll/CMakeLists.txt \ +kde/kioslave/kio_recoll/data/help.html \ +kde/kioslave/kio_recoll/data/searchable.html \ +kde/kioslave/kio_recoll/data/welcome.html \ +kde/kioslave/kio_recoll/dirif.cpp \ +kde/kioslave/kio_recoll/htmlif.cpp \ +kde/kioslave/kio_recoll/kio_recoll.cpp \ +kde/kioslave/kio_recoll/kio_recoll.h \ +kde/kioslave/kio_recoll/recollf.protocol \ +kde/kioslave/kio_recoll/recollnolist.protocol \ +kde/kioslave/kio_recoll/recoll.protocol \ +\ +query/location.hh query/position.hh query/stack.hh \ +\ +qtgui/advsearch.ui \ +qtgui/advsearch_w.cpp \ +qtgui/advsearch_w.h \ +qtgui/advshist.cpp \ +qtgui/advshist.h \ +qtgui/confgui/confgui.cpp \ +qtgui/confgui/confgui.h \ +qtgui/confgui/confguiindex.cpp \ +qtgui/confgui/confguiindex.h \ +qtgui/confgui/conflinkrcl.h \ +qtgui/confgui/main.cpp \ +qtgui/crontool.cpp \ +qtgui/crontool.h \ +qtgui/crontool.ui \ +qtgui/editdialog.h \ +qtgui/editdialog.ui \ +qtgui/firstidx.h \ +qtgui/firstidx.ui \ +qtgui/fragbuts.cpp \ +qtgui/fragbuts.h \ +qtgui/guiutils.cpp \ +qtgui/guiutils.h \ +qtgui/i18n/recoll_cs.qm qtgui/i18n/recoll_cs.ts \ +qtgui/i18n/recoll_da.qm qtgui/i18n/recoll_da.ts \ +qtgui/i18n/recoll_de.qm qtgui/i18n/recoll_de.ts \ +qtgui/i18n/recoll_el.qm qtgui/i18n/recoll_el.ts \ +qtgui/i18n/recoll_es.qm qtgui/i18n/recoll_es.ts \ +qtgui/i18n/recoll_fr.qm qtgui/i18n/recoll_fr.ts \ +qtgui/i18n/recoll_it.qm qtgui/i18n/recoll_it.ts \ +qtgui/i18n/recoll_lt.qm qtgui/i18n/recoll_lt.ts \ +qtgui/i18n/recoll_pl.qm qtgui/i18n/recoll_pl.ts \ +qtgui/i18n/recoll_ru.qm qtgui/i18n/recoll_ru.ts \ +qtgui/i18n/recoll_tr.qm qtgui/i18n/recoll_tr.ts \ +qtgui/i18n/recoll_uk.qm qtgui/i18n/recoll_uk.ts \ +qtgui/i18n/recoll_xx.qm qtgui/i18n/recoll_xx.ts \ +qtgui/i18n/recoll_zh_CN.qm qtgui/i18n/recoll_zh_CN.ts \ +qtgui/i18n/recoll_zh.qm qtgui/i18n/recoll_zh.ts \ +qtgui/idxsched.h \ +qtgui/idxsched.ui \ +qtgui/images/asearch.png \ +qtgui/images/cancel.png \ +qtgui/images/close.png \ +qtgui/images/code-block.png \ +qtgui/images/down.png \ +qtgui/images/firstpage.png \ +qtgui/images/history.png \ +qtgui/images/nextpage.png \ +qtgui/images/prevpage.png \ +qtgui/images/recoll.icns \ +qtgui/images/recoll.png \ +qtgui/images/sortparms.png \ +qtgui/images/spell.png \ +qtgui/images/table.png \ +qtgui/images/up.png \ +qtgui/listdialog.h \ +qtgui/listdialog.ui \ +qtgui/main.cpp \ +qtgui/mtpics/aptosid-book.png \ +qtgui/mtpics/aptosid-manual-copyright.txt \ +qtgui/mtpics/aptosid-manual.png \ +qtgui/mtpics/archive.png \ +qtgui/mtpics/bookchap.png \ +qtgui/mtpics/book.png \ +qtgui/mtpics/document.png \ +qtgui/mtpics/drawing.png \ +qtgui/mtpics/emblem-symbolic-link.png \ +qtgui/mtpics/folder.png \ +qtgui/mtpics/html.png \ +qtgui/mtpics/image.png \ +qtgui/mtpics/License_sidux.txt \ +qtgui/mtpics/message.png \ +qtgui/mtpics/mozilla_doc.png \ +qtgui/mtpics/pdf.png \ +qtgui/mtpics/pidgin.png \ +qtgui/mtpics/postscript.png \ +qtgui/mtpics/presentation.png \ +qtgui/mtpics/README \ +qtgui/mtpics/sidux-book.png \ +qtgui/mtpics/soffice.png \ +qtgui/mtpics/source.png \ +qtgui/mtpics/sownd.png \ +qtgui/mtpics/spreadsheet.png \ +qtgui/mtpics/text-x-python.png \ +qtgui/mtpics/txt.png \ +qtgui/mtpics/video.png \ +qtgui/mtpics/wordprocessing.png \ +qtgui/multisave.cpp \ +qtgui/multisave.h \ +qtgui/preview_w.cpp \ +qtgui/preview_w.h \ +qtgui/ptrans.ui \ +qtgui/ptrans_w.cpp \ +qtgui/ptrans_w.h \ +qtgui/rclhelp.cpp \ +qtgui/rclhelp.h \ +qtgui/rclmain.ui \ +qtgui/rclmain_w.cpp \ +qtgui/rclmain_w.h \ +qtgui/rclm_idx.cpp \ +qtgui/rclm_preview.cpp \ +qtgui/rclm_saveload.cpp \ +qtgui/rclm_view.cpp \ +qtgui/rclm_wins.cpp \ +qtgui/rclzg.cpp \ +qtgui/rclzg.h \ +qtgui/recoll.h \ +qtgui/recoll.pro.in \ +qtgui/recoll.qrc \ +qtgui/reslist.cpp \ +qtgui/reslist.h \ +qtgui/respopup.cpp \ +qtgui/respopup.h \ +qtgui/restable.cpp \ +qtgui/restable.h \ +qtgui/restable.ui \ +qtgui/rtitool.cpp \ +qtgui/rtitool.h \ +qtgui/rtitool.ui \ +qtgui/searchclause_w.cpp \ +qtgui/searchclause_w.h \ +qtgui/snippets.ui \ +qtgui/snippets_w.cpp \ +qtgui/snippets_w.h \ +qtgui/spell.ui \ +qtgui/spell_w.cpp \ +qtgui/spell_w.h \ +qtgui/ssearchb.ui \ +qtgui/ssearch_w.cpp \ +qtgui/ssearch_w.h \ +qtgui/systray.cpp \ +qtgui/systray.h \ +qtgui/uiprefs.ui \ +qtgui/uiprefs_w.cpp \ +qtgui/uiprefs_w.h \ +qtgui/ui_rclmain.h-4.5 \ +qtgui/viewaction.ui \ +qtgui/viewaction_w.cpp \ +qtgui/viewaction_w.h \ +qtgui/xmltosd.cpp \ +qtgui/xmltosd.h \ +\ +python/README.txt \ +python/recoll/Makefile \ +python/recoll/pyrclextract.cpp \ +python/recoll/pyrecoll.cpp \ +python/recoll/pyrecoll.h \ +python/recoll/recoll/__init__.py \ +python/recoll/recoll/rclconfig.py \ +python/recoll/setup.py.in \ +python/samples/docdups.py \ +python/samples/mutt-recoll.py \ +python/samples/rcldlkp.py \ +python/samples/rclmbox.py \ +python/samples/recollgui/Makefile \ +python/samples/recollgui/qrecoll.py \ +python/samples/recollgui/rclmain.ui \ +python/samples/recollq.py \ +python/samples/recollqsd.py \ +\ + \ +sampleconf/fields sampleconf/fragbuts.xml sampleconf/mimeconf \ +sampleconf/mimemap sampleconf/mimeview sampleconf/mimeview.mac \ +sampleconf/recoll.conf.in sampleconf/recoll.qss \ +\ +unac/AUTHORS unac/COPYING unac/README unac/README.recoll \ +\ +VERSION + +# EXTRA_DIST: The Php Code does not build anymore. No need to ship it until +# someone fixes it: +# php/00README.txt php/recoll/config.m4 php/recoll/make.sh +# php/recoll/php_recoll.h php/recoll/recoll.cpp php/sample/shell.php + +if MAKEPYTHON +all-local: recollpython +recollpython: librecoll.la + ${MAKE} -C python/recoll libdir=$(libdir) +install-exec-local: recollpython-install +recollpython-install: + (cd python/recoll; \ + if test -f /etc/debian_version ; then \ + OPTSFORPYTHON=--install-layout=deb; \ + fi; \ + set -x; \ + python setup.py install \ + --prefix=${prefix} --root=$${DESTDIR:-/} $${OPTSFORPYTHON}) +clean-local: recollpython-clean +recollpython-clean: + rm -rf python/recoll/build +endif + +if MAKEQT +all-local: recollqt +recollqt: librecoll.la + (cd $(QTGUI); ${QMAKE} PREFIX=${prefix} recoll.pro) + $(MAKE) -C $(QTGUI) LFLAGS="$(LDFLAGS)" prefix=$(prefix) \ + exec_prefix=$(exec_prefix) libdir=$(libdir) +clean-local: recollqt-clean +recollqt-clean: + -$(MAKE) -C $(QTGUI) clean +install-exec-local: recollqt-install +recollqt-install: + $(MAKE) -C $(QTGUI) LFLAGS="$(LDFLAGS)" prefix=$(prefix) \ + exec_prefix=$(exec_prefix) libdir=$(libdir) install +endif + +defconfdir = $(pkgdatadir)/examples +defconf_DATA = \ +desktop/recollindex.desktop \ +index/rclmon.sh \ +sampleconf/fragbuts.xml \ +sampleconf/fields \ +sampleconf/recoll.conf \ +sampleconf/mimeconf \ +sampleconf/recoll.qss \ +sampleconf/mimemap \ +sampleconf/mimeview + +filterdir = $(pkgdatadir)/filters +filter_DATA = \ +desktop/hotrecoll.py \ +filters/rcl* \ +filters/ppt-dump.py \ +filters/xls-dump.py \ +filters/xlsxmltocsv.py \ +filters/msodump.zip \ +python/recoll/recoll/rclconfig.py + +install-data-hook: + (cd $(DESTDIR)/$(filterdir); \ + chmod a+x rcl* ppt-dump.py xls-dump.py xlsxmltocsv.py hotrecoll.py; \ + chmod 0644 msodump.zip rclexecm.py rcllatinstops.zip rclconfig.py) + +if MAKEUSERDOC +rdocdir = $(pkgdatadir)/doc +rdoc_DATA = doc/user/usermanual.html doc/user/docbook-xsl.css +doc/user/usermanual.html: doc/user/usermanual.xml + $(MAKE) -C doc/user +endif + +dist_man1_MANS = doc/man/recoll.1 doc/man/recollq.1 doc/man/recollindex.1 +dist_man5_MANS = doc/man/recoll.conf.5 + +dist-hook: + modified=`hg status | grep -v /$(distdir)/`; \ + if test ! -z "$$modified"; then \ + echo Local directory is modified: $$modified ; exit 1; fi + hg tag -f -m "Release $(VERSION) tagged" RECOLL-$(VERSION) diff --git a/src/README b/src/README new file mode 100644 index 00000000..b99332a5 --- /dev/null +++ b/src/README @@ -0,0 +1,4612 @@ + +More documentation can be found in the doc/ directory or at http://www.recoll.org + + + Recoll user manual + + Jean-Francois Dockes + + + + Copyright (c) 2005-2015 Jean-Francois Dockes + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 or any + later version published by the Free Software Foundation; with no Invariant + Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the + license can be found at the following location: GNU web site. + + This document introduces full text search notions and describes the + installation and use of the Recoll application. This version describes + Recoll 1.21. + + ---------------------------------------------------------------------- + + Table of Contents + + 1. Introduction + + 1.1. Giving it a try + + 1.2. Full text search + + 1.3. Recoll overview + + 2. Indexing + + 2.1. Introduction + + 2.1.1. Indexing modes + + 2.1.2. Configurations, multiple indexes + + 2.1.3. Document types + + 2.1.4. Indexing failures + + 2.1.5. Recovery + + 2.2. Index storage + + 2.2.1. Xapian index formats + + 2.2.2. Security aspects + + 2.3. Index configuration + + 2.3.1. Multiple indexes + + 2.3.2. Index case and diacritics sensitivity + + 2.3.3. The index configuration GUI + + 2.4. Indexing WEB pages you wisit + + 2.5. Extended attributes data + + 2.6. Importing external tags + + 2.7. Periodic indexing + + 2.7.1. Running indexing + + 2.7.2. Using cron to automate indexing + + 2.8. Real time indexing + + 2.8.1. Slowing down the reindexing rate for fast + changing files + + 3. Searching + + 3.1. Searching with the Qt graphical user interface + + 3.1.1. Simple search + + 3.1.2. The default result list + + 3.1.3. The result table + + 3.1.4. Running arbitrary commands on result + files (1.20 and later) + + 3.1.5. Displaying thumbnails + + 3.1.6. The preview window + + 3.1.7. The Query Fragments window + + 3.1.8. Complex/advanced search + + 3.1.9. The term explorer tool + + 3.1.10. Multiple indexes + + 3.1.11. Document history + + 3.1.12. Sorting search results and collapsing + duplicates + + 3.1.13. Search tips, shortcuts + + 3.1.14. Saving and restoring queries (1.21 and + later) + + 3.1.15. Customizing the search interface + + 3.2. Searching with the KDE KIO slave + + 3.2.1. What's this + + 3.2.2. Searchable documents + + 3.3. Searching on the command line + + 3.4. Path translations + + 3.5. The query language + + 3.5.1. Modifiers + + 3.6. Search case and diacritics sensitivity + + 3.7. Anchored searches and wildcards + + 3.7.1. More about wildcards + + 3.7.2. Anchored searches + + 3.8. Desktop integration + + 3.8.1. Hotkeying recoll + + 3.8.2. The KDE Kicker Recoll applet + + 4. Programming interface + + 4.1. Writing a document input handler + + 4.1.1. Simple input handlers + + 4.1.2. "Multiple" handlers + + 4.1.3. Telling Recoll about the handler + + 4.1.4. Input handler HTML output + + 4.1.5. Page numbers + + 4.2. Field data processing + + 4.3. API + + 4.3.1. Interface elements + + 4.3.2. Python interface + + 5. Installation and configuration + + 5.1. Installing a binary copy + + 5.2. Supporting packages + + 5.3. Building from source + + 5.3.1. Prerequisites + + 5.3.2. Building + + 5.3.3. Installation + + 5.4. Configuration overview + + 5.4.1. Environment variables + + 5.4.2. The main configuration file, recoll.conf + + 5.4.3. The fields file + + 5.4.4. The mimemap file + + 5.4.5. The mimeconf file + + 5.4.6. The mimeview file + + 5.4.7. The ptrans file + + 5.4.8. Examples of configuration adjustments + +Chapter 1. Introduction + +1.1. Giving it a try + + If you do not like reading manuals (who does?) but wish to give Recoll a + try, just install the application and start the recoll graphical user + interface (GUI), which will ask permission to index your home directory by + default, allowing you to search immediately after indexing completes. + + Do not do this if your home directory contains a huge number of documents + and you do not want to wait or are very short on disk space. In this case, + you may first want to customize the configuration to restrict the indexed + area (for the very impatient with a completed package install, from the + recoll GUI: Preferences -> Indexing configuration, then adjust the Top + directories section). + + Also be aware that you may need to install the appropriate supporting + applications for document types that need them (for example antiword for + Microsoft Word files). + +1.2. Full text search + + Recoll is a full text search application. Full text search finds your data + by content rather than by external attributes (like a file name). You + specify words (terms) which should or should not appear in the text you + are looking for, and receive in return a list of matching documents, + ordered so that the most relevant documents will appear first. + + You do not need to remember in what file or email message you stored a + given piece of information. You just ask for related terms, and the tool + will return a list of documents where these terms are prominent, in a + similar way to Internet search engines. + + Full text search applications try to determine which documents are most + relevant to the search terms you provide. Computer algorithms for + determining relevance can be very complex, and in general are inferior to + the power of the human mind to rapidly determine relevance. The quality of + relevance guessing is probably the most important aspect when evaluating a + search application. + + In many cases, you are looking for all the forms of a word, including + plurals, different tenses for a verb, or terms derived from the same root + or stem (example: floor, floors, floored, flooring...). Queries are + usually automatically expanded to all such related terms (words that + reduce to the same stem). This can be prevented for searching for a + specific form. + + Stemming, by itself, does not accommodate for misspellings or phonetic + searches. A full text search application may also support this form of + approximation. For example, a search for aliterattion returning no result + may propose, depending on index contents, alliteration alteration + alterations altercation as possible replacement terms. + +1.3. Recoll overview + + Recoll uses the Xapian information retrieval library as its storage and + retrieval engine. Xapian is a very mature package using a sophisticated + probabilistic ranking model. + + The Xapian library manages an index database which describes where terms + appear in your document files. It efficiently processes the complex + queries which are produced by the Recoll query expansion mechanism, and is + in charge of the all-important relevance computation task. + + Recoll provides the mechanisms and interface to get data into and out of + the index. This includes translating the many possible document formats + into pure text, handling term variations (using Xapian stemmers), and + spelling approximations (using the aspell speller), interpreting user + queries and presenting results. + + In a shorter way, Recoll does the dirty footwork, Xapian deals with the + intelligent parts of the process. + + The Xapian index can be big (roughly the size of the original document + set), but it is not a document archive. Recoll can only display documents + that still exist at the place from which they were indexed. (Actually, + there is a way to reconstruct a document from the information in the + index, but the result is not nice, as all formatting, punctuation and + capitalization are lost). + + Recoll stores all internal data in Unicode UTF-8 format, and it can index + files of many types with different character sets, encodings, and + languages into the same index. It can process documents embedded inside + other documents (for example a pdf document stored inside a Zip archive + sent as an email attachment...), down to an arbitrary depth. + + Stemming is the process by which Recoll reduces words to their radicals so + that searching does not depend, for example, on a word being singular or + plural (floor, floors), or on a verb tense (flooring, floored). Because + the mechanisms used for stemming depend on the specific grammatical rules + for each language, there is a separate Xapian stemmer module for most + common languages where stemming makes sense. + + Recoll stores the unstemmed versions of terms in the main index and uses + auxiliary databases for term expansion (one for each stemming language), + which means that you can switch stemming languages between searches, or + add a language without needing a full reindex. + + Storing documents written in different languages in the same index is + possible, and commonly done. In this situation, you can specify several + stemming languages for the index. + + Recoll currently makes no attempt at automatic language recognition, which + means that the stemmer will sometimes be applied to terms from other + languages with potentially strange results. In practise, even if this + introduces possibilities of confusion, this approach has been proven quite + useful, and it is much less cumbersome than separating your documents + according to what language they are written in. + + Before version 1.18, Recoll stripped most accents and diacritics from + terms, and converted them to lower case before either storing them in the + index or searching for them. As a consequence, it was impossible to search + for a particular capitalization of a term (US / us), or to discriminate + two terms based on diacritics (sake / sake, mate / mate). + + As of version 1.18, Recoll can optionally store the raw terms, without + accent stripping or case conversion. In this configuration, it is still + possible (and most common) for a query to be insensitive to case and/or + diacritics. Appropriate term expansions are performed before actually + accessing the main index. This is described in more detail in the section + about index case and diacritics sensitivity. + + Recoll has many parameters which define exactly what to index, and how to + classify and decode the source documents. These are kept in configuration + files. A default configuration is copied into a standard location (usually + something like /usr/[local/]share/recoll/examples) during installation. + The default values set by the configuration files in this directory may be + overridden by values that you set inside your personal configuration, + found by default in the .recoll sub-directory of your home directory. The + default configuration will index your home directory with default + parameters and should be sufficient for giving Recoll a try, but you may + want to adjust it later, which can be done either by editing the text + files or by using configuration menus in the recoll GUI. Some other + parameters affecting only the recoll GUI are stored in the standard + location defined by Qt. + + The indexing process is started automatically the first time you execute + the recoll GUI. Indexing can also be performed by executing the + recollindex command. Recoll indexing is multithreaded by default when + appropriate hardware resources are available, and can perform in parallel + multiple tasks among text extraction, segmentation and index updates. + + Searches are usually performed inside the recoll GUI, which has many + options to help you find what you are looking for. However, there are + other ways to perform Recoll searches: mostly a command line interface, a + Python programming interface, a KDE KIO slave module, and Ubuntu Unity + Lens (for older versions) or Scope (for current versions) modules. + +Chapter 2. Indexing + +2.1. Introduction + + Indexing is the process by which the set of documents is analyzed and the + data entered into the database. Recoll indexing is normally incremental: + documents will only be processed if they have been modified since the last + run. On the first execution, all documents will need processing. A full + index build can be forced later by specifying an option to the indexing + command (recollindex -z or -Z). + + recollindex skips files which caused an error during a previous pass. This + is a performance optimization, and a new behaviour in version 1.21 (failed + files were always retried by previous versions). The command line option + -k can be set to retry failed files, for example after updating a filter. + + The following sections give an overview of different aspects of the + indexing processes and configuration, with links to detailed sections. + + Depending on your data, temporary files may be needed during indexing, + some of them possibly quite big. You can use the RECOLL_TMPDIR or TMPDIR + environment variables to determine where they are created (the default is + to use /tmp). Using TMPDIR has the nice property that it may also be taken + into account by auxiliary commands executed by recollindex. + + 2.1.1. Indexing modes + + Recoll indexing can be performed along two different modes: + + o Periodic (or batch) indexing: indexing takes place at discrete times, + by executing the recollindex command. The typical usage is to have a + nightly indexing run programmed into your cron file. + + o Real time indexing: indexing takes place as soon as a file is created + or changed. recollindex runs as a daemon and uses a file system + alteration monitor such as inotify, Fam or Gamin to detect file + changes. + + The choice between the two methods is mostly a matter of preference, and + they can be combined by setting up multiple indexes (ie: use periodic + indexing on a big documentation directory, and real time indexing on a + small home directory). Monitoring a big file system tree can consume + significant system resources. + + The choice of method and the parameters used can be configured from the + recoll GUI: Preferences -> Indexing schedule + + 2.1.2. Configurations, multiple indexes + + The parameters describing what is to be indexed and local preferences are + defined in text files contained in a configuration directory. + + All parameters have defaults, defined in system-wide files. + + Without further configuration, Recoll will index all appropriate files + from your home directory, with a reasonable set of defaults. + + A default personal configuration directory ($HOME/.recoll/) is created + when a Recoll program is first executed. It is possible to create other + configuration directories, and use them by setting the RECOLL_CONFDIR + environment variable, or giving the -c option to any of the Recoll + commands. + + In some cases, it may be interesting to index different areas of the file + system to separate databases. You can do this by using multiple + configuration directories, each indexing a file system area to a specific + database. Typically, this would be done to separate personal and shared + indexes, or to take advantage of the organization of your data to improve + search precision. + + The generated indexes can be queried concurrently in a transparent manner. + + For index generation, multiple configurations are totally independant from + each other. When multiple indexes need to be used for a single search, + some parameters should be consistent among the configurations. + + 2.1.3. Document types + + Recoll knows about quite a few different document types. The parameters + for document types recognition and processing are set in configuration + files. + + Most file types, like HTML or word processing files, only hold one + document. Some file types, like email folders or zip archives, can hold + many individually indexed documents, which may themselves be compound + ones. Such hierarchies can go quite deep, and Recoll can process, for + example, a LibreOffice document stored as an attachment to an email + message inside an email folder archived in a zip file... + + Recoll indexing processes plain text, HTML, OpenDocument + (Open/LibreOffice), email formats, and a few others internally. + + Other file types (ie: postscript, pdf, ms-word, rtf ...) need external + applications for preprocessing. The list is in the installation section. + After every indexing operation, Recoll updates a list of commands that + would be needed for indexing existing files types. This list can be + displayed by selecting the menu option File -> Show Missing Helpers in the + recoll GUI. It is stored in the missing text file inside the configuration + directory. + + By default, Recoll will try to index any file type that it has a way to + read. This is sometimes not desirable, and there are ways to either + exclude some types, or on the contrary to define a positive list of types + to be indexed. In the latter case, any type not in the list will be + ignored. + + Excluding types can be done by adding wildcard name patterns to the + skippedNames list, which can be done from the GUI Index configuration + menu. For versions 1.20 and later, you can alternatively set the + excludedmimetypes list in the configuration file. This can be redefined + for subdirectories. + + You can also define an exclusive list of MIME types to be indexed (no + others will be indexed), by settting the indexedmimetypes configuration + variable. Example: + + indexedmimetypes = text/html application/pdf + + + It is possible to redefine this parameter for subdirectories. Example: + + [/path/to/my/dir] + indexedmimetypes = application/pdf + + + (When using sections like this, don't forget that they remain in effect + until the end of the file or another section indicator). + + excludedmimetypes or indexedmimetypes, can be set either by editing the + main configuration file (recoll.conf), or from the GUI index configuration + tool. + + 2.1.4. Indexing failures + + Indexing may fail for some documents, for a number of reasons: a helper + program may be missing, the document may be corrupt, we may fail to + uncompress a file because no file system space is available, etc. + + Recoll versions prior to 1.21 always retried to index files which had + previously caused an error. This guaranteed that anything that may have + become indexable (for example because a helper had been installed) would + be indexed. However this was bad for performance because some indexing + failures may be quite costly (for example failing to uncompress a big file + because of insufficient disk space). + + The indexer in Recoll versions 1.21 and later do not retry failed file by + default. Retrying will only occur if an explicit option (-k) is set on the + recollindex command line, or if a script executed when recollindex starts + up says so. The script is defined by a configuration variable + (checkneedretryindexscript), and makes a rather lame attempt at deciding + if a helper command may have been installed, by checking if any of the + common bin directories have changed. + + 2.1.5. Recovery + + In the rare case where the index becomes corrupted (which can signal + itself by weird search results or crashes), the index files need to be + erased before restarting a clean indexing pass. Just delete the xapiandb + directory (see next section), or, alternatively, start the next + recollindex with the -z option, which will reset the database before + indexing. + +2.2. Index storage + + The default location for the index data is the xapiandb subdirectory of + the Recoll configuration directory, typically $HOME/.recoll/xapiandb/. + This can be changed via two different methods (with different purposes): + + o You can specify a different configuration directory by setting the + RECOLL_CONFDIR environment variable, or using the -c option to the + Recoll commands. This method would typically be used to index + different areas of the file system to different indexes. For example, + if you were to issue the following commands: + + export RECOLL_CONFDIR=~/.indexes-email + recoll + + + Then Recoll would use configuration files stored in ~/.indexes-email/ + and, (unless specified otherwise in recoll.conf) would look for the + index in ~/.indexes-email/xapiandb/. + + Using multiple configuration directories and configuration options + allows you to tailor multiple configurations and indexes to handle + whatever subset of the available data you wish to make searchable. + + o For a given configuration directory, you can specify a non-default + storage location for the index by setting the dbdir parameter in the + configuration file (see the configuration section). This method would + mainly be of use if you wanted to keep the configuration directory in + its default location, but desired another location for the index, + typically out of disk occupation concerns. + + The size of the index is determined by the size of the set of documents, + but the ratio can vary a lot. For a typical mixed set of documents, the + index size will often be close to the data set size. In specific cases (a + set of compressed mbox files for example), the index can become much + bigger than the documents. It may also be much smaller if the documents + contain a lot of images or other non-indexed data (an extreme example + being a set of mp3 files where only the tags would be indexed). + + Of course, images, sound and video do not increase the index size, which + means that nowadays (2012), typically, even a big index will be negligible + against the total amount of data on the computer. + + The index data directory (xapiandb) only contains data that can be + completely rebuilt by an index run (as long as the original documents + exist), and it can always be destroyed safely. + + 2.2.1. Xapian index formats + + Xapian versions usually support several formats for index storage. A given + major Xapian version will have a current format, used to create new + indexes, and will also support the format from the previous major version. + + Xapian will not convert automatically an existing index from the older + format to the newer one. If you want to upgrade to the new format, or if a + very old index needs to be converted because its format is not supported + any more, you will have to explicitly delete the old index, then run a + normal indexing process. + + Using the -z option to recollindex is not sufficient to change the format, + you will have to delete all files inside the index directory (typically + ~/.recoll/xapiandb) before starting the indexing. + + 2.2.2. Security aspects + + The Recoll index does not hold copies of the indexed documents. But it + does hold enough data to allow for an almost complete reconstruction. If + confidential data is indexed, access to the database directory should be + restricted. + + Recoll (since version 1.4) will create the configuration directory with a + mode of 0700 (access by owner only). As the index data directory is by + default a sub-directory of the configuration directory, this should result + in appropriate protection. + + If you use another setup, you should think of the kind of protection you + need for your index, set the directory and files access modes + appropriately, and also maybe adjust the umask used during index updates. + +2.3. Index configuration + + Variables set inside the Recoll configuration files control which areas of + the file system are indexed, and how files are processed. These variables + can be set either by editing the text files or by using the dialogs in the + recoll GUI. + + The first time you start recoll, you will be asked whether or not you + would like it to build the index. If you want to adjust the configuration + before indexing, just click Cancel at this point, which will get you into + the configuration interface. If you exit at this point, recoll will have + created a ~/.recoll directory containing empty configuration files, which + you can edit by hand. + + The configuration is documented inside the installation chapter of this + document, or in the recoll.conf(5) man page, but the most current + information will most likely be the comments inside the sample file. The + most immediately useful variable you may interested in is probably + topdirs, which determines what subtrees get indexed. + + The applications needed to index file types other than text, HTML or email + (ie: pdf, postscript, ms-word...) are described in the external packages + section. + + As of Recoll 1.18 there are two incompatible types of Recoll indexes, + depending on the treatment of character case and diacritics. The next + section describes the two types in more detail. + + 2.3.1. Multiple indexes + + Multiple Recoll indexes can be created by using several configuration + directories which are usually set to index different areas of the file + system. A specific index can be selected for updating or searching, using + the RECOLL_CONFDIR environment variable or the -c option to recoll and + recollindex. + + A typical usage scenario for the multiple index feature would be for a + system administrator to set up a central index for shared data, that you + choose to search or not in addition to your personal data. Of course, + there are other possibilities. There are many cases where you know the + subset of files that should be searched, and where narrowing the search + can improve the results. You can achieve approximately the same effect + with the directory filter in advanced search, but multiple indexes will + have much better performance and may be worth the trouble. + + A recollindex program instance can only update one specific index. + + The main index (defined by RECOLL_CONFDIR or -c) is always active. If this + is undesirable, you can set up your base configuration to index an empty + directory. + + The different search interfaces (GUI, command line, ...) have different + methods to define the set of indexes to be used, see the appropriate + section. + + If a set of multiple indexes are to be used together for searches, some + configuration parameters must be consistent among the set. These are + parameters which need to be the same when indexing and searching. As the + parameters come from the main configuration when searching, they need to + be compatible with what was set when creating the other indexes (which + came from their respective configuration directories). + + Most importantly, all indexes to be queried concurrently must have the + same option concerning character case and diacritics stripping, but there + are other constraints. Most of the relevant parameters are described in + the linked section. + + 2.3.2. Index case and diacritics sensitivity + + As of Recoll version 1.18 you have a choice of building an index with + terms stripped of character case and diacritics, or one with raw terms. + For a source term of Resume, the former will store resume, the latter + Resume. + + Each type of index allows performing searches insensitive to case and + diacritics: with a raw index, the user entry will be expanded to match all + case and diacritics variations present in the index. With a stripped + index, the search term will be stripped before searching. + + A raw index allows for another possibility which a stripped index cannot + offer: using case and diacritics to discriminate between terms, returning + different results when searching for US and us or resume and resume. Read + the section about search case and diacritics sensitivity for more details. + + The type of index to be created is controlled by the indexStripChars + configuration variable which can only be changed by editing the + configuration file. Any change implies an index reset (not automated by + Recoll), and all indexes in a search must be set in the same way (again, + not checked by Recoll). + + If the indexStripChars is not set, Recoll 1.18 creates a stripped index by + default, for compatibility with previous versions. + + As a cost for added capability, a raw index will be slightly bigger than a + stripped one (around 10%). Also, searches will be more complex, so + probably slightly slower, and the feature is still young, so that a + certain amount of weirdness cannot be excluded. + + One of the most adverse consequence of using a raw index is that some + phrase and proximity searches may become impossible: because each term + needs to be expanded, and all combinations searched for, the + multiplicative expansion may become unmanageable. + + 2.3.3. The index configuration GUI + + Most parameters for a given index configuration can be set from a recoll + GUI running on this configuration (either as default, or by setting + RECOLL_CONFDIR or the -c option.) + + The interface is started from the Preferences -> Index Configuration menu + entry. It is divided in four tabs, Global parameters, Local parameters, + Web history (which is explained in the next section) and Search + parameters. + + The Global parameters tab allows setting global variables, like the lists + of top directories, skipped paths, or stemming languages. + + The Local parameters tab allows setting variables that can be redefined + for subdirectories. This second tab has an initially empty list of + customisation directories, to which you can add. The variables are then + set for the currently selected directory (or at the top level if the empty + line is selected). + + The Search parameters section defines parameters which are used at query + time, but are global to an index and affect all search tools, not only the + GUI. + + The meaning for most entries in the interface is self-evident and + documented by a ToolTip popup on the text label. For more detail, you will + need to refer to the configuration section of this guide. + + The configuration tool normally respects the comments and most of the + formatting inside the configuration file, so that it is quite possible to + use it on hand-edited files, which you might nevertheless want to backup + first... + +2.4. Indexing WEB pages you wisit + + With the help of a Firefox extension, Recoll can index the Internet pages + that you visit. The extension was initially designed for the Beagle + indexer, but it has recently be renamed and better adapted to Recoll. + + The extension works by copying visited WEB pages to an indexing queue + directory, which Recoll then processes, indexing the data, storing it into + a local cache, then removing the file from the queue. + + This feature can be enabled in the GUI Index configuration panel, or by + editing the configuration file (set processwebqueue to 1). + + A current pointer to the extension can be found, along with up-to-date + instructions, on the Recoll wiki. + + A copy of the indexed WEB pages is retained by Recoll in a local cache + (from which previews can be fetched). The cache size can be adjusted from + the Index configuration / Web history panel. Once the maximum size is + reached, old pages are purged - both from the cache and the index - to + make room for new ones, so you need to explicitly archive in some other + place the pages that you want to keep indefinitely. + +2.5. Extended attributes data + + User extended attributes are named pieces of information that most modern + file systems can attach to any file. + + Recoll versions 1.19 and later process extended attributes as document + fields by default. For older versions, this has to be activated at build + time. + + A freedesktop standard defines a few special attributes, which are handled + as such by Recoll: + + mime_type + + If set, this overrides any other determination of the file MIME + type. + + charset + If set, this defines the file character set (mostly useful for + plain text files). + + By default, other attributes are handled as Recoll fields. On Linux, the + user prefix is removed from the name. This can be configured more + precisely inside the fields configuration file. + +2.6. Importing external tags + + During indexing, it is possible to import metadata for each file by + executing commands. For example, this could extract user tag data for the + file and store it in a field for indexing. + + See the section about the metadatacmds field in the main configuration + chapter for more detail. + +2.7. Periodic indexing + + 2.7.1. Running indexing + + Indexing is always performed by the recollindex program, which can be + started either from the command line or from the File menu in the recoll + GUI program. When started from the GUI, the indexing will run on the same + configuration recoll was started on. When started from the command line, + recollindex will use the RECOLL_CONFDIR variable or accept a -c confdir + option to specify a non-default configuration directory. + + If the recoll program finds no index when it starts, it will automatically + start indexing (except if canceled). + + The recollindex indexing process can be interrupted by sending an + interrupt (Ctrl-C, SIGINT) or terminate (SIGTERM) signal. Some time may + elapse before the process exits, because it needs to properly flush and + close the index. This can also be done from the recoll GUI File -> Stop + Indexing menu entry. + + After such an interruption, the index will be somewhat inconsistent + because some operations which are normally performed at the end of the + indexing pass will have been skipped (for example, the stemming and + spelling databases will be inexistant or out of date). You just need to + restart indexing at a later time to restore consistency. The indexing will + restart at the interruption point (the full file tree will be traversed, + but files that were indexed up to the interruption and for which the index + is still up to date will not need to be reindexed). + + recollindex has a number of other options which are described in its man + page. Only a few will be described here. + + Option -z will reset the index when starting. This is almost the same as + destroying the index files (the nuance is that the Xapian format version + will not be changed). + + Option -Z will force the update of all documents without resetting the + index first. This will not have the "clean start" aspect of -z, but the + advantage is that the index will remain available for querying while it is + rebuilt, which can be a significant advantage if it is very big (some + installations need days for a full index rebuild). + + Option -k will force retrying files which previously failed to be indexed, + for example because of a missing helper program. + + Of special interest also, maybe, are the -i and -f options. -i allows + indexing an explicit list of files (given as command line parameters or + read on stdin). -f tells recollindex to ignore file selection parameters + from the configuration. Together, these options allow building a custom + file selection process for some area of the file system, by adding the top + directory to the skippedPaths list and using an appropriate file selection + method to build the file list to be fed to recollindex -if. Trivial + example: + + find . -name indexable.txt -print | recollindex -if + + + recollindex -i will not descend into subdirectories specified as + parameters, but just add them as index entries. It is up to the external + file selection method to build the complete file list. + + 2.7.2. Using cron to automate indexing + + The most common way to set up indexing is to have a cron task execute it + every night. For example the following crontab entry would do it every day + at 3:30AM (supposing recollindex is in your PATH): + + 30 3 * * * recollindex > /some/tmp/dir/recolltrace 2>&1 + + Or, using anacron: + + 1 15 su mylogin -c "recollindex recollindex > /tmp/rcltraceme 2>&1" + + As of version 1.17 the Recoll GUI has dialogs to manage crontab entries + for recollindex. You can reach them from the Preferences -> Indexing + Schedule menu. They only work with the good old cron, and do not give + access to all features of cron scheduling. + + The usual command to edit your crontab is crontab -e (which will usually + start the vi editor to edit the file). You may have more sophisticated + tools available on your system. + + Please be aware that there may be differences between your usual + interactive command line environment and the one seen by crontab commands. + Especially the PATH variable may be of concern. Please check the crontab + manual pages about possible issues. + +2.8. Real time indexing + + Real time monitoring/indexing is performed by starting the recollindex -m + command. With this option, recollindex will detach from the terminal and + become a daemon, permanently monitoring file changes and updating the + index. + + Under KDE, Gnome and some other desktop environments, the daemon can + automatically started when you log in, by creating a desktop file inside + the ~/.config/autostart directory. This can be done for you by the Recoll + GUI. Use the Preferences->Indexing Schedule menu. + + With older X11 setups, starting the daemon is normally performed as part + of the user session script. + + The rclmon.sh script can be used to easily start and stop the daemon. It + can be found in the examples directory (typically + /usr/local/[share/]recoll/examples). + + For example, my out of fashion xdm-based session has a .xsession script + with the following lines at the end: + + recollconf=$HOME/.recoll-home + recolldata=/usr/local/share/recoll + RECOLL_CONFDIR=$recollconf $recolldata/examples/rclmon.sh start + + fvwm + + + The indexing daemon gets started, then the window manager, for which the + session waits. + + By default the indexing daemon will monitor the state of the X11 session, + and exit when it finishes, it is not necessary to kill it explicitly. (The + X11 server monitoring can be disabled with option -x to recollindex). + + If you use the daemon completely out of an X11 session, you need to add + option -x to disable X11 session monitoring (else the daemon will not + start). + + By default, the messages from the indexing daemon will be setn to the same + file as those from the interactive commands (logfilename). You may want to + change this by setting the daemlogfilename and daemloglevel configuration + parameters. Also the log file will only be truncated when the daemon + starts. If the daemon runs permanently, the log file may grow quite big, + depending on the log level. + + When building Recoll, the real time indexing support can be customised + during package configuration with the --with[out]-fam or + --with[out]-inotify options. The default is currently to include inotify + monitoring on systems that support it, and, as of Recoll 1.17, gamin + support on FreeBSD. + + While it is convenient that data is indexed in real time, repeated + indexing can generate a significant load on the system when files such as + email folders change. Also, monitoring large file trees by itself + significantly taxes system resources. You probably do not want to enable + it if your system is short on resources. Periodic indexing is adequate in + most cases. + + Increasing resources for inotify + + On Linux systems, monitoring a big tree may need increasing the resources + available to inotify, which are normally defined in /etc/sysctl.conf. + + ### inotify + # + # cat /proc/sys/fs/inotify/max_queued_events - 16384 + # cat /proc/sys/fs/inotify/max_user_instances - 128 + # cat /proc/sys/fs/inotify/max_user_watches - 16384 + # + # -- Change to: + # + fs.inotify.max_queued_events=32768 + fs.notify.max_user_instances=256 + fs.inotify.max_user_watches=32768 + + + Especially, you will need to trim your tree or adjust the max_user_watches + value if indexing exits with a message about errno ENOSPC (28) from + inotify_add_watch. + + 2.8.1. Slowing down the reindexing rate for fast changing files + + When using the real time monitor, it may happen that some files need to be + indexed, but change so often that they impose an excessive load for the + system. + + Recoll provides a configuration option to specify the minimum time before + which a file, specified by a wildcard pattern, cannot be reindexed. See + the mondelaypatterns parameter in the configuration section. + +Chapter 3. Searching + +3.1. Searching with the Qt graphical user interface + + The recoll program provides the main user interface for searching. It is + based on the Qt library. + + recoll has two search modes: + + o Simple search (the default, on the main screen) has a single entry + field where you can enter multiple words. + + o Advanced search (a panel accessed through the Tools menu or the + toolbox bar icon) has multiple entry fields, which you may use to + build a logical condition, with additional filtering on file type, + location in the file system, modification date, and size. + + In most cases, you can enter the terms as you think them, even if they + contain embedded punctuation or other non-textual characters. For example, + Recoll can handle things like email addresses, or arbitrary cut and paste + from another text window, punctation and all. + + The main case where you should enter text differently from how it is + printed is for east-asian languages (Chinese, Japanese, Korean). Words + composed of single or multiple characters should be entered separated by + white space in this case (they would typically be printed without white + space). + + Some searches can be quite complex, and you may want to re-use them later, + perhaps with some tweaking. Recoll versions 1.21 and later can save and + restore searches, using XML files. See Saving and restoring queries. + + 3.1.1. Simple search + + 1. Start the recoll program. + + 2. Possibly choose a search mode: Any term, All terms, File name or Query + language. + + 3. Enter search term(s) in the text field at the top of the window. + + 4. Click the Search button or hit the Enter key to start the search. + + The initial default search mode is Query language. Without special + directives, this will look for documents containing all of the search + terms (the ones with more terms will get better scores), just like the All + terms mode which will ignore such directives. Any term will search for + documents where at least one of the terms appear. + + The Query Language features are described in a separate section. + + All search modes allow wildcards inside terms (*, ?, []). You may want to + have a look at the section about wildcards for more information about + this. + + File name will specifically look for file names. The point of having a + separate file name search is that wild card expansion can be performed + more efficiently on a small subset of the index (allowing wild cards on + the left of terms without excessive penality). Things to know: + + o White space in the entry should match white space in the file name, + and is not treated specially. + + o The search is insensitive to character case and accents, independantly + of the type of index. + + o An entry without any wild card character and not capitalized will be + prepended and appended with '*' (ie: etc -> *etc*, but Etc -> etc). + + o If you have a big index (many files), excessively generic fragments + may result in inefficient searches. + + You can search for exact phrases (adjacent words in a given order) by + enclosing the input inside double quotes. Ex: "virtual reality". + + When using a stripped index, character case has no influence on search, + except that you can disable stem expansion for any term by capitalizing + it. Ie: a search for floor will also normally look for flooring, floored, + etc., but a search for Floor will only look for floor, in any character + case. Stemming can also be disabled globally in the preferences. When + using a raw index, the rules are a bit more complicated. + + Recoll remembers the last few searches that you performed. You can use the + simple search text entry widget (a combobox) to recall them (click on the + thing at the right of the text field). Please note, however, that only the + search texts are remembered, not the mode (all/any/file name). + + Typing Esc Space while entering a word in the simple search entry will + open a window with possible completions for the word. The completions are + extracted from the database. + + Double-clicking on a word in the result list or a preview window will + insert it into the simple search entry field. + + You can cut and paste any text into an All terms or Any term search field, + punctuation, newlines and all - except for wildcard characters (single ? + characters are ok). Recoll will process it and produce a meaningful + search. This is what most differentiates this mode from the Query Language + mode, where you have to care about the syntax. + + You can use the Tools -> Advanced search dialog for more complex searches. + + 3.1.2. The default result list + + After starting a search, a list of results will instantly be displayed in + the main list window. + + By default, the document list is presented in order of relevance (how well + the system estimates that the document matches the query). You can sort + the result by ascending or descending date by using the vertical arrows in + the toolbar. + + Clicking on the Preview link for an entry will open an internal preview + window for the document. Further Preview clicks for the same search will + open tabs in the existing preview window. You can use Shift+Click to force + the creation of another preview window, which may be useful to view the + documents side by side. (You can also browse successive results in a + single preview window by typing Shift+ArrowUp/Down in the window). + + Clicking the Open link will start an external viewer for the document. By + default, Recoll lets the desktop choose the appropriate application for + most document types (there is a short list of exceptions, see further). If + you prefer to completely customize the choice of applications, you can + uncheck the Use desktop preferences option in the GUI preferences dialog, + and click the Choose editor applications button to adjust the predefined + Recoll choices. The tool accepts multiple selections of MIME types (e.g. + to set up the editor for the dozens of office file types). + + Even when Use desktop preferences is checked, there is a small list of + exceptions, for MIME types where the Recoll choice should override the + desktop one. These are applications which are well integrated with Recoll, + especially evince for viewing PDF and Postscript files because of its + support for opening the document at a specific page and passing a search + string as an argument. Of course, you can edit the list (in the GUI + preferences) if you would prefer to lose the functionality and use the + standard desktop tool. + + You may also change the choice of applications by editing the mimeview + configuration file if you find this more convenient. + + Each result entry also has a right-click menu with an Open With entry. + This lets you choose an application from the list of those which + registered with the desktop for the document MIME type. + + The Preview and Open edit links may not be present for all entries, + meaning that Recoll has no configured way to preview a given file type + (which was indexed by name only), or no configured external editor for the + file type. This can sometimes be adjusted simply by tweaking the mimemap + and mimeview configuration files (the latter can be modified with the user + preferences dialog). + + The format of the result list entries is entirely configurable by using + the preference dialog to edit an HTML fragment. + + You can click on the Query details link at the top of the results page to + see the query actually performed, after stem expansion and other + processing. + + Double-clicking on any word inside the result list or a preview window + will insert it into the simple search text. + + The result list is divided into pages (the size of which you can change in + the preferences). Use the arrow buttons in the toolbar or the links at the + bottom of the page to browse the results. + + 3.1.2.1. No results: the spelling suggestions + + When a search yields no result, and if the aspell dictionary is + configured, Recoll will try to check for misspellings among the query + terms, and will propose lists of replacements. Clicking on one of the + suggestions will replace the word and restart the search. You can hold any + of the modifier keys (Ctrl, Shift, etc.) while clicking if you would + rather stay on the suggestion screen because several terms need + replacement. + + 3.1.2.2. The result list right-click menu + + Apart from the preview and edit links, you can display a pop-up menu by + right-clicking over a paragraph in the result list. This menu has the + following entries: + + o Preview + + o Open + + o Open With + + o Run Script + + o Copy File Name + + o Copy Url + + o Save to File + + o Find similar + + o Preview Parent document + + o Open Parent document + + o Open Snippets Window + + The Preview and Open entries do the same thing as the corresponding links. + + Open With lets you open the document with one of the applications claiming + to be able to handle its MIME type (the information comes from the + .desktop files in /usr/share/applications). + + Run Script allows starting an arbitrary command on the result file. It + will only appear for results which are top-level files. See further for a + more detailed description. + + The Copy File Name and Copy Url copy the relevant data to the clipboard, + for later pasting. + + Save to File allows saving the contents of a result document to a chosen + file. This entry will only appear if the document does not correspond to + an existing file, but is a subdocument inside such a file (ie: an email + attachment). It is especially useful to extract attachments with no + associated editor. + + The Open/Preview Parent document entries allow working with the higher + level document (e.g. the email message an attachment comes from). Recoll + is sometimes not totally accurate as to what it can or can't do in this + area. For example the Parent entry will also appear for an email which is + part of an mbox folder file, but you can't actually visualize the mbox + (there will be an error dialog if you try). + + If the document is a top-level file, Open Parent will start the default + file manager on the enclosing filesystem directory. + + The Find similar entry will select a number of relevant term from the + current document and enter them into the simple search field. You can then + start a simple search, with a good chance of finding documents related to + the current result. I can't remember a single instance where this function + was actually useful to me... + + The Open Snippets Window entry will only appear for documents which + support page breaks (typically PDF, Postscript, DVI). The snippets window + lists extracts from the document, taken around search terms occurrences, + along with the corresponding page number, as links which can be used to + start the native viewer on the appropriate page. If the viewer supports + it, its search function will also be primed with one of the search terms. + + 3.1.3. The result table + + In Recoll 1.15 and newer, the results can be displayed in spreadsheet-like + fashion. You can switch to this presentation by clicking the table-like + icon in the toolbar (this is a toggle, click again to restore the list). + + Clicking on the column headers will allow sorting by the values in the + column. You can click again to invert the order, and use the header + right-click menu to reset sorting to the default relevance order (you can + also use the sort-by-date arrows to do this). + + Both the list and the table display the same underlying results. The sort + order set from the table is still active if you switch back to the list + mode. You can click twice on a date sort arrow to reset it from there. + + The header right-click menu allows adding or deleting columns. The columns + can be resized, and their order can be changed (by dragging). All the + changes are recorded when you quit recoll + + Hovering over a table row will update the detail area at the bottom of the + window with the corresponding values. You can click the row to freeze the + display. The bottom area is equivalent to a result list paragraph, with + links for starting a preview or a native application, and an equivalent + right-click menu. Typing Esc (the Escape key) will unfreeze the display. + + 3.1.4. Running arbitrary commands on result files (1.20 and later) + + Apart from the Open and Open With operations, which allow starting an + application on a result document (or a temporary copy), based on its MIME + type, it is also possible to run arbitrary commands on results which are + top-level files, using the Run Script entry in the results pop-up menu. + + The commands which will appear in the Run Script submenu must be defined + by .desktop files inside the scripts subdirectory of the current + configuration directory. + + Here follows an example of a .desktop file, which could be named for + example, ~/.recoll/scripts/myscript.desktop (the exact file name inside + the directory is irrelevant): + + [Desktop Entry] + Type=Application + Name=MyFirstScript + Exec=/home/me/bin/tryscript %F + MimeType=*/* + + + The Name attribute defines the label which will appear inside the Run + Script menu. The Exec attribute defines the program to be run, which does + not need to actually be a script, of course. The MimeType attribute is not + used, but needs to exist. + + The commands defined this way can also be used from links inside the + result paragraph. + + As an example, it might make sense to write a script which would move the + document to the trash and purge it from the Recoll index. + + 3.1.5. Displaying thumbnails + + The default format for the result list entries and the detail area of the + result table display an icon for each result document. The icon is either + a generic one determined from the MIME type, or a thumbnail of the + document appearance. Thumbnails are only displayed if found in the + standard freedesktop location, where they would typically have been + created by a file manager. + + Recoll has no capability to create thumbnails. A relatively simple trick + is to use the Open parent document/folder entry in the result list popup + menu. This should open a file manager window on the containing directory, + which should in turn create the thumbnails (depending on your settings). + Restarting the search should then display the thumbnails. + + There are also some pointers about thumbnail generation on the Recoll + wiki. + + 3.1.6. The preview window + + The preview window opens when you first click a Preview link inside the + result list. + + Subsequent preview requests for a given search open new tabs in the + existing window (except if you hold the Shift key while clicking which + will open a new window for side by side viewing). + + Starting another search and requesting a preview will create a new preview + window. The old one stays open until you close it. + + You can close a preview tab by typing Ctrl-W (Ctrl + W) in the window. + Closing the last tab for a window will also close the window. + + Of course you can also close a preview window by using the window manager + button in the top of the frame. + + You can display successive or previous documents from the result list + inside a preview tab by typing Shift+Down or Shift+Up (Down and Up are the + arrow keys). + + A right-click menu in the text area allows switching between displaying + the main text or the contents of fields associated to the document (ie: + author, abtract, etc.). This is especially useful in cases where the term + match did not occur in the main text but in one of the fields. In the case + of images, you can switch between three displays: the image itself, the + image metadata as extracted by exiftool and the fields, which is the + metadata stored in the index. + + You can print the current preview window contents by typing Ctrl-P (Ctrl + + P) in the window text. + + 3.1.6.1. Searching inside the preview + + The preview window has an internal search capability, mostly controlled by + the panel at the bottom of the window, which works in two modes: as a + classical editor incremental search, where we look for the text entered in + the entry zone, or as a way to walk the matches between the document and + the Recoll query that found it. + + Incremental text search + + The preview tabs have an internal incremental search function. You + initiate the search either by typing a / (slash) or CTL-F inside + the text area or by clicking into the Search for: text field and + entering the search string. You can then use the Next and Previous + buttons to find the next/previous occurrence. You can also type F3 + inside the text area to get to the next occurrence. + + If you have a search string entered and you use Ctrl-Up/Ctrl-Down + to browse the results, the search is initiated for each successive + document. If the string is found, the cursor will be positioned at + the first occurrence of the search string. + + Walking the match lists + + If the entry area is empty when you click the Next or Previous + buttons, the editor will be scrolled to show the next match to any + search term (the next highlighted zone). If you select a search + group from the dropdown list and click Next or Previous, the match + list for this group will be walked. This is not the same as a text + search, because the occurences will include non-exact matches (as + caused by stemming or wildcards). The search will revert to the + text mode as soon as you edit the entry area. + + 3.1.7. The Query Fragments window + + Selecting the Tools -> Query Fragments menu entry will open a window with + radio- and check-buttons which can be used to activate query language + fragments for filtering the current query. This can be useful if you have + frequent reusable selectors, for example, filtering on alternate + directories, or searching just one category of files, not covered by the + standard category selectors. + + The contents of the window are entirely customizable, and defined by the + contents of the fragbuts.xml file inside the configuration directory. The + sample file distributed with Recoll (which you should be able to find + under /usr/share/recoll/examples/fragbuts.xml), contains an example which + filters the results from the WEB history. + + Here follows an example: + + + + + + + + + + + + + + + -rclbes:BGL + + + + + rclbes:BGL + + + + + + + + + date:2010-01-01/2010-12-31 + + + + + dir:/my/great/directory + + + + + + Each radiobuttons or buttons section defines a line of checkbuttons or + radiobuttons inside the window. Any number of buttons can be selected, but + the radiobuttons in a line are exclusive. + + Each fragbut section defines the label for a button, and the Query + Language fragment which will be added (as an AND filter) before performing + the query if the button is active. + + This feature is new in Recoll 1.20, and will probably be refined depending + on user feedback. + + 3.1.8. Complex/advanced search + + The advanced search dialog helps you build more complex queries without + memorizing the search language constructs. It can be opened through the + Tools menu or through the main toolbar. + + Recoll keeps a history of searches. See Advanced search history. + + The dialog has two tabs: + + 1. The first tab lets you specify terms to search for, and permits + specifying multiple clauses which are combined to build the search. + + 2. The second tab lets filter the results according to file size, date of + modification, MIME type, or location. + + Click on the Start Search button in the advanced search dialog, or type + Enter in any text field to start the search. The button in the main window + always performs a simple search. + + Click on the Show query details link at the top of the result page to see + the query expansion. + + 3.1.8.1. Avanced search: the "find" tab + + This part of the dialog lets you constructc a query by combining multiple + clauses of different types. Each entry field is configurable for the + following modes: + + o All terms. + + o Any term. + + o None of the terms. + + o Phrase (exact terms in order within an adjustable window). + + o Proximity (terms in any order within an adjustable window). + + o Filename search. + + Additional entry fields can be created by clicking the Add clause button. + + When searching, the non-empty clauses will be combined either with an AND + or an OR conjunction, depending on the choice made on the left (All + clauses or Any clause). + + Entries of all types except "Phrase" and "Near" accept a mix of single + words and phrases enclosed in double quotes. Stemming and wildcard + expansion will be performed as for simple search. + + Phrases and Proximity searches. These two clauses work in similar ways, + with the difference that proximity searches do not impose an order on the + words. In both cases, an adjustable number (slack) of non-matched words + may be accepted between the searched ones (use the counter on the left to + adjust this count). For phrases, the default count is zero (exact match). + For proximity it is ten (meaning that two search terms, would be matched + if found within a window of twelve words). Examples: a phrase search for + quick fox with a slack of 0 will match quick fox but not quick brown fox. + With a slack of 1 it will match the latter, but not fox quick. A proximity + search for quick fox with the default slack will match the latter, and + also a fox is a cunning and quick animal. + + 3.1.8.2. Avanced search: the "filter" tab + + This part of the dialog has several sections which allow filtering the + results of a search according to a number of criteria + + o The first section allows filtering by dates of last modification. You + can specify both a minimum and a maximum date. The initial values are + set according to the oldest and newest documents found in the index. + + o The next section allows filtering the results by file size. There are + two entries for minimum and maximum size. Enter decimal numbers. You + can use suffix multipliers: k/K, m/M, g/G, t/T for 1E3, 1E6, 1E9, 1E12 + respectively. + + o The next section allows filtering the results by their MIME types, or + MIME categories (ie: media/text/message/etc.). + + You can transfer the types between two boxes, to define which will be + included or excluded by the search. + + The state of the file type selection can be saved as the default (the + file type filter will not be activated at program start-up, but the + lists will be in the restored state). + + o The bottom section allows restricting the search results to a sub-tree + of the indexed area. You can use the Invert checkbox to search for + files not in the sub-tree instead. If you use directory filtering + often and on big subsets of the file system, you may think of setting + up multiple indexes instead, as the performance may be better. + + You can use relative/partial paths for filtering. Ie, entering + dirA/dirB would match either /dir1/dirA/dirB/myfile1 or + /dir2/dirA/dirB/someother/myfile2. + + 3.1.8.3. Avanced search history + + The advanced search tool memorizes the last 100 searches performed. You + can walk the saved searches by using the up and down arrow keys while the + keyboard focus belongs to the advanced search dialog. + + The complex search history can be erased, along with the one for simple + search, by selecting the File -> Erase Search History menu entry. + + 3.1.9. The term explorer tool + + Recoll automatically manages the expansion of search terms to their + derivatives (ie: plural/singular, verb inflections). But there are other + cases where the exact search term is not known. For example, you may not + remember the exact spelling, or only know the beginning of the name. + + The search will only propose replacement terms with spelling variations + when no matching document were found. In some cases, both proper spellings + and mispellings are present in the index, and it may be interesting to + look for them explicitely. + + The term explorer tool (started from the toolbar icon or from the Term + explorer entry of the Tools menu) can be used to search the full index + terms list. It has three modes of operations: + + Wildcard + + In this mode of operation, you can enter a search string with + shell-like wildcards (*, ?, []). ie: xapi* would display all index + terms beginning with xapi. (More about wildcards here). + + Regular expression + + This mode will accept a regular expression as input. Example: + word[0-9]+. The expression is implicitely anchored at the + beginning. Ie: press will match pression but not expression. You + can use .*press to match the latter, but be aware that this will + cause a full index term list scan, which can be quite long. + + Stem expansion + + This mode will perform the usual stem expansion normally done as + part user input processing. As such it is probably mostly useful + to demonstrate the process. + + Spelling/Phonetic + + In this mode, you enter the term as you think it is spelled, and + Recoll will do its best to find index terms that sound like your + entry. This mode uses the Aspell spelling application, which must + be installed on your system for things to work (if your documents + contain non-ascii characters, Recoll needs an aspell version newer + than 0.60 for UTF-8 support). The language which is used to build + the dictionary out of the index terms (which is done at the end of + an indexing pass) is the one defined by your NLS environment. + Weird things will probably happen if languages are mixed up. + + Note that in cases where Recoll does not know the beginning of the string + to search for (ie a wildcard expression like *coll), the expansion can + take quite a long time because the full index term list will have to be + processed. The expansion is currently limited at 10000 results for + wildcards and regular expressions. It is possible to change the limit in + the configuration file. + + Double-clicking on a term in the result list will insert it into the + simple search entry field. You can also cut/paste between the result list + and any entry field (the end of lines will be taken care of). + + 3.1.10. Multiple indexes + + See the section describing the use of multiple indexes for generalities. + Only the aspects concerning the recoll GUI are described here. + + A recoll program instance is always associated with a specific index, + which is the one to be updated when requested from the File menu, but it + can use any number of Recoll indexes for searching. The external indexes + can be selected through the external indexes tab in the preferences + dialog. + + Index selection is performed in two phases. A set of all usable indexes + must first be defined, and then the subset of indexes to be used for + searching. These parameters are retained across program executions (there + are kept separately for each Recoll configuration). The set of all indexes + is usually quite stable, while the active ones might typically be adjusted + quite frequently. + + The main index (defined by RECOLL_CONFDIR) is always active. If this is + undesirable, you can set up your base configuration to index an empty + directory. + + When adding a new index to the set, you can select either a Recoll + configuration directory, or directly a Xapian index directory. In the + first case, the Xapian index directory will be obtained from the selected + configuration. + + As building the set of all indexes can be a little tedious when done + through the user interface, you can use the RECOLL_EXTRA_DBS environment + variable to provide an initial set. This might typically be set up by a + system administrator so that every user does not have to do it. The + variable should define a colon-separated list of index directories, ie: + + export RECOLL_EXTRA_DBS=/some/place/xapiandb:/some/other/db + + Another environment variable, RECOLL_ACTIVE_EXTRA_DBS allows adding to the + active list of indexes. This variable was suggested and implemented by a + Recoll user. It is mostly useful if you use scripts to mount external + volumes with Recoll indexes. By using RECOLL_EXTRA_DBS and + RECOLL_ACTIVE_EXTRA_DBS, you can add and activate the index for the + mounted volume when starting recoll. + + RECOLL_ACTIVE_EXTRA_DBS is available for Recoll versions 1.17.2 and later. + A change was made in the same update so that recoll will automatically + deactivate unreachable indexes when starting up. + + 3.1.11. Document history + + Documents that you actually view (with the internal preview or an external + tool) are entered into the document history, which is remembered. + + You can display the history list by using the Tools/Doc History menu + entry. + + You can erase the document history by using the Erase document history + entry in the File menu. + + 3.1.12. Sorting search results and collapsing duplicates + + The documents in a result list are normally sorted in order of relevance. + It is possible to specify a different sort order, either by using the + vertical arrows in the GUI toolbox to sort by date, or switching to the + result table display and clicking on any header. The sort order chosen + inside the result table remains active if you switch back to the result + list, until you click one of the vertical arrows, until both are unchecked + (you are back to sort by relevance). + + Sort parameters are remembered between program invocations, but result + sorting is normally always inactive when the program starts. It is + possible to keep the sorting activation state between program invocations + by checking the Remember sort activation state option in the preferences. + + It is also possible to hide duplicate entries inside the result list + (documents with the exact same contents as the displayed one). The test of + identity is based on an MD5 hash of the document container, not only of + the text contents (so that ie, a text document with an image added will + not be a duplicate of the text only). Duplicates hiding is controlled by + an entry in the GUI configuration dialog, and is off by default. + + As of release 1.19, when a result document does have undisplayed + duplicates, a Dups link will be shown with the result list entry. Clicking + the link will display the paths (URLs + ipaths) for the duplicate entries. + + 3.1.13. Search tips, shortcuts + + 3.1.13.1. Terms and search expansion + + Term completion. Typing Esc Space in the simple search entry field while + entering a word will either complete the current word if its beginning + matches a unique term in the index, or open a window to propose a list of + completions. + + Picking up new terms from result or preview text. Double-clicking on a + word in the result list or in a preview window will copy it to the simple + search entry field. + + Wildcards. Wildcards can be used inside search terms in all forms of + searches. More about wildcards. + + Automatic suffixes. Words like odt or ods can be automatically turned into + query language ext:xxx clauses. This can be enabled in the Search + preferences panel in the GUI. + + Disabling stem expansion. Entering a capitalized word in any search field + will prevent stem expansion (no search for gardening if you enter Garden + instead of garden). This is the only case where character case should make + a difference for a Recoll search. You can also disable stem expansion or + change the stemming language in the preferences. + + Finding related documents. Selecting the Find similar documents entry in + the result list paragraph right-click menu will select a set of + "interesting" terms from the current result, and insert them into the + simple search entry field. You can then possibly edit the list and start a + search to find documents which may be apparented to the current result. + + File names. File names are added as terms during indexing, and you can + specify them as ordinary terms in normal search fields (Recoll used to + index all directories in the file path as terms. This has been abandoned + as it did not seem really useful). Alternatively, you can use the specific + file name search which will only look for file names, and may be faster + than the generic search especially when using wildcards. + + 3.1.13.2. Working with phrases and proximity + + Phrases and Proximity searches. A phrase can be looked for by enclosing it + in double quotes. Example: "user manual" will look only for occurrences of + user immediately followed by manual. You can use the This phrase field of + the advanced search dialog to the same effect. Phrases can be entered + along simple terms in all simple or advanced search entry fields (except + This exact phrase). + + AutoPhrases. This option can be set in the preferences dialog. If it is + set, a phrase will be automatically built and added to simple searches + when looking for Any terms. This will not change radically the results, + but will give a relevance boost to the results where the search terms + appear as a phrase. Ie: searching for virtual reality will still find all + documents where either virtual or reality or both appear, but those which + contain virtual reality should appear sooner in the list. + + Phrase searches can strongly slow down a query if most of the terms in the + phrase are common. This is why the autophrase option is off by default for + Recoll versions before 1.17. As of version 1.17, autophrase is on by + default, but very common terms will be removed from the constructed + phrase. The removal threshold can be adjusted from the search preferences. + + Phrases and abbreviations. As of Recoll version 1.17, dotted abbreviations + like I.B.M. are also automatically indexed as a word without the dots: + IBM. Searching for the word inside a phrase (ie: "the IBM company") will + only match the dotted abrreviation if you increase the phrase slack (using + the advanced search panel control, or the o query language modifier). + Literal occurences of the word will be matched normally. + + 3.1.13.3. Others + + Using fields. You can use the query language and field specifications to + only search certain parts of documents. This can be especially helpful + with email, for example only searching emails from a specific originator: + search tips from:helpfulgui + + Ajusting the result table columns. When displaying results in table mode, + you can use a right click on the table headers to activate a pop-up menu + which will let you adjust what columns are displayed. You can drag the + column headers to adjust their order. You can click them to sort by the + field displayed in the column. You can also save the result list in CSV + format. + + Changing the GUI geometry. It is possible to configure the GUI in wide + form factor by dragging the toolbars to one of the sides (their location + is remembered between sessions), and moving the category filters to a menu + (can be set in the Preferences -> GUI configuration -> User interface + panel). + + Query explanation. You can get an exact description of what the query + looked for, including stem expansion, and Boolean operators used, by + clicking on the result list header. + + Advanced search history. As of Recoll 1.18, you can display any of the + last 100 complex searches performed by using the up and down arrow keys + while the advanced search panel is active. + + Browsing the result list inside a preview window. Entering Shift-Down or + Shift-Up (Shift + an arrow key) in a preview window will display the next + or the previous document from the result list. Any secondary search + currently active will be executed on the new document. + + Scrolling the result list from the keyboard. You can use PageUp and + PageDown to scroll the result list, Shift+Home to go back to the first + page. These work even while the focus is in the search entry. + + Result table: moving the focus to the table. You can use Ctrl-r to move + the focus from the search entry to the table, and then use the arrow keys + to change the current row. Ctrl-Shift-s returns to the search. + + Result table: open / preview. With the focus in the result table, you can + use Ctrl-o to open the document from the current row, Ctrl-Shift-o to open + the document and close recoll, Ctrl-d to preview the document. + + Editing a new search while the focus is not in the search entry. You can + use the Ctrl-Shift-S shortcut to return the cursor to the search entry + (and select the current search text), while the focus is anywhere in the + main window. + + Forced opening of a preview window. You can use Shift+Click on a result + list Preview link to force the creation of a preview window instead of a + new tab in the existing one. + + Closing previews. Entering Ctrl-W in a tab will close it (and, for the + last tab, close the preview window). Entering Esc will close the preview + window and all its tabs. + + Printing previews. Entering Ctrl-P in a preview window will print the + currently displayed text. + + Quitting. Entering Ctrl-Q almost anywhere will close the application. + + 3.1.14. Saving and restoring queries (1.21 and later) + + Both simple and advanced query dialogs save recent history, but the amount + is limited: old queries will eventually be forgotten. Also, important + queries may be difficult to find among others. This is why both types of + queries can also be explicitely saved to files, from the GUI menus: File + -> Save last query / Load last query + + The default location for saved queries is a subdirectory of the current + configuration directory, but saved queries are ordinary files and can be + written or moved anywhere. + + Some of the saved query parameters are part of the preferences (e.g. + autophrase or the active external indexes), and may differ when the query + is loaded from the time it was saved. In this case, Recoll will warn of + the differences, but will not change the user preferences. + + 3.1.15. Customizing the search interface + + You can customize some aspects of the search interface by using the GUI + configuration entry in the Preferences menu. + + There are several tabs in the dialog, dealing with the interface itself, + the parameters used for searching and returning results, and what indexes + are searched. + + User interface parameters: + + o Highlight color for query terms: Terms from the user query are + highlighted in the result list samples and the preview window. The + color can be chosen here. Any Qt color string should work (ie red, + #ff0000). The default is blue. + + o Style sheet: The name of a Qt style sheet text file which is applied + to the whole Recoll application on startup. The default value is + empty, but there is a skeleton style sheet (recoll.qss) inside the + /usr/share/recoll/examples directory. Using a style sheet, you can + change most recoll graphical parameters: colors, fonts, etc. See the + sample file for a few simple examples. + + You should be aware that parameters (e.g.: the background color) set + inside the Recoll GUI style sheet will override global system + preferences, with possible strange side effects: for example if you + set the foreground to a light color and the background to a dark one + in the desktop preferences, but only the background is set inside the + Recoll style sheet, and it is light too, then text will appear + light-on-light inside the Recoll GUI. + + o Maximum text size highlighted for preview Inserting highlights on + search term inside the text before inserting it in the preview window + involves quite a lot of processing, and can be disabled over the given + text size to speed up loading. + + o Prefer HTML to plain text for preview if set, Recoll will display HTML + as such inside the preview window. If this causes problems with the Qt + HTML display, you can uncheck it to display the plain text version + instead. + + o Plain text to HTML line style: when displaying plain text inside the + preview window, Recoll tries to preserve some of the original text + line breaks and indentation. It can either use PRE HTML tags, which + will well preserve the indentation but will force horizontal scrolling + for long lines, or use BR tags to break at the original line breaks, + which will let the editor introduce other line breaks according to the + window width, but will lose some of the original indentation. The + third option has been available in recent releases and is probably now + the best one: use PRE tags with line wrapping. + + o Choose editor applicationsr: this opens a dialog which allows you to + select the application to be used to open each MIME type. The default + is nornally to use the xdg-open utility, but you can override it. + + o Exceptions: even wen xdg-open is used by default for opening + documents, you can set exceptions for MIME types that will still be + opened according to Recoll preferences. This is useful for passing + parameters like page numbers or search strings to applications that + support them (e.g. evince). This cannot be done with xdg-open which + only supports passing one parameter. + + o Document filter choice style: this will let you choose if the document + categories are displayed as a list or a set of buttons, or a menu. + + o Start with simple search mode: this lets you choose the value of the + simple search type on program startup. Either a fixed value (e.g. + Query Language, or the value in use when the program last exited. + + o Auto-start simple search on white space entry: if this is checked, a + search will be executed each time you enter a space in the simple + search input field. This lets you look at the result list as you enter + new terms. This is off by default, you may like it or not... + + o Start with advanced search dialog open : If you use this dialog + frequently, checking the entries will get it to open when recoll + starts. + + o Remember sort activation state if set, Recoll will remember the sort + tool stat between invocations. It normally starts with sorting + disabled. + + Result list parameters: + + o Number of results in a result page + + o Result list font: There is quite a lot of information shown in the + result list, and you may want to customize the font and/or font size. + The rest of the fonts used by Recoll are determined by your generic Qt + config (try the qtconfig command). + + o Edit result list paragraph format string: allows you to change the + presentation of each result list entry. See the result list + customisation section. + + o Edit result page HTML header insert: allows you to define text + inserted at the end of the result page HTML header. More detail in the + result list customisation section. + + o Date format: allows specifying the format used for displaying dates + inside the result list. This should be specified as an strftime() + string (man strftime). + + o Abstract snippet separator: for synthetic abstracts built from index + data, which are usually made of several snippets from different parts + of the document, this defines the snippet separator, an ellipsis by + default. + + Search parameters: + + o Hide duplicate results: decides if result list entries are shown for + identical documents found in different places. + + o Stemming language: stemming obviously depends on the document's + language. This listbox will let you chose among the stemming databases + which were built during indexing (this is set in the main + configuration file), or later added with recollindex -s (See the + recollindex manual). Stemming languages which are dynamically added + will be deleted at the next indexing pass unless they are also added + in the configuration file. + + o Automatically add phrase to simple searches: a phrase will be + automatically built and added to simple searches when looking for Any + terms. This will give a relevance boost to the results where the + search terms appear as a phrase (consecutive and in order). + + o Autophrase term frequency threshold percentage: very frequent terms + should not be included in automatic phrase searches for performance + reasons. The parameter defines the cutoff percentage (percentage of + the documents where the term appears). + + o Replace abstracts from documents: this decides if we should synthesize + and display an abstract in place of an explicit abstract found within + the document itself. + + o Dynamically build abstracts: this decides if Recoll tries to build + document abstracts (lists of snippets) when displaying the result + list. Abstracts are constructed by taking context from the document + information, around the search terms. + + o Synthetic abstract size: adjust to taste... + + o Synthetic abstract context words: how many words should be displayed + around each term occurrence. + + o Query language magic file name suffixes: a list of words which + automatically get turned into ext:xxx file name suffix clauses when + starting a query language query (ie: doc xls xlsx...). This will save + some typing for people who use file types a lot when querying. + + External indexes: This panel will let you browse for additional indexes + that you may want to search. External indexes are designated by their + database directory (ie: /home/someothergui/.recoll/xapiandb, + /usr/local/recollglobal/xapiandb). + + Once entered, the indexes will appear in the External indexes list, and + you can chose which ones you want to use at any moment by checking or + unchecking their entries. + + Your main database (the one the current configuration indexes to), is + always implicitly active. If this is not desirable, you can set up your + configuration so that it indexes, for example, an empty directory. An + alternative indexer may also need to implement a way of purging the index + from stale data, + + 3.1.15.1. The result list format + + Newer versions of Recoll (from 1.17) normally use WebKit HTML widgets for + the result list and the snippets window (this may be disabled at build + time). Total customisation is possible with full support for CSS and + Javascript. Conversely, there are limits to what you can do with the older + Qt QTextBrowser, but still, it is possible to decide what data each result + will contain, and how it will be displayed. + + The result list presentation can be exhaustively customized by adjusting + two elements: + + o The paragraph format + + o HTML code inside the header section. For versions 1.21 and later, this + is also used for the snippets window + + The paragraph format and the header fragment can be edited from the Result + list tab of the GUI configuration. + + The header fragment is used both for the result list and the snippets + window. The snippets list is a table and has a snippets class attribute. + Each paragraph in the result list is a table, with class respar, but this + can be changed by editing the paragraph format. + + There are a few examples on the page about customising the result list on + the Recoll web site. + + The paragraph format + + This is an arbitrary HTML string where the following printf-like % + substitutions will be performed: + + o %A. Abstract + + o %D. Date + + o %I. Icon image name. This is normally determined from the MIME type. + The associations are defined inside the mimeconf configuration file. + If a thumbnail for the file is found at the standard Freedesktop + location, this will be displayed instead. + + o %K. Keywords (if any) + + o %L. Precooked Preview, Edit, and possibly Snippets links + + o %M. MIME type + + o %N. result Number inside the result page + + o %P. Parent folder Url. In the case of an embedded document, this is + the parent folder for the top level container file. + + o %R. Relevance percentage + + o %S. Size information + + o %T. Title or Filename if not set. + + o %t. Title or Filename if not set. + + o %U. Url + + The format of the Preview, Edit, and Snippets links is , and where docnum (%N) expands to the document + number inside the result page). + + A link target defined as "F%N" will open the document corresponding to the + %P parent folder expansion, usually creating a file manager window on the + folder where the container file resides. E.g.: + + %P + + A link target defined as R%N|scriptname will run the corresponding script + on the result file (if the document is embedded, the script will be + started on the top-level parent). See the section about defining scripts. + + In addition to the predefined values above, all strings like %(fieldname) + will be replaced by the value of the field named fieldname for this + document. Only stored fields can be accessed in this way, the value of + indexed but not stored fields is not known at this point in the search + process (see field configuration). There are currently very few fields + stored by default, apart from the values above (only author and filename), + so this feature will need some custom local configuration to be useful. An + example candidate would be the recipient field which is generated by the + message input handlers. + + The default value for the paragraph format string is: + + "\n" + "\n" + "\n" + "\n" + "
%L  %S   %T
\n" + "%M %D    %U %i
\n" + "%A %K
\n" + + You may, for example, try the following for a more web-like experience: + + %T
+ %A%U - %S - %L + + Note that the P%N link in the above paragraph makes the title a preview + link. Or the clean looking: + + %L %R +   %T&
%S  + %U + + +
%A
%K + + These samples, and some others are on the web site, with pictures to show + how they look. + + It is also possible to define the value of the snippet separator inside + the abstract section. + +3.2. Searching with the KDE KIO slave + + 3.2.1. What's this + + The Recoll KIO slave allows performing a Recoll search by entering an + appropriate URL in a KDE open dialog, or with an HTML-based interface + displayed in Konqueror. + + The HTML-based interface is similar to the Qt-based interface, but + slightly less powerful for now. Its advantage is that you can perform your + search while staying fully within the KDE framework: drag and drop from + the result list works normally and you have your normal choice of + applications for opening files. + + The alternative interface uses a directory view of search results. Due to + limitations in the current KIO slave interface, it is currently not + obviously useful (to me). + + The interface is described in more detail inside a help file which you can + access by entering recoll:/ inside the konqueror URL line (this works only + if the recoll KIO slave has been previously installed). + + The instructions for building this module are located in the source tree. + See: kde/kio/recoll/00README.txt. Some Linux distributions do package the + kio-recoll module, so check before diving into the build process, maybe + it's already out there ready for one-click installation. + + 3.2.2. Searchable documents + + As a sample application, the Recoll KIO slave could allow preparing a set + of HTML documents (for example a manual) so that they become their own + search interface inside konqueror. + + This can be done by either explicitly inserting + links around some document areas, or automatically by adding a very small + javascript program to the documents, like the following example, which + would initiate a search by double-clicking any term: + + + .... + + + +3.3. Searching on the command line + + There are several ways to obtain search results as a text stream, without + a graphical interface: + + o By passing option -t to the recoll program. + + o By using the recollq program. + + o By writing a custom Python program, using the Recoll Python API. + + The first two methods work in the same way and accept/need the same + arguments (except for the additional -t to recoll). The query to be + executed is specified as command line arguments. + + recollq is not built by default. You can use the Makefile in the query + directory to build it. This is a very simple program, and if you can + program a little c++, you may find it useful to taylor its output format + to your needs. Not that recollq is only really useful on systems where the + Qt libraries (or even the X11 ones) are not available. Otherwise, just use + recoll -t, which takes the exact same parameters and options which are + described for recollq + + recollq has a man page (not installed by default, look in the doc/man + directory). The Usage string is as follows: + + recollq: usage: + -P: Show the date span for all the documents present in the index + [-o|-a|-f] [-q] + Runs a recoll query and displays result lines. + Default: will interpret the argument(s) as a xesam query string + query may be like: + implicit AND, Exclusion, field spec: t1 -t2 title:t3 + OR has priority: t1 OR t2 t3 OR t4 means (t1 OR t2) AND (t3 OR t4) + Phrase: "t1 t2" (needs additional quoting on cmd line) + -o Emulate the GUI simple search in ANY TERM mode + -a Emulate the GUI simple search in ALL TERMS mode + -f Emulate the GUI simple search in filename mode + -q is just ignored (compatibility with the recoll GUI command line) + Common options: + -c : specify config directory, overriding $RECOLL_CONFDIR + -d also dump file contents + -n [first-] define the result slice. The default value for [first] + is 0. Without the option, the default max count is 2000. + Use n=0 for no limit + -b : basic. Just output urls, no mime types or titles + -Q : no result lines, just the processed query and result count + -m : dump the whole document meta[] array for each result + -A : output the document abstracts + -S fld : sort by field + -s stemlang : set stemming language to use (must exist in index...) + Use -s "" to turn off stem expansion + -D : sort descending + -i : additional index, several can be given + -e use url encoding (%xx) for urls + -F : output exactly these fields for each result. + The field values are encoded in base64, output in one line and + separated by one space character. This is the recommended format + for use by other programs. Use a normal query with option -m to + see the field names. + + Sample execution: + + recollq 'ilur -nautique mime:text/html' + Recoll query: ((((ilur:(wqf=11) OR ilurs) AND_NOT (nautique:(wqf=11) + OR nautiques OR nautiqu OR nautiquement)) FILTER Ttext/html)) + 4 results + text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/comptes.html] [comptes.html] 18593 bytes + text/html [file:///Users/uncrypted-dockes/projets/nautique/webnautique/articles/ilur1/index.html] [Constructio... + text/html [file:///Users/uncrypted-dockes/projets/pagepers/index.html] [psxtcl/writemime/recoll]... + text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/recu-chasse-maree.... + +3.4. Path translations + + In some cases, the document paths stored inside the index do not match the + actual ones, so that document previews and accesses will fail. This can + occur in a number of circumstances: + + o When using multiple indexes it is a relatively common occurrence that + some will actually reside on a remote volume, for exemple mounted via + NFS. In this case, the paths used to access the documents on the local + machine are not necessarily the same than the ones used while indexing + on the remote machine. For example, /home/me may have been used as a + topdirs elements while indexing, but the directory might be mounted as + /net/server/home/me on the local machine. + + o The case may also occur with removable disks. It is perfectly possible + to configure an index to live with the documents on the removable + disk, but it may happen that the disk is not mounted at the same place + so that the documents paths from the index are invalid. + + o As a last exemple, one could imagine that a big directory has been + moved, but that it is currently inconvenient to run the indexer. + + More generally, the path translation facility may be useful whenever the + documents paths seen by the indexer are not the same as the ones which + should be used at query time. + + Recoll has a facility for rewriting access paths when extracting the data + from the index. The translations can be defined for the main index and for + any additional query index. + + In the above NFS example, Recoll could be instructed to rewrite any + file:///home/me URL from the index to file:///net/server/home/me, allowing + accesses from the client. + + The translations are defined in the ptrans configuration file, which can + be edited by hand or from the GUI external indexes configuration dialog. + +3.5. The query language + + The query language processor is activated in the GUI simple search entry + when the search mode selector is set to Query Language. It can also be + used with the KIO slave or the command line search. It broadly has the + same capabilities as the complex search interface in the GUI. + + The language is based on the (seemingly defunct) Xesam user search + language specification. + + If the results of a query language search puzzle you and you doubt what + has been actually searched for, you can use the GUI Show Query link at the + top of the result list to check the exact query which was finally executed + by Xapian. + + Here follows a sample request that we are going to explain: + + author:"john doe" Beatles OR Lennon Live OR Unplugged -potatoes + + + This would search for all documents with John Doe appearing as a phrase in + the author field (exactly what this is would depend on the document type, + ie: the From: header, for an email message), and containing either beatles + or lennon and either live or unplugged but not potatoes (in any part of + the document). + + An element is composed of an optional field specification, and a value, + separated by a colon (the field separator is the last colon in the + element). Examples: Eugenie, author:balzac, dc:title:grandet + dc:title:"eugenie grandet" + + The colon, if present, means "contains". Xesam defines other relations, + which are mostly unsupported for now (except in special cases, described + further down). + + All elements in the search entry are normally combined with an implicit + AND. It is possible to specify that elements be OR'ed instead, as in + Beatles OR Lennon. The OR must be entered literally (capitals), and it has + priority over the AND associations: word1 word2 OR word3 means word1 AND + (word2 OR word3) not (word1 AND word2) OR word3. Explicit parenthesis are + not supported. + + As of Recoll 1.21, you can use parentheses to group elements, which will + sometimes make things clearer, and may allow expressing combinations which + would have been difficult otherwise. + + An element preceded by a - specifies a term that should not appear. + + As usual, words inside quotes define a phrase (the order of words is + significant), so that title:"prejudice pride" is not the same as + title:prejudice title:pride, and is unlikely to find a result. + + Words inside phrases and capitalized words are not stem-expanded. + Wildcards may be used anywhere inside a term. Specifying a wild-card on + the left of a term can produce a very slow search (or even an incorrect + one if the expansion is truncated because of excessive size). Also see + More about wildcards. + + To save you some typing, recent Recoll versions (1.20 and later) interpret + a comma-separated list of terms as an AND list inside the field. Use slash + characters ('/') for an OR list. No white space is allowed. So + + author:john,lennon + + will search for documents with john and lennon inside the author field (in + any order), and + + author:john/ringo + + would search for john or ringo. + + Modifiers can be set on a double-quote value, for example to specify a + proximity search (unordered). See the modifier section. No space must + separate the final double-quote and the modifiers value, e.g. "two + one"po10 + + Recoll currently manages the following default fields: + + o title, subject or caption are synonyms which specify data to be + searched for in the document title or subject. + + o author or from for searching the documents originators. + + o recipient or to for searching the documents recipients. + + o keyword for searching the document-specified keywords (few documents + actually have any). + + o filename for the document's file name. This is not necessarily set for + all documents: internal documents contained inside a compound one (for + example an EPUB section) do not inherit the container file name any + more, this was replaced by an explicit field (see next). Sub-documents + can still have a specific filename, if it is implied by the document + format, for example the attachment file name for an email attachment. + + o containerfilename. This is set for all documents, both top-level and + contained sub-documents, and is always the name of the filesystem + directory entry which contains the data. The terms from this field can + only be matched by an explicit field specification (as opposed to + terms from filename which are also indexed as general document + content). This avoids getting matches for all the sub-documents when + searching for the container file name. + + o ext specifies the file name extension (Ex: ext:html) + + Recoll 1.20 and later have a way to specify aliases for the field names, + which will save typing, for example by aliasing filename to fn or + containerfilename to cfn. See the section about the fields file + + The field syntax also supports a few field-like, but special, criteria: + + o dir for filtering the results on file location (Ex: + dir:/home/me/somedir). -dir also works to find results not in the + specified directory (release >= 1.15.8). Tilde expansion will be + performed as usual (except for a bug in versions 1.19 to 1.19.11p1). + Wildcards will be expanded, but please have a look at an important + limitation of wildcards in path filters. + + Relative paths also make sense, for example, dir:share/doc would match + either /usr/share/doc or /usr/local/share/doc + + Several dir clauses can be specified, both positive and negative. For + example the following makes sense: + + dir:recoll dir:src -dir:utils -dir:common + + + This would select results which have both recoll and src in the path + (in any order), and which have not either utils or common. + + You can also use OR conjunctions with dir: clauses. + + A special aspect of dir clauses is that the values in the index are + not transcoded to UTF-8, and never lower-cased or unaccented, but + stored as binary. This means that you need to enter the values in the + exact lower or upper case, and that searches for names with diacritics + may sometimes be impossible because of character set conversion + issues. Non-ASCII UNIX file paths are an unending source of trouble + and are best avoided. + + You need to use double-quotes around the path value if it contains + space characters. + + o size for filtering the results on file size. Example: size<10000. You + can use <, > or = as operators. You can specify a range like the + following: size>100 size<1000. The usual k/K, m/M, g/G, t/T can be + used as (decimal) multipliers. Ex: size>1k to search for files bigger + than 1000 bytes. + + o date for searching or filtering on dates. The syntax for the argument + is based on the ISO8601 standard for dates and time intervals. Only + dates are supported, no times. The general syntax is 2 elements + separated by a / character. Each element can be a date or a period of + time. Periods are specified as PnYnMnD. The n numbers are the + respective numbers of years, months or days, any of which may be + missing. Dates are specified as YYYY-MM-DD. The days and months parts + may be missing. If the / is present but an element is missing, the + missing element is interpreted as the lowest or highest date in the + index. Examples: + + o 2001-03-01/2002-05-01 the basic syntax for an interval of dates. + + o 2001-03-01/P1Y2M the same specified with a period. + + o 2001/ from the beginning of 2001 to the latest date in the index. + + o 2001 the whole year of 2001 + + o P2D/ means 2 days ago up to now if there are no documents with + dates in the future. + + o /2003 all documents from 2003 or older. + + Periods can also be specified with small letters (ie: p2y). + + o mime or format for specifying the MIME type. This one is quite special + because you can specify several values which will be OR'ed (the normal + default for the language is AND). Ex: mime:text/plain mime:text/html. + Specifying an explicit boolean operator before a mime specification is + not supported and will produce strange results. You can filter out + certain types by using negation (-mime:some/type), and you can use + wildcards in the value (mime:text/*). Note that mime is the ONLY field + with an OR default. You do need to use OR with ext terms for example. + + o type or rclcat for specifying the category (as in + text/media/presentation/etc.). The classification of MIME types in + categories is defined in the Recoll configuration (mimeconf), and can + be modified or extended. The default category names are those which + permit filtering results in the main GUI screen. Categories are OR'ed + like MIME types above. This can't be negated with - either. + + The document input handlers used while indexing have the possibility to + create other fields with arbitrary names, and aliases may be defined in + the configuration, so that the exact field search possibilities may be + different for you if someone took care of the customisation. + + 3.5.1. Modifiers + + Some characters are recognized as search modifiers when found immediately + after the closing double quote of a phrase, as in "some + term"modifierchars. The actual "phrase" can be a single term of course. + Supported modifiers: + + o l can be used to turn off stemming (mostly makes sense with p because + stemming is off by default for phrases). + + o o can be used to specify a "slack" for phrase and proximity searches: + the number of additional terms that may be found between the specified + ones. If o is followed by an integer number, this is the slack, else + the default is 10. + + o p can be used to turn the default phrase search into a proximity one + (unordered). Example:"order any in"p + + o C will turn on case sensitivity (if the index supports it). + + o D will turn on diacritics sensitivity (if the index supports it). + + o A weight can be specified for a query element by specifying a decimal + value at the start of the modifiers. Example: "Important"2.5. + +3.6. Search case and diacritics sensitivity + + For Recoll versions 1.18 and later, and when working with a raw index (not + the default), searches can be made sensitive to character case and + diacritics. How this happens is controlled by configuration variables and + what search data is entered. + + The general default is that searches are insensitive to case and + diacritics. An entry of resume will match any of Resume, RESUME, resume, + Resume etc. + + Two configuration variables can automate switching on sensitivity: + + autodiacsens + + If this is set, search sensitivity to diacritics will be turned on + as soon as an accented character exists in a search term. When the + variable is set to true, resume will start a + diacritics-unsensitive search, but resume will be matched exactly. + The default value is false. + + autocasesens + + If this is set, search sensitivity to character case will be + turned on as soon as an upper-case character exists in a search + term except for the first one. When the variable is set to true, + us or Us will start a diacritics-unsensitive search, but US will + be matched exactly. The default value is true (contrary to + autodiacsens). + + As in the past, capitalizing the first letter of a word will turn off its + stem expansion and have no effect on case-sensitivity. + + You can also explicitely activate case and diacritics sensitivity by using + modifiers with the query language. C will make the term case-sensitive, + and D will make it diacritics-sensitive. Examples: + + "us"C + + + will search for the term us exactly (Us will not be a match). + + "resume"D + + + will search for the term resume exactly (resume will not be a match). + + When either case or diacritics sensitivity is activated, stem expansion is + turned off. Having both does not make much sense. + +3.7. Anchored searches and wildcards + + Some special characters are interpreted by Recoll in search strings to + expand or specialize the search. Wildcards expand a root term in + controlled ways. Anchor characters can restrict a search to succeed only + if the match is found at or near the beginning of the document or one of + its fields. + + 3.7.1. More about wildcards + + All words entered in Recoll search fields will be processed for wildcard + expansion before the request is finally executed. + + The wildcard characters are: + + o * which matches 0 or more characters. + + o ? which matches a single character. + + o [] which allow defining sets of characters to be matched (ex: [abc] + matches a single character which may be 'a' or 'b' or 'c', [0-9] + matches any number. + + You should be aware of a few things when using wildcards. + + o Using a wildcard character at the beginning of a word can make for a + slow search because Recoll will have to scan the whole index term list + to find the matches. However, this is much less a problem for field + searches, and queries like author:*@domain.com can sometimes be very + useful. + + o For Recoll version 18 only, when working with a raw index (preserving + character case and diacritics), the literal part of a wildcard + expression will be matched exactly for case and diacritics. This is + not true any more for versions 19 and later. + + o Using a * at the end of a word can produce more matches than you would + think, and strange search results. You can use the term explorer tool + to check what completions exist for a given term. You can also see + exactly what search was performed by clicking on the link at the top + of the result list. In general, for natural language terms, stem + expansion will produce better results than an ending * (stem expansion + is turned off when any wildcard character appears in the term). + + 3.7.1.1. Wildcards and path filtering + + Due to the way that Recoll processes wildcards inside dir path filtering + clauses, they will have a multiplicative effect on the query size. A + clause containg wildcards in several paths elements, like, for example, + dir:/home/me/*/*/docdir, will almost certainly fail if your indexed tree + is of any realistic size. + + Depending on the case, you may be able to work around the issue by + specifying the paths elements more narrowly, with a constant prefix, or by + using 2 separate dir: clauses instead of multiple wildcards, as in + dir:/home/me dir:docdir. The latter query is not equivalent to the initial + one because it does not specify a number of directory levels, but that's + the best we can do (and it may be actually more useful in some cases). + + 3.7.2. Anchored searches + + Two characters are used to specify that a search hit should occur at the + beginning or at the end of the text. ^ at the beginning of a term or + phrase constrains the search to happen at the start, $ at the end force it + to happen at the end. + + As this function is implemented as a phrase search it is possible to + specify a maximum distance at which the hit should occur, either through + the controls of the advanced search panel, or using the query language, + for example, as in: + + "^someterm"o10 + + which would force someterm to be found within 10 terms of the start of the + text. This can be combined with a field search as in + somefield:"^someterm"o10 or somefield:someterm$. + + This feature can also be used with an actual phrase search, but in this + case, the distance applies to the whole phrase and anchor, so that, for + example, bla bla my unexpected term at the beginning of the text would be + a match for "^my term"o5. + + Anchored searches can be very useful for searches inside somewhat + structured documents like scientific articles, in case explicit metadata + has not been supplied (a most frequent case), for example for looking for + matches inside the abstract or the list of authors (which occur at the top + of the document). + +3.8. Desktop integration + + Being independant of the desktop type has its drawbacks: Recoll desktop + integration is minimal. However there are a few tools available: + + o The KDE KIO Slave was described in a previous section. + + o If you use a recent version of Ubuntu Linux, you may find the Ubuntu + Unity Lens module useful. + + o There is also an independantly developed Krunner plugin. + + Here follow a few other things that may help. + + 3.8.1. Hotkeying recoll + + It is surprisingly convenient to be able to show or hide the Recoll GUI + with a single keystroke. Recoll comes with a small Python script, based on + the libwnck window manager interface library, which will allow you to do + just this. The detailed instructions are on this wiki page. + + 3.8.2. The KDE Kicker Recoll applet + + This is probably obsolete now. Anyway: + + The Recoll source tree contains the source code to the recoll_applet, a + small application derived from the find_applet. This can be used to add a + small Recoll launcher to the KDE panel. + + The applet is not automatically built with the main Recoll programs, nor + is it included with the main source distribution (because the KDE build + boilerplate makes it relatively big). You can download its source from the + recoll.org download page. Use the omnipotent configure;make;make install + incantation to build and install. + + You can then add the applet to the panel by right-clicking the panel and + choosing the Add applet entry. + + The recoll_applet has a small text window where you can type a Recoll + query (in query language form), and an icon which can be used to restrict + the search to certain types of files. It is quite primitive, and launches + a new recoll GUI instance every time (even if it is already running). You + may find it useful anyway. + +Chapter 4. Programming interface + + Recoll has an Application Programming Interface, usable both for indexing + and searching, currently accessible from the Python language. + + Another less radical way to extend the application is to write input + handlers for new types of documents. + + The processing of metadata attributes for documents (fields) is highly + configurable. + +4.1. Writing a document input handler + + Terminology + + The small programs or pieces of code which handle the processing of the + different document types for Recoll used to be called filters, which is + still reflected in the name of the directory which holds them and many + configuration variables. They were named this way because one of their + primary functions is to filter out the formatting directives and keep the + text content. However these modules may have other behaviours, and the + term input handler is now progressively substituted in the documentation. + filter is still used in many places though. + + Recoll input handlers cooperate to translate from the multitude of input + document formats, simple ones as opendocument, acrobat), or compound ones + such as Zip or Email, into the final Recoll indexing input format, which + is plain text. Most input handlers are executable programs or scripts. A + few handlers are coded in C++ and live inside recollindex. This latter + kind will not be described here. + + There are currently (1.18 and since 1.13) two kinds of external executable + input handlers: + + o Simple exec handlers run once and exit. They can be bare programs like + antiword, or scripts using other programs. They are very simple to + write, because they just need to print the converted document to the + standard output. Their output can be plain text or HTML. HTML is + usually preferred because it can store metadata fields and it allows + preserving some of the formatting for the GUI preview. + + o Multiple execm handlers can process multiple files (sparing the + process startup time which can be very significant), or multiple + documents per file (e.g.: for zip or chm files). They communicate with + the indexer through a simple protocol, but are nevertheless a bit more + complicated than the older kind. Most of new handlers are written in + Python, using a common module to handle the protocol. There is an + exception, rclimg which is written in Perl. The subdocuments output by + these handlers can be directly indexable (text or HTML), or they can + be other simple or compound documents that will need to be processed + by another handler. + + In both cases, handlers deal with regular file system files, and can + process either a single document, or a linear list of documents in each + file. Recoll is responsible for performing up to date checks, deal with + more complex embedding and other upper level issues. + + A simple handler returning a document in text/plain format, can transfer + no metadata to the indexer. Generic metadata, like document size or + modification date, will be gathered and stored by the indexer. + + Handlers that produce text/html format can return an arbitrary amount of + metadata inside HTML meta tags. These will be processed according to the + directives found in the fields configuration file. + + The handlers that can handle multiple documents per file return a single + piece of data to identify each document inside the file. This piece of + data, called an ipath element will be sent back by Recoll to extract the + document at query time, for previewing, or for creating a temporary file + to be opened by a viewer. + + The following section describes the simple handlers, and the next one + gives a few explanations about the execm ones. You could conceivably write + a simple handler with only the elements in the manual. This will not be + the case for the other ones, for which you will have to look at the code. + + 4.1.1. Simple input handlers + + Recoll simple handlers are usually shell-scripts, but this is in no way + necessary. Extracting the text from the native format is the difficult + part. Outputting the format expected by Recoll is trivial. Happily enough, + most document formats have translators or text extractors which can be + called from the handler. In some cases the output of the translating + program is completely appropriate, and no intermediate shell-script is + needed. + + Input handlers are called with a single argument which is the source file + name. They should output the result to stdout. + + When writing a handler, you should decide if it will output plain text or + HTML. Plain text is simpler, but you will not be able to add metadata or + vary the output character encoding (this will be defined in a + configuration file). Additionally, some formatting may be easier to + preserve when previewing HTML. Actually the deciding factor is metadata: + Recoll has a way to extract metadata from the HTML header and use it for + field searches.. + + The RECOLL_FILTER_FORPREVIEW environment variable (values yes, no) tells + the handler if the operation is for indexing or previewing. Some handlers + use this to output a slightly different format, for example stripping + uninteresting repeated keywords (ie: Subject: for email) when indexing. + This is not essential. + + You should look at one of the simple handlers, for example rclps for a + starting point. + + Don't forget to make your handler executable before testing ! + + 4.1.2. "Multiple" handlers + + If you can program and want to write an execm handler, it should not be + too difficult to make sense of one of the existing modules. For example, + look at rclzip which uses Zip file paths as identifiers (ipath), and + rclics, which uses an integer index. Also have a look at the comments + inside the internfile/mh_execm.h file and possibly at the corresponding + module. + + execm handlers sometimes need to make a choice for the nature of the ipath + elements that they use in communication with the indexer. Here are a few + guidelines: + + o Use ASCII or UTF-8 (if the identifier is an integer print it, for + example, like printf %d would do). + + o If at all possible, the data should make some kind of sense when + printed to a log file to help with debugging. + + o Recoll uses a colon (:) as a separator to store a complex path + internally (for deeper embedding). Colons inside the ipath elements + output by a handler will be escaped, but would be a bad choice as a + handler-specific separator (mostly, again, for debugging issues). + + In any case, the main goal is that it should be easy for the handler to + extract the target document, given the file name and the ipath element. + + execm handlers will also produce a document with a null ipath element. + Depending on the type of document, this may have some associated data + (e.g. the body of an email message), or none (typical for an archive + file). If it is empty, this document will be useful anyway for some + operations, as the parent of the actual data documents. + + 4.1.3. Telling Recoll about the handler + + There are two elements that link a file to the handler which should + process it: the association of file to MIME type and the association of a + MIME type with a handler. + + The association of files to MIME types is mostly based on name suffixes. + The types are defined inside the mimemap file. Example: + + + .doc = application/msword + + If no suffix association is found for the file name, Recoll will try to + execute the file -i command to determine a MIME type. + + The association of file types to handlers is performed in the mimeconf + file. A sample will probably be of better help than a long explanation: + + + [index] + application/msword = exec antiword -t -i 1 -m UTF-8;\ + mimetype = text/plain ; charset=utf-8 + + application/ogg = exec rclogg + + text/rtf = exec unrtf --nopict --html; charset=iso-8859-1; mimetype=text/html + + application/x-chm = execm rclchm + + The fragment specifies that: + + o application/msword files are processed by executing the antiword + program, which outputs text/plain encoded in utf-8. + + o application/ogg files are processed by the rclogg script, with default + output type (text/html, with encoding specified in the header, or + utf-8 by default). + + o text/rtf is processed by unrtf, which outputs text/html. The + iso-8859-1 encoding is specified because it is not the utf-8 default, + and not output by unrtf in the HTML header section. + + o application/x-chm is processed by a persistant handler. This is + determined by the execm keyword. + + 4.1.4. Input handler HTML output + + The output HTML could be very minimal like the following example: + + + + + + + Some text content + + + + + You should take care to escape some characters inside the text by + transforming them into appropriate entities. At the very minimum, "&" + should be transformed into "&", "<" should be transformed into "<". + This is not always properly done by translating programs which output + HTML, and of course never by those which output plain text. + + When encapsulating plain text in an HTML body, the display of a preview + may be improved by enclosing the text inside
 tags.
+
+   The character set needs to be specified in the header. It does not need to
+   be UTF-8 (Recoll will take care of translating it), but it must be
+   accurate for good results.
+
+   Recoll will process meta tags inside the header as possible document
+   fields candidates. Documents fields can be processed by the indexer in
+   different ways, for searching or displaying inside query results. This is
+   described in a following section.
+
+   By default, the indexer will process the standard header fields if they
+   are present: title, meta/description, and meta/keywords are both indexed
+   and stored for query-time display.
+
+   A predefined non-standard meta tag will also be processed by Recoll
+   without further configuration: if a date tag is present and has the right
+   format, it will be used as the document date (for display and sorting), in
+   preference to the file modification date. The date format should be as
+   follows:
+
+ 
+ or
+ 
+          
+
+   Example:
+
+ 
+          
+
+   Input handlers also have the possibility to "invent" field names. This
+   should also be output as meta tags:
+
+ 
+
+   You can embed HTML markup inside the content of custom fields, for
+   improving the display inside result lists. In this case, add a (wildly
+   non-standard) markup attribute to tell Recoll that the value is HTML and
+   should not be escaped for display.
+
+ 
+
+   As written above, the processing of fields is described in a further
+   section.
+
+  4.1.5. Page numbers
+
+   The indexer will interpret ^L characters in the handler output as
+   indicating page breaks, and will record them. At query time, this allows
+   starting a viewer on the right page for a hit or a snippet. Currently,
+   only the PDF, Postscript and DVI handlers generate page breaks.
+
+4.2. Field data processing
+
+   Fields are named pieces of information in or about documents, like title,
+   author, abstract.
+
+   The field values for documents can appear in several ways during indexing:
+   either output by input handlers as meta fields in the HTML header section,
+   or extracted from file extended attributes, or added as attributes of the
+   Doc object when using the API, or again synthetized internally by Recoll.
+
+   The Recoll query language allows searching for text in a specific field.
+
+   Recoll defines a number of default fields. Additional ones can be output
+   by handlers, and described in the fields configuration file.
+
+   Fields can be:
+
+     o indexed, meaning that their terms are separately stored in inverted
+       lists (with a specific prefix), and that a field-specific search is
+       possible.
+
+     o stored, meaning that their value is recorded in the index data record
+       for the document, and can be returned and displayed with search
+       results.
+
+   A field can be either or both indexed and stored. This and other aspects
+   of fields handling is defined inside the fields configuration file.
+
+   The sequence of events for field processing is as follows:
+
+     o During indexing, recollindex scans all meta fields in HTML documents
+       (most document types are transformed into HTML at some point). It
+       compares the name for each element to the configuration defining what
+       should be done with fields (the fields file)
+
+     o If the name for the meta element matches one for a field that should
+       be indexed, the contents are processed and the terms are entered into
+       the index with the prefix defined in the fields file.
+
+     o If the name for the meta element matches one for a field that should
+       be stored, the content of the element is stored with the document data
+       record, from which it can be extracted and displayed at query time.
+
+     o At query time, if a field search is performed, the index prefix is
+       computed and the match is only performed against appropriately
+       prefixed terms in the index.
+
+     o At query time, the field can be displayed inside the result list by
+       using the appropriate directive in the definition of the result list
+       paragraph format. All fields are displayed on the fields screen of the
+       preview window (which you can reach through the right-click menu).
+       This is independant of the fact that the search which produced the
+       results used the field or not.
+
+   You can find more information in the section about the fields file, or in
+   comments inside the file.
+
+   You can also have a look at the example on the Wiki, detailing how one
+   could add a page count field to pdf documents for displaying inside result
+   lists.
+
+4.3. API
+
+  4.3.1. Interface elements
+
+   A few elements in the interface are specific and and need an explanation.
+
+   udi
+
+           An udi (unique document identifier) identifies a document. Because
+           of limitations inside the index engine, it is restricted in length
+           (to 200 bytes), which is why a regular URI cannot be used. The
+           structure and contents of the udi is defined by the application
+           and opaque to the index engine. For example, the internal file
+           system indexer uses the complete document path (file path +
+           internal path), truncated to length, the suppressed part being
+           replaced by a hash value.
+
+   ipath
+
+           This data value (set as a field in the Doc object) is stored,
+           along with the URL, but not indexed by Recoll. Its contents are
+           not interpreted, and its use is up to the application. For
+           example, the Recoll internal file system indexer stores the part
+           of the document access path internal to the container file (ipath
+           in this case is a list of subdocument sequential numbers). url and
+           ipath are returned in every search result and permit access to the
+           original document.
+
+   Stored and indexed fields
+
+           The fields file inside the Recoll configuration defines which
+           document fields are either "indexed" (searchable), "stored"
+           (retrievable with search results), or both.
+
+   Data for an external indexer, should be stored in a separate index, not
+   the one for the Recoll internal file system indexer, except if the latter
+   is not used at all). The reason is that the main document indexer purge
+   pass would remove all the other indexer's documents, as they were not seen
+   during indexing. The main indexer documents would also probably be a
+   problem for the external indexer purge operation.
+
+  4.3.2. Python interface
+
+    4.3.2.1. Introduction
+
+   Recoll versions after 1.11 define a Python programming interface, both for
+   searching and indexing. The indexing portion has seen little use, but the
+   searching one is used in the Recoll Ubuntu Unity Lens and Recoll Web UI.
+
+   The API is inspired by the Python database API specification. There were
+   two major changes in recent Recoll versions:
+
+     o The basis for the Recoll API changed from Python database API version
+       1.0 (Recoll versions up to 1.18.1), to version 2.0 (Recoll 1.18.2 and
+       later).
+     o The recoll module became a package (with an internal recoll module) as
+       of Recoll version 1.19, in order to add more functions. For existing
+       code, this only changes the way the interface must be imported.
+
+   We will mostly describe the new API and package structure here. A
+   paragraph at the end of this section will explain a few differences and
+   ways to write code compatible with both versions.
+
+   The Python interface can be found in the source package, under
+   python/recoll.
+
+   The python/recoll/ directory contains the usual setup.py. After
+   configuring the main Recoll code, you can use the script to build and
+   install the Python module:
+
+             cd recoll-xxx/python/recoll
+             python setup.py build
+             python setup.py install
+          
+
+   The normal Recoll installer installs the Python API along with the main
+   code.
+
+   When installing from a repository, and depending on the distribution, the
+   Python API can sometimes be found in a separate package.
+
+    4.3.2.2. Recoll package
+
+   The recoll package contains two modules:
+
+     o The recoll module contains functions and classes used to query (or
+       update) the index.
+
+     o The rclextract module contains functions and classes used to access
+       document data.
+
+    4.3.2.3. The recoll module
+
+      Functions
+
+   connect(confdir=None, extra_dbs=None, writable = False)
+           The connect() function connects to one or several Recoll index(es)
+           and returns a Db object.
+              o confdir may specify a configuration directory. The usual
+                defaults apply.
+              o extra_dbs is a list of additional indexes (Xapian
+                directories).
+              o writable decides if we can index new data through this
+                connection.
+           This call initializes the recoll module, and it should always be
+           performed before any other call or object creation.
+
+      Classes
+
+        The Db class
+
+   A Db object is created by a connect() call and holds a connection to a
+   Recoll index.
+
+   Methods
+
+   Db.close()
+           Closes the connection. You can't do anything with the Db object
+           after this.
+
+   Db.query(), Db.cursor()
+           These aliases return a blank Query object for this index.
+
+   Db.setAbstractParams(maxchars, contextwords)
+           Set the parameters used to build snippets (sets of keywords in
+           context text fragments). maxchars defines the maximum total size
+           of the abstract. contextwords defines how many terms are shown
+           around the keyword.
+
+   Db.termMatch(match_type, expr, field='', maxlen=-1, casesens=False,
+   diacsens=False, lang='english')
+           Expand an expression against the index term list. Performs the
+           basic function from the GUI term explorer tool. match_type can be
+           either of wildcard, regexp or stem. Returns a list of terms
+           expanded from the input expression.
+
+        The Query class
+
+   A Query object (equivalent to a cursor in the Python DB API) is created by
+   a Db.query() call. It is used to execute index searches.
+
+   Methods
+
+   Query.sortby(fieldname, ascending=True)
+           Sort results by fieldname, in ascending or descending order. Must
+           be called before executing the search.
+
+   Query.execute(query_string, stemming=1, stemlang="english")
+           Starts a search for query_string, a Recoll search language string.
+
+   Query.executesd(SearchData)
+           Starts a search for the query defined by the SearchData object.
+
+   Query.fetchmany(size=query.arraysize)
+           Fetches the next Doc objects in the current search results, and
+           returns them as an array of the required size, which is by default
+           the value of the arraysize data member.
+
+   Query.fetchone()
+           Fetches the next Doc object from the current search results.
+
+   Query.close()
+           Closes the query. The object is unusable after the call.
+
+   Query.scroll(value, mode='relative')
+           Adjusts the position in the current result set. mode can be
+           relative or absolute.
+
+   Query.getgroups()
+           Retrieves the expanded query terms as a list of pairs. Meaningful
+           only after executexx In each pair, the first entry is a list of
+           user terms (of size one for simple terms, or more for group and
+           phrase clauses), the second a list of query terms as derived from
+           the user terms and used in the Xapian Query.
+
+   Query.getxquery()
+           Return the Xapian query description as a Unicode string.
+           Meaningful only after executexx.
+
+   Query.highlight(text, ishtml = 0, methods = object)
+           Will insert ,  tags around the match
+           areas in the input text and return the modified text. ishtml can
+           be set to indicate that the input text is HTML and that HTML
+           special characters should not be escaped. methods if set should be
+           an object with methods startMatch(i) and endMatch() which will be
+           called for each match and should return a begin and end tag
+
+   Query.makedocabstract(doc, methods = object))
+           Create a snippets abstract for doc (a Doc object) by selecting
+           text around the match terms. If methods is set, will also perform
+           highlighting. See the highlight method.
+
+   Query.__iter__() and Query.next()
+           So that things like for doc in query: will work.
+
+   Data descriptors
+
+   Query.arraysize
+           Default number of records processed by fetchmany (r/w).
+
+   Query.rowcount
+           Number of records returned by the last execute.
+
+   Query.rownumber
+           Next index to be fetched from results. Normally increments after
+           each fetchone() call, but can be set/reset before the call to
+           effect seeking (equivalent to using scroll()). Starts at 0.
+
+        The Doc class
+
+   A Doc object contains index data for a given document. The data is
+   extracted from the index when searching, or set by the indexer program
+   when updating. The Doc object has many attributes to be read or set by its
+   user. It matches exactly the Rcl::Doc C++ object. Some of the attributes
+   are predefined, but, especially when indexing, others can be set, the name
+   of which will be processed as field names by the indexing configuration.
+   Inputs can be specified as Unicode or strings. Outputs are Unicode
+   objects. All dates are specified as Unix timestamps, printed as strings.
+   Please refer to the rcldb/rcldoc.h C++ file for a description of the
+   predefined attributes.
+
+   At query time, only the fields that are defined as stored either by
+   default or in the fields configuration file will be meaningful in the Doc
+   object. Especially this will not be the case for the document text. See
+   the rclextract module for accessing document contents.
+
+   Methods
+
+   get(key), [] operator
+           Retrieve the named doc attribute
+
+   getbinurl()
+           Retrieve the URL in byte array format (no transcoding), for use as
+           parameter to a system call.
+
+   items()
+           Return a dictionary of doc object keys/values
+
+   keys()
+           list of doc object keys (attribute names).
+
+        The SearchData class
+
+   A SearchData object allows building a query by combining clauses, for
+   execution by Query.executesd(). It can be used in replacement of the query
+   language approach. The interface is going to change a little, so no
+   detailed doc for now...
+
+   Methods
+
+   addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub', qstring=string,
+   slack=0, field='', stemming=1, subSearch=SearchData)
+
+    4.3.2.4. The rclextract module
+
+   Index queries do not provide document content (only a partial and
+   unprecise reconstruction is performed to show the snippets text). In order
+   to access the actual document data, the data extraction part of the
+   indexing process must be performed (subdocument access and format
+   translation). This is not trivial in general. The rclextract module
+   currently provides a single class which can be used to access the data
+   content for result documents.
+
+      Classes
+
+        The Extractor class
+
+   Methods
+
+   Extractor(doc)
+           An Extractor object is built from a Doc object, output from a
+           query.
+
+   Extractor.textextract(ipath)
+           Extract document defined by ipath and return a Doc object. The
+           doc.text field has the document text converted to either
+           text/plain or text/html according to doc.mimetype. The typical use
+           would be as follows:
+
+ qdoc = query.fetchone()
+ extractor = recoll.Extractor(qdoc)
+ doc = extractor.textextract(qdoc.ipath)
+ # use doc.text, e.g. for previewing
+
+   Extractor.idoctofile(ipath, targetmtype, outfile='')
+           Extracts document into an output file, which can be given
+           explicitly or will be created as a temporary file to be deleted by
+           the caller. Typical use:
+
+ qdoc = query.fetchone()
+ extractor = recoll.Extractor(qdoc)
+ filename = extractor.idoctofile(qdoc.ipath, qdoc.mimetype)
+
+    4.3.2.5. Example code
+
+   The following sample would query the index with a user language string.
+   See the python/samples directory inside the Recoll source for other
+   examples. The recollgui subdirectory has a very embryonic GUI which
+   demonstrates the highlighting and data extraction functions.
+
+ #!/usr/bin/env python
+
+ from recoll import recoll
+
+ db = recoll.connect()
+ db.setAbstractParams(maxchars=80, contextwords=4)
+
+ query = db.query()
+ nres = query.execute("some user question")
+ print "Result count: ", nres
+ if nres > 5:
+     nres = 5
+ for i in range(nres):
+     doc = query.fetchone()
+     print "Result #%d" % (query.rownumber,)
+     for k in ("title", "size"):
+         print k, ":", getattr(doc, k).encode('utf-8')
+     abs = db.makeDocAbstract(doc, query).encode('utf-8')
+     print abs
+     print
+
+
+
+    4.3.2.6. Compatibility with the previous version
+
+   The following code fragments can be used to ensure that code can run with
+   both the old and the new API (as long as it does not use the new abilities
+   of the new API of course).
+
+   Adapting to the new package structure:
+
+
+ try:
+     from recoll import recoll
+     from recoll import rclextract
+     hasextract = True
+ except:
+     import recoll
+     hasextract = False
+
+
+   Adapting to the change of nature of the next Query member. The same test
+   can be used to choose to use the scroll() method (new) or set the next
+   value (old).
+
+
+        rownum = query.next if type(query.next) == int else \
+                  query.rownumber
+
+
+Chapter 5. Installation and configuration
+
+5.1. Installing a binary copy
+
+   Recoll binary copies are always distributed as regular packages for your
+   system. They can be obtained either through the system's normal software
+   distribution framework (e.g. Debian/Ubuntu apt, FreeBSD ports, etc.), or
+   from some type of "backports" repository providing versions newer than the
+   standard ones, or found on the Recoll WEB site in some cases.
+
+   There used to exist another form of binary install, as pre-compiled source
+   trees, but these are just less convenient than the packages and don't
+   exist any more.
+
+   The package management tools will usually automatically deal with hard
+   dependancies for packages obtained from a proper package repository. You
+   will have to deal with them by hand for downloaded packages (for example,
+   when dpkg complains about missing dependancies).
+
+   In all cases, you will have to check or install supporting applications
+   for the file types that you want to index beyond those that are natively
+   processed by Recoll (text, HTML, email files, and a few others).
+
+   You should also maybe have a look at the configuration section (but this
+   may not be necessary for a quick test with default parameters). Most
+   parameters can be more conveniently set from the GUI interface.
+
+5.2. Supporting packages
+
+   Recoll uses external applications to index some file types. You need to
+   install them for the file types that you wish to have indexed (these are
+   run-time optional dependencies. None is needed for building or running
+   Recoll except for indexing their specific file type).
+
+   After an indexing pass, the commands that were found missing can be
+   displayed from the recoll File menu. The list is stored in the missing
+   text file inside the configuration directory.
+
+   A list of common file types which need external commands follows. Many of
+   the handlers need the iconv command, which is not always listed as a
+   dependancy.
+
+   Please note that, due to the relatively dynamic nature of this
+   information, the most up to date version is now kept on
+   http://www.recoll.org/features.html along with links to the home pages or
+   best source/patches pages, and misc tips. The list below is not updated
+   often and may be quite stale.
+
+   For many Linux distributions, most of the commands listed can be installed
+   from the package repositories. However, the packages are sometimes
+   outdated, or not the best version for Recoll, so you should take a look at
+   http://www.recoll.org/features.html if a file type is important to you.
+
+   As of Recoll release 1.14, a number of XML-based formats that were handled
+   by ad hoc handler code now use the xsltproc command, which usually comes
+   with libxslt. These are: abiword, fb2 (ebooks), kword, openoffice, svg.
+
+   Now for the list:
+
+     o Openoffice files need unzip and xsltproc.
+
+     o PDF files need pdftotext which is part of Poppler (usually comes with
+       the poppler-utils package). Avoid the original one from Xpdf.
+
+     o Postscript files need pstotext. The original version has an issue with
+       shell character in file names, which is corrected in recent packages.
+       See http://www.recoll.org/features.html for more detail.
+
+     o MS Word needs antiword. It is also useful to have wvWare installed as
+       it may be be used as a fallback for some files which antiword does not
+       handle.
+
+     o MS Excel and PowerPoint are processed by internal Python handlers.
+
+     o MS Open XML (docx) needs xsltproc.
+
+     o Wordperfect files need wpd2html from the libwpd (or libwpd-tools on
+       Ubuntu) package.
+
+     o RTF files need unrtf, which, in its older versions, has much trouble
+       with non-western character sets. Many Linux distributions carry
+       outdated unrtf versions. Check http://www.recoll.org/features.html for
+       details.
+
+     o TeX files need untex or detex. Check
+       http://www.recoll.org/features.html for sources if it's not packaged
+       for your distribution.
+
+     o dvi files need dvips.
+
+     o djvu files need djvutxt and djvused from the DjVuLibre package.
+
+     o Audio files: Recoll releases 1.14 and later use a single Python
+       handler based on mutagen for all audio file types.
+
+     o Pictures: Recoll uses the Exiftool Perl package to extract tag
+       information. Most image file formats are supported. Note that there
+       may not be much interest in indexing the technical tags (image size,
+       aperture, etc.). This is only of interest if you store personal tags
+       or textual descriptions inside the image files.
+
+     o chm: files in Microsoft help format need Python and the pychm module
+       (which needs chmlib).
+
+     o ICS: up to Recoll 1.13, iCalendar files need Python and the icalendar
+       module. icalendar is not needed for newer versions, which use internal
+       code.
+
+     o Zip archives need Python (and the standard zipfile module).
+
+     o Rar archives need Python, the rarfile Python module and the unrar
+       utility.
+
+     o Midi karaoke files need Python and the Midi module
+
+     o Konqueror webarchive format with Python (uses the Tarfile module).
+
+     o Mimehtml web archive format (support based on the email handler, which
+       introduces some mild weirdness, but still usable).
+
+   Text, HTML, email folders, and Scribus files are processed internally. Lyx
+   is used to index Lyx files. Many handlers need iconv and the standard sed
+   and awk.
+
+5.3. Building from source
+
+  5.3.1. Prerequisites
+
+   If you can install any or all of the following through the package manager
+   for your system, all the better. Especially Qt is a very big piece of
+   software, but you will most probably be able to find a binary package.
+
+   You may have to compile Xapian but this is easy.
+
+   The shopping list:
+
+     o C++ compiler. Up to Recoll version 1.13.04, its absence can manifest
+       itself by strange messages about a missing iconv_open.
+
+     o Development files for Xapian core.
+
+  Important
+
+       If you are building Xapian for an older CPU (before Pentium 4 or
+       Athlon 64), you need to add the --disable-sse flag to the configure
+       command. Else all Xapian application will crash with an illegal
+       instruction error.
+
+     o Development files for Qt 4 . Recoll has not been tested with Qt 5 yet.
+       Recoll 1.15.9 was the last version to support Qt 3. If you do not want
+       to install or build the Qt Webkit module, Recoll has a configuration
+       option to disable its use (see further).
+
+     o Development files for X11 and zlib.
+
+     o You may also need libiconv. On Linux systems, the iconv interface is
+       part of libc and you should not need to do anything special.
+
+   Check the Recoll download page for up to date version information.
+
+  5.3.2. Building
+
+   Recoll has been built on Linux, FreeBSD, Mac OS X, and Solaris, most
+   versions after 2005 should be ok, maybe some older ones too (Solaris 8 is
+   ok). If you build on another system, and need to modify things, I would
+   very much welcome patches.
+
+   Configure options: 
+
+     o --without-aspell will disable the code for phonetic matching of search
+       terms.
+
+     o --with-fam or --with-inotify will enable the code for real time
+       indexing. Inotify support is enabled by default on recent Linux
+       systems.
+
+     o --with-qzeitgeist will enable sending Zeitgeist events about the
+       visited search results, and needs the qzeitgeist package.
+
+     o --disable-webkit is available from version 1.17 to implement the
+       result list with a Qt QTextBrowser instead of a WebKit widget if you
+       do not or can't depend on the latter.
+
+     o --disable-idxthreads is available from version 1.19 to suppress
+       multithreading inside the indexing process. You can also use the
+       run-time configuration to restrict recollindex to using a single
+       thread, but the compile-time option may disable a few more unused
+       locks. This only applies to the use of multithreading for the core
+       index processing (data input). The Recoll monitor mode always uses at
+       least two threads of execution.
+
+     o --disable-python-module will avoid building the Python module.
+
+     o --disable-xattr will prevent fetching data from file extended
+       attributes. Beyond a few standard attributes, fetching extended
+       attributes data can only be useful is some application stores data in
+       there, and also needs some simple configuration (see comments in the
+       fields configuration file).
+
+     o --enable-camelcase will enable splitting camelCase words. This is not
+       enabled by default as it has the unfortunate side-effect of making
+       some phrase searches quite confusing: ie, "MySQL manual" would be
+       matched by "MySQL manual" and "my sql manual" but not "mysql manual"
+       (only inside phrase searches).
+
+     o --with-file-command Specify the version of the 'file' command to use
+       (ie: --with-file-command=/usr/local/bin/file). Can be useful to enable
+       the gnu version on systems where the native one is bad.
+
+     o --disable-qtgui Disable the Qt interface. Will allow building the
+       indexer and the command line search program in absence of a Qt
+       environment.
+
+     o --disable-x11mon Disable X11 connection monitoring inside recollindex.
+       Together with --disable-qtgui, this allows building recoll without Qt
+       and X11.
+
+     o --disable-pic will compile Recoll with position-dependant code. This
+       is incompatible with building the KIO or the Python or PHP extensions,
+       but might yield very marginally faster code.
+
+     o Of course the usual autoconf configure options, like --prefix apply.
+
+   Normal procedure:
+
+         cd recoll-xxx
+         ./configure
+         make
+         (practices usual hardship-repelling invocations)
+      
+
+   There is little auto-configuration. The configure script will mainly link
+   one of the system-specific files in the mk directory to mk/sysconf. If
+   your system is not known yet, it will tell you as much, and you may want
+   to manually copy and modify one of the existing files (the new file name
+   should be the output of uname -s).
+
+    5.3.2.1. Building on Solaris
+
+   We did not test building the GUI on Solaris for recent versions. You will
+   need at least Qt 4.4. There are some hints on an old web site page, they
+   may still be valid.
+
+   Someone did test the 1.19 indexer and Python module build, they do work,
+   with a few minor glitches. Be sure to use GNU make and install.
+
+  5.3.3. Installation
+
+   Either type make install or execute recollinstall prefix, in the root of
+   the source tree. This will copy the commands to prefix/bin and the sample
+   configuration files, scripts and other shared data to prefix/share/recoll.
+
+   If the installation prefix given to recollinstall is different from either
+   the system default or the value which was specified when executing
+   configure (as in configure --prefix /some/path), you will have to set the
+   RECOLL_DATADIR environment variable to indicate where the shared data is
+   to be found (ie for (ba)sh: export
+   RECOLL_DATADIR=/some/path/share/recoll).
+
+   You can then proceed to configuration.
+
+5.4. Configuration overview
+
+   Most of the parameters specific to the recoll GUI are set through the
+   Preferences menu and stored in the standard Qt place
+   ($HOME/.config/Recoll.org/recoll.conf). You probably do not want to edit
+   this by hand.
+
+   Recoll indexing options are set inside text configuration files located in
+   a configuration directory. There can be several such directories, each of
+   which defines the parameters for one index.
+
+   The configuration files can be edited by hand or through the Index
+   configuration dialog (Preferences menu). The GUI tool will try to respect
+   your formatting and comments as much as possible, so it is quite possible
+   to use both ways.
+
+   The most accurate documentation for the configuration parameters is given
+   by comments inside the default files, and we will just give a general
+   overview here.
+
+   By default, for each index, there are two sets of configuration files.
+   System-wide configuration files are kept in a directory named like
+   /usr/[local/]share/recoll/examples, and define default values, shared by
+   all indexes. For each index, a parallel set of files defines the
+   customized parameters.
+
+   In addition (as of Recoll version 1.19.7), it is possible to specify two
+   additional configuration directories which will be stacked before and
+   after the user configuration directory. These are defined by the
+   RECOLL_CONFTOP and RECOLL_CONFMID environment variables. Values from
+   configuration files inside the top directory will override user ones,
+   values from configuration files inside the middle directory will override
+   system ones and be overriden by user ones. These two variables may be of
+   use to applications which augment Recoll functionality, and need to add
+   configuration data without disturbing the user's files. Please note that
+   the two, currently single, values will probably be interpreted as
+   colon-separated lists in the future: do not use colon characters inside
+   the directory paths.
+
+   The default location of the configuration is the .recoll directory in your
+   home. Most people will only use this directory.
+
+   This location can be changed, or others can be added with the
+   RECOLL_CONFDIR environment variable or the -c option parameter to recoll
+   and recollindex.
+
+   If the .recoll directory does not exist when recoll or recollindex are
+   started, it will be created with a set of empty configuration files.
+   recoll will give you a chance to edit the configuration file before
+   starting indexing. recollindex will proceed immediately. To avoid
+   mistakes, the automatic directory creation will only occur for the default
+   location, not if -c or RECOLL_CONFDIR were used (in the latter cases, you
+   will have to create the directory).
+
+   All configuration files share the same format. For example, a short
+   extract of the main configuration file might look as follows:
+
+         # Space-separated list of directories to index.
+         topdirs =  ~/docs /usr/share/doc
+
+         [~/somedirectory-with-utf8-txt-files]
+         defaultcharset = utf-8
+        
+
+   There are three kinds of lines:
+
+     o Comment (starts with #) or empty.
+
+     o Parameter affectation (name = value).
+
+     o Section definition ([somedirname]).
+
+   Depending on the type of configuration file, section definitions either
+   separate groups of parameters or allow redefining some parameters for a
+   directory sub-tree. They stay in effect until another section definition,
+   or the end of file, is encountered. Some of the parameters used for
+   indexing are looked up hierarchically from the current directory location
+   upwards. Not all parameters can be meaningfully redefined, this is
+   specified for each in the next section.
+
+   When found at the beginning of a file path, the tilde character (~) is
+   expanded to the name of the user's home directory, as a shell would do.
+
+   White space is used for separation inside lists. List elements with
+   embedded spaces can be quoted using double-quotes.
+
+   Encoding issues. Most of the configuration parameters are plain ASCII. Two
+   particular sets of values may cause encoding issues:
+
+     o File path parameters may contain non-ascii characters and should use
+       the exact same byte values as found in the file system directory.
+       Usually, this means that the configuration file should use the system
+       default locale encoding.
+
+     o The unac_except_trans parameter should be encoded in UTF-8. If your
+       system locale is not UTF-8, and you need to also specify non-ascii
+       file paths, this poses a difficulty because common text editors cannot
+       handle multiple encodings in a single file. In this relatively
+       unlikely case, you can edit the configuration file as two separate
+       text files with appropriate encodings, and concatenate them to create
+       the complete configuration.
+
+  5.4.1. Environment variables
+
+   RECOLL_CONFDIR
+
+           Defines the main configuration directory.
+
+   RECOLL_TMPDIR, TMPDIR
+
+           Locations for temporary files, in this order of priority. The
+           default if none of these is set is to use /tmp. Big temporary
+           files may be created during indexing, mostly for decompressing,
+           and also for processing, e.g. email attachments.
+
+   RECOLL_CONFTOP, RECOLL_CONFMID
+
+           Allow adding configuration directories with priorities below and
+           above the user directory (see above the Configuration overview
+           section for details).
+
+   RECOLL_EXTRA_DBS, RECOLL_ACTIVE_EXTRA_DBS
+
+           Help for setting up external indexes. See this paragraph for
+           explanations.
+
+   RECOLL_DATADIR
+
+           Defines replacement for the default location of Recoll data files,
+           normally found in, e.g., /usr/share/recoll).
+
+   RECOLL_FILTERSDIR
+
+           Defines replacement for the default location of Recoll filters,
+           normally found in, e.g., /usr/share/recoll/filters).
+
+   ASPELL_PROG
+
+           aspell program to use for creating the spelling dictionary. The
+           result has to be compatible with the libaspell which Recoll is
+           using.
+
+   VARNAME
+
+           Blabla
+
+  5.4.2. The main configuration file, recoll.conf
+
+   recoll.conf is the main configuration file. It defines things like what to
+   index (top directories and things to ignore), and the default character
+   set to use for document types which do not specify it internally.
+
+   The default configuration will index your home directory. If this is not
+   appropriate, start recoll to create a blank configuration, click Cancel,
+   and edit the configuration file before restarting the command. This will
+   start the initial indexing, which may take some time.
+
+   Most of the following parameters can be changed from the Index
+   Configuration menu in the recoll interface. Some can only be set by
+   editing the configuration file.
+
+    5.4.2.1. Parameters affecting what documents we index:
+
+   topdirs
+
+           Specifies the list of directories or files to index (recursively
+           for directories). You can use symbolic links as elements of this
+           list. See the followLinks option about following symbolic links
+           found under the top elements (not followed by default).
+
+   skippedNames
+
+           A space-separated list of wilcard patterns for names of files or
+           directories that should be completely ignored. The list defined in
+           the default file is:
+
+ skippedNames = #* bin CVS  Cache cache* caughtspam  tmp .thumbnails .svn \
+                *~ .beagle .git .hg .bzr loop.ps .xsession-errors \
+                .recoll* xapiandb recollrc recoll.conf
+
+           The list can be redefined at any sub-directory in the indexed
+           area.
+
+           The top-level directories are not affected by this list (that is,
+           a directory in topdirs might match and would still be indexed).
+
+           The list in the default configuration does not exclude hidden
+           directories (names beginning with a dot), which means that it may
+           index quite a few things that you do not want. On the other hand,
+           email user agents like thunderbird usually store messages in
+           hidden directories, and you probably want this indexed. One
+           possible solution is to have .* in skippedNames, and add things
+           like ~/.thunderbird or ~/.evolution in topdirs.
+
+           Not even the file names are indexed for patterns in this list. See
+           the noContentSuffixes variable for an alternative approach which
+           indexes the file names.
+
+   noContentSuffixes
+
+           This is a list of file name endings (not wildcard expressions, nor
+           dot-delimited suffixes). Only the names of matching files will be
+           indexed (no attempt at MIME type identification, no decompression,
+           no content indexing). This can be redefined for subdirectories,
+           and edited from the GUI. The default value is:
+
+ noContentSuffixes = .md5 .map \
+        .o .lib .dll .a .sys .exe .com \
+        .mpp .mpt .vsd \
+            .img .img.gz .img.bz2 .img.xz .image .image.gz .image.bz2 .image.xz \
+        .dat .bak .rdf .log.gz .log .db .msf .pid \
+        ,v ~ #
+
+   skippedPaths and daemSkippedPaths
+
+           A space-separated list of patterns for paths of files or
+           directories that should be skipped. There is no default in the
+           sample configuration file, but the code always adds the
+           configuration and database directories in there.
+
+           skippedPaths is used both by batch and real time indexing.
+           daemSkippedPaths can be used to specify things that should be
+           indexed at startup, but not monitored.
+
+           Example of use for skipping text files only in a specific
+           directory:
+
+ skippedPaths = ~/somedir/*.txt
+              
+
+   skippedPathsFnmPathname
+
+           The values in the *skippedPaths variables are matched by default
+           with fnmatch(3), with the FNM_PATHNAME flag. This means that '/'
+           characters must be matched explicitely. You can set
+           skippedPathsFnmPathname to 0 to disable the use of FNM_PATHNAME
+           (meaning that /*/dir3 will match /dir1/dir2/dir3).
+
+   zipSkippedNames
+
+           A space-separated list of patterns for names of files or
+           directories that should be ignored inside zip archives. This is
+           used directly by the zip handler, and has a function similar to
+           skippedNames, but works independantly. Can be redefined for
+           filesystem subdirectories. For versions up to 1.19, you will need
+           to update the Zip handler and install a supplementary Python
+           module. The details are described on the Recoll wiki.
+
+   followLinks
+
+           Specifies if the indexer should follow symbolic links while
+           walking the file tree. The default is to ignore symbolic links to
+           avoid multiple indexing of linked files. No effort is made to
+           avoid duplication when this option is set to true. This option can
+           be set individually for each of the topdirs members by using
+           sections. It can not be changed below the topdirs level.
+
+   indexedmimetypes
+
+           Recoll normally indexes any file which it knows how to read. This
+           list lets you restrict the indexed MIME types to what you specify.
+           If the variable is unspecified or the list empty (the default),
+           all supported types are processed. Can be redefined for
+           subdirectories.
+
+   excludedmimetypes
+
+           This list lets you exclude some MIME types from indexing. Can be
+           redefined for subdirectories.
+
+   compressedfilemaxkbs
+
+           Size limit for compressed (.gz or .bz2) files. These need to be
+           decompressed in a temporary directory for identification, which
+           can be very wasteful if 'uninteresting' big compressed files are
+           present. Negative means no limit, 0 means no processing of any
+           compressed file. Defaults to -1.
+
+   textfilemaxmbs
+
+           Maximum size for text files. Very big text files are often
+           uninteresting logs. Set to -1 to disable (default 20MB).
+
+   textfilepagekbs
+
+           If set to other than -1, text files will be indexed as multiple
+           documents of the given page size. This may be useful if you do
+           want to index very big text files as it will both reduce memory
+           usage at index time and help with loading data to the preview
+           window. A size of a few megabytes would seem reasonable (default:
+           1MB).
+
+   membermaxkbs
+
+           This defines the maximum size in kilobytes for an archive member
+           (zip, tar or rar at the moment). Bigger entries will be skipped.
+
+   indexallfilenames
+
+           Recoll indexes file names in a special section of the database to
+           allow specific file names searches using wild cards. This
+           parameter decides if file name indexing is performed only for
+           files with MIME types that would qualify them for full text
+           indexing, or for all files inside the selected subtrees,
+           independently of MIME type.
+
+   usesystemfilecommand
+
+           Decide if we execute a system command (file -i by default) as a
+           final step for determining the MIME type for a file (the main
+           procedure uses suffix associations as defined in the mimemap
+           file). This can be useful for files with suffix-less names, but it
+           will also cause the indexing of many bogus "text" files.
+
+   systemfilecommand
+
+           Command to use for mime for mime type determination if
+           usesystefilecommand is set. Recent versions of xdg-mime sometimes
+           work better than file.
+
+   processwebqueue
+
+           If this is set, process the directory where Web browser plugins
+           copy visited pages for indexing.
+
+   webqueuedir
+
+           The path to the web indexing queue. This is hard-coded in the
+           Firefox plugin as ~/.recollweb/ToIndex so there should be no need
+           to change it.
+
+    5.4.2.2. Parameters affecting how we generate terms:
+
+   Changing some of these parameters will imply a full reindex. Also, when
+   using multiple indexes, it may not make sense to search indexes that don't
+   share the values for these parameters, because they usually affect both
+   search and index operations.
+
+   indexStripChars
+
+           Decide if we strip characters of diacritics and convert them to
+           lower-case before terms are indexed. If we don't, searches
+           sensitive to case and diacritics can be performed, but the index
+           will be bigger, and some marginal weirdness may sometimes occur.
+           The default is a stripped index (indexStripChars = 1) for now.
+           When using multiple indexes for a search, this parameter must be
+           defined identically for all. Changing the value implies an index
+           reset.
+
+   maxTermExpand
+
+           Maximum expansion count for a single term (e.g.: when using
+           wildcards). The default of 10000 is reasonable and will avoid
+           queries that appear frozen while the engine is walking the term
+           list.
+
+   maxXapianClauses
+
+           Maximum number of elementary clauses we can add to a single Xapian
+           query. In some cases, the result of term expansion can be
+           multiplicative, and we want to avoid using excessive memory. The
+           default of 100 000 should be both high enough in most cases and
+           compatible with current typical hardware configurations.
+
+   nonumbers
+
+           If this set to true, no terms will be generated for numbers. For
+           example "123", "1.5e6", 192.168.1.4, would not be indexed
+           ("value123" would still be). Numbers are often quite interesting
+           to search for, and this should probably not be set except for
+           special situations, ie, scientific documents with huge amounts of
+           numbers in them. This can only be set for a whole index, not for a
+           subtree.
+
+   nocjk
+
+           If this set to true, specific east asian (Chinese Korean Japanese)
+           characters/word splitting is turned off. This will save a small
+           amount of cpu if you have no CJK documents. If your document base
+           does include such text but you are not interested in searching it,
+           setting nocjk may be a significant time and space saver.
+
+   cjkngramlen
+
+           This lets you adjust the size of n-grams used for indexing CJK
+           text. The default value of 2 is probably appropriate in most
+           cases. A value of 3 would allow more precision and efficiency on
+           longer words, but the index will be approximately twice as large.
+
+   indexstemminglanguages
+
+           A list of languages for which the stem expansion databases will be
+           built. See recollindex(1) or use the recollindex -l command for
+           possible values. You can add a stem expansion database for a
+           different language by using recollindex -s, but it will be deleted
+           during the next indexing. Only languages listed in the
+           configuration file are permanent.
+
+   defaultcharset
+
+           The name of the character set used for files that do not contain a
+           character set definition (ie: plain text files). This can be
+           redefined for any sub-directory. If it is not set at all, the
+           character set used is the one defined by the nls environment (
+           LC_ALL, LC_CTYPE, LANG), or iso8859-1 if nothing is set.
+
+   unac_except_trans
+
+           This is a list of characters, encoded in UTF-8, which should be
+           handled specially when converting text to unaccented lowercase.
+           For example, in Swedish, the letter a with diaeresis has full
+           alphabet citizenship and should not be turned into an a. Each
+           element in the space-separated list has the special character as
+           first element and the translation following. The handling of both
+           the lowercase and upper-case versions of a character should be
+           specified, as appartenance to the list will turn-off both standard
+           accent and case processing. Example for Swedish:
+
+ unac_except_trans =  aaaa AAaa a:a: A:a: o:o: O:o:
+            
+
+           Note that the translation is not limited to a single character,
+           you could very well have something like u:ue in the list.
+
+           The default value set for unac_except_trans can't be listed here
+           because I have trouble with SGML and UTF-8, but it only contains
+           ligature decompositions: german ss, oe, ae, fi, fl.
+
+           This parameter can't be defined for subdirectories, it is global,
+           because there is no way to do otherwise when querying. If you have
+           document sets which would need different values, you will have to
+           index and query them separately.
+
+   maildefcharset
+
+           This can be used to define the default character set specifically
+           for email messages which don't specify it. This is mainly useful
+           for readpst (libpst) dumps, which are utf-8 but do not say so.
+
+   localfields
+
+           This allows setting fields for all documents under a given
+           directory. Typical usage would be to set an "rclaptg" field, to be
+           used in mimeview to select a specific viewer. If several fields
+           are to be set, they should be separated with a semi-colon (';')
+           character, which there is currently no way to escape. Also note
+           the initial semi-colon. Example: localfields= ;rclaptg=gnus;other
+           = val, then select specifier viewer with mimetype|tag=... in
+           mimeview.
+
+   testmodifusemtime
+
+           If true, use mtime instead of default ctime to determine if a file
+           has been modified (in addition to size, which is always used).
+           Setting this can reduce re-indexing on systems where extended
+           attributes are modified (by some other application), but not
+           indexed (changing extended attributes only affects ctime). Notes:
+
+              o This may prevent detection of change in some marginal file
+                rename cases (the target would need to have the same size and
+                mtime).
+
+              o You should probably also set noxattrfields to 1 in this case,
+                except if you still prefer to perform xattr indexing, for
+                example if the local file update pattern makes it of value
+                (as in general, there is a risk for pure extended attributes
+                updates without file modification to go undetected).
+
+           Perform a full index reset after changing the value of this
+           parameter.
+
+   noxattrfields
+
+           Recoll versions 1.19 and later automatically translate file
+           extended attributes into document fields (to be processed
+           according to the parameters from the fields file). Setting this
+           variable to 1 will disable the behaviour.
+
+   metadatacmds
+
+           This allows executing external commands for each file and storing
+           the output in Recoll document fields. This could be used for
+           example to index external tag data. The value is a list of field
+           names and commands, don't forget an initial semi-colon. Example:
+
+ [/some/area/of/the/fs]
+ metadatacmds = ; tags = tmsu tags %f; otherfield = somecmd -xx %f
+                
+
+           As a specially disgusting hack brought by Recoll 1.19.7, if a
+           "field name" begins with rclmulti, the data returned by the
+           command is expected to contain multiple field values, in
+           configuration file format. This allows setting several fields by
+           executing a single command. Example:
+
+ metadatacmds = ; rclmulti1 = somecmd %f
+                
+
+           If somecmd returns data in the form of:
+
+ field1 = value1
+ field2 = value for field2
+                
+
+           field1 and field2 will be set inside the document metadata.
+
+    5.4.2.3. Parameters affecting where and how we store things:
+
+   dbdir
+
+           The name of the Xapian data directory. It will be created if
+           needed when the index is initialized. If this is not an absolute
+           path, it will be interpreted relative to the configuration
+           directory. The value can have embedded spaces but starting or
+           trailing spaces will be trimmed. You cannot use quotes here.
+
+   idxstatusfile
+
+           The name of the scratch file where the indexer process updates its
+           status. Default: idxstatus.txt inside the configuration directory.
+
+   maxfsoccuppc
+
+           Maximum file system occupation before we stop indexing. The value
+           is a percentage, corresponding to what the "Capacity" df output
+           column shows. The default value is 0, meaning no checking.
+
+   mboxcachedir
+
+           The directory where mbox message offsets cache files are held.
+           This is normally $RECOLL_CONFDIR/mboxcache, but it may be useful
+           to share a directory between different configurations.
+
+   mboxcacheminmbs
+
+           The minimum mbox file size over which we cache the offsets. There
+           is really no sense in caching offsets for small files. The default
+           is 5 MB.
+
+   webcachedir
+
+           This is only used by the web browser plugin indexing code, and
+           defines where the cache for visited pages will live. Default:
+           $RECOLL_CONFDIR/webcache
+
+   webcachemaxmbs
+
+           This is only used by the web browser plugin indexing code, and
+           defines the maximum size for the web page cache. Default: 40 MB.
+           Quite unfortunately, this is only taken into account when creating
+           the cache file. You need to delete the file for a change to be
+           taken into account.
+
+   idxflushmb
+
+           Threshold (megabytes of new text data) where we flush from memory
+           to disk index. Setting this can help control memory usage. A value
+           of 0 means no explicit flushing, letting Xapian use its own
+           default, which is flushing every 10000 (or XAPIAN_FLUSH_THRESHOLD)
+           documents, which gives little memory usage control, as memory
+           usage also depends on average document size. The default value is
+           10, and it is probably a bit low. If your system usually has free
+           memory, you can try higher values between 20 and 80. In my
+           experience, values beyond 100 are always counterproductive.
+
+    5.4.2.4. Parameters affecting multithread processing
+
+   The Recoll indexing process recollindex can use multiple threads to speed
+   up indexing on multiprocessor systems. The work done to index files is
+   divided in several stages and some of the stages can be executed by
+   multiple threads. The stages are:
+
+    1. File system walking: this is always performed by the main thread.
+    2. File conversion and data extraction.
+    3. Text processing (splitting, stemming, etc.)
+    4. Xapian index update.
+
+   You can also read a longer document about the transformation of Recoll
+   indexing to multithreading.
+
+   The threads configuration is controlled by two configuration file
+   parameters.
+
+   thrQSizes
+
+           This variable defines the job input queues configuration. There
+           are three possible queues for stages 2, 3 and 4, and this
+           parameter should give the queue depth for each stage (three
+           integer values). If a value of -1 is used for a given stage, no
+           queue is used, and the thread will go on performing the next
+           stage. In practise, deep queues have not been shown to increase
+           performance. A value of 0 for the first queue tells Recoll to
+           perform autoconfiguration (no need for the two other values in
+           this case) - this is the default configuration.
+
+   thrTCounts
+
+           This defines the number of threads used for each stage. If a value
+           of -1 is used for one of the queue depths, the corresponding
+           thread count is ignored. It makes no sense to use a value other
+           than 1 for the last stage because updating the Xapian index is
+           necessarily single-threaded (and protected by a mutex).
+
+   The following example would use three queues (of depth 2), and 4 threads
+   for converting source documents, 2 for processing their text, and one to
+   update the index. This was tested to be the best configuration on the test
+   system (quadri-processor with multiple disks).
+
+ thrQSizes = 2 2 2
+ thrTCounts =  4 2 1
+
+   The following example would use a single queue, and the complete
+   processing for each document would be performed by a single thread
+   (several documents will still be processed in parallel in most cases). The
+   threads will use mutual exclusion when entering the index update stage. In
+   practise the performance would be close to the precedent case in general,
+   but worse in certain cases (e.g. a Zip archive would be performed purely
+   sequentially), so the previous approach is preferred. YMMV... The 2 last
+   values for thrTCounts are ignored.
+
+ thrQSizes = 2 -1 -1
+ thrTCounts =  6 1 1
+
+   The following example would disable multithreading. Indexing will be
+   performed by a single thread.
+
+ thrQSizes = -1 -1 -1
+
+    5.4.2.5. Miscellaneous parameters:
+
+   autodiacsens
+
+           IF the index is not stripped, decide if we automatically trigger
+           diacritics sensitivity if the search term has accented characters
+           (not in unac_except_trans). Else you need to use the query
+           language and the D modifier to specify diacritics sensitivity.
+           Default is no.
+
+   autocasesens
+
+           IF the index is not stripped, decide if we automatically trigger
+           character case sensitivity if the search term has upper-case
+           characters in any but the first position. Else you need to use the
+           query language and the C modifier to specify character-case
+           sensitivity. Default is yes.
+
+   loglevel,daemloglevel
+
+           Verbosity level for recoll and recollindex. A value of 4 lists
+           quite a lot of debug/information messages. 2 only lists errors.
+           The daemversion is specific to the indexing monitor daemon.
+
+   logfilename, daemlogfilename
+
+           Where the messages should go. 'stderr' can be used as a special
+           value, and is the default. The daemversion is specific to the
+           indexing monitor daemon.
+
+   checkneedretryindexscript
+
+           This defines the name for a command executed by recollindex when
+           starting indexing. If the exit status of the command is 0,
+           recollindex retries to index all files which previously could not
+           be indexed because of data extraction errors. The default value is
+           a script which checks if any of the common bin directories have
+           changed (indicating that a helper program may have been
+           installed).
+
+   mondelaypatterns
+
+           This allows specify wildcard path patterns (processed with
+           fnmatch(3) with 0 flag), to match files which change too often and
+           for which a delay should be observed before re-indexing. This is a
+           space-separated list, each entry being a pattern and a time in
+           seconds, separated by a colon. You can use double quotes if a path
+           entry contains white space. Example:
+
+ mondelaypatterns = *.log:20 "this one has spaces*:10"
+              
+
+   monixinterval
+
+           Minimum interval (seconds) for processing the indexing queue. The
+           real time monitor does not process each event when it comes in,
+           but will wait this time for the queue to accumulate to diminish
+           overhead and in order to aggregate multiple events to the same
+           file. Default 30 S.
+
+   monauxinterval
+
+           Period (in seconds) at which the real time monitor will regenerate
+           the auxiliary databases (spelling, stemming) if needed. The
+           default is one hour.
+
+   monioniceclass, monioniceclassdata
+
+           These allow defining the ionice class and data used by the indexer
+           (default class 3, no data).
+
+   filtermaxseconds
+
+           Maximum handler execution time, after which it is aborted. Some
+           postscript programs just loop...
+
+   filtermaxmbytes
+
+           Recoll 1.20.7 and later. Maximum handler memory utilisation. This
+           uses setrlimit(RLIMIT_AS) on most systems (total virtual memory
+           space size limit). Some programs may start with 500 MBytes of
+           mapped shared libraries, so take this into account when choosing a
+           value. The default is a liberal 2000MB.
+
+   filtersdir
+
+           A directory to search for the external input handler scripts used
+           to index some types of files. The value should not be changed,
+           except if you want to modify one of the default scripts. The value
+           can be redefined for any sub-directory.
+
+   iconsdir
+
+           The name of the directory where recoll result list icons are
+           stored. You can change this if you want different images.
+
+   idxabsmlen
+
+           Recoll stores an abstract for each indexed file inside the
+           database. The text can come from an actual 'abstract' section in
+           the document or will just be the beginning of the document. It is
+           stored in the index so that it can be displayed inside the result
+           lists without decoding the original file. The idxabsmlen parameter
+           defines the size of the stored abstract. The default value is 250
+           bytes. The search interface gives you the choice to display this
+           stored text or a synthetic abstract built by extracting text
+           around the search terms. If you always prefer the synthetic
+           abstract, you can reduce this value and save a little space.
+
+   idxmetastoredlen
+
+           Maximum stored length for metadata fields. This does not affect
+           indexing (the whole field is processed anyway), just the amount of
+           data stored in the index for the purpose of displaying fields
+           inside result lists or previews. The default value is 150 bytes
+           which may be too low if you have custom fields.
+
+   aspellLanguage
+
+           Language definitions to use when creating the aspell dictionary.
+           The value must match a set of aspell language definition files.
+           You can type "aspell config" to see where these are installed
+           (look for data-dir). The default if the variable is not set is to
+           use your desktop national language environment to guess the value.
+
+   noaspell
+
+           If this is set, the aspell dictionary generation is turned off.
+           Useful for cases where you don't need the functionality or when it
+           is unusable because aspell crashes during dictionary generation.
+
+   mhmboxquirks
+
+           This allows definining location-related quirks for the mailbox
+           handler. Currently only the tbird flag is defined, and it should
+           be set for directories which hold Thunderbird data, as their
+           folder format is weird.
+
+  5.4.3. The fields file
+
+   This file contains information about dynamic fields handling in Recoll.
+   Some very basic fields have hard-wired behaviour, and, mostly, you should
+   not change the original data inside the fields file. But you can create
+   custom fields fitting your data and handle them just like they were native
+   ones.
+
+   The fields file has several sections, which each define an aspect of
+   fields processing. Quite often, you'll have to modify several sections to
+   obtain the desired behaviour.
+
+   We will only give a short description here, you should refer to the
+   comments inside the default file for more detailed information.
+
+   Field names should be lowercase alphabetic ASCII.
+
+   [prefixes]
+
+           A field becomes indexed (searchable) by having a prefix defined in
+           this section.
+
+   [stored]
+
+           A field becomes stored (displayable inside results) by having its
+           name listed in this section (typically with an empty value).
+
+   [aliases]
+
+           This section defines lists of synonyms for the canonical names
+           used inside the [prefixes] and [stored] sections
+
+   [queryaliases]
+
+           This section also defines aliases for the canonic field names,
+           with the difference that the substitution will only be used at
+           query time, avoiding any possibility that the value would pick-up
+           random metadata from documents.
+
+   handler-specific sections
+
+           Some input handlers may need specific configuration for handling
+           fields. Only the email message handler currently has such a
+           section (named [mail]). It allows indexing arbitrary email headers
+           in addition to the ones indexed by default. Other such sections
+           may appear in the future.
+
+   Here follows a small example of a personal fields file. This would extract
+   a specific email header and use it as a searchable field, with data
+   displayable inside result lists. (Side note: as the email handler does no
+   decoding on the values, only plain ascii headers can be indexed, and only
+   the first occurrence will be used for headers that occur several times).
+
+ [prefixes]
+ # Index mailmytag contents (with the given prefix)
+ mailmytag = XMTAG
+
+ [stored]
+ # Store mailmytag inside the document data record (so that it can be
+ # displayed - as %(mailmytag) - in result lists).
+ mailmytag =
+
+ [queryaliases]
+ filename = fn
+ containerfilename = cfn
+
+ [mail]
+ # Extract the X-My-Tag mail header, and use it internally with the
+ # mailmytag field name
+ x-my-tag = mailmytag
+
+    5.4.3.1. Extended attributes in the fields file
+
+   Recoll versions 1.19 and later process user extended file attributes as
+   documents fields by default.
+
+   Attributes are processed as fields of the same name, after removing the
+   user prefix on Linux.
+
+   The [xattrtofields] section of the fields file allows specifying
+   translations from extended attributes names to Recoll field names. An
+   empty translation disables use of the corresponding attribute data.
+
+  5.4.4. The mimemap file
+
+   mimemap specifies the file name extension to MIME type mappings.
+
+   For file names without an extension, or with an unknown one, the system's
+   file -i command will be executed to determine the MIME type (this can be
+   switched off inside the main configuration file).
+
+   The mappings can be specified on a per-subtree basis, which may be useful
+   in some cases. Example: gaim logs have a .txt extension but should be
+   handled specially, which is possible because they are usually all located
+   in one place.
+
+   The recoll_noindex mimemap variable has been moved to recoll.conf and
+   renamed to noContentSuffixes, while keeping the same function, as of
+   Recoll version 1.21. For older Recoll versions, see the documentation for
+   noContentSuffixes but use recoll_noindex in mimemap.
+
+  5.4.5. The mimeconf file
+
+   mimeconf specifies how the different MIME types are handled for indexing,
+   and which icons are displayed in the recoll result lists.
+
+   Changing the parameters in the [index] section is probably not a good idea
+   except if you are a Recoll developer.
+
+   The [icons] section allows you to change the icons which are displayed by
+   recoll in the result lists (the values are the basenames of the png images
+   inside the iconsdir directory (specified in recoll.conf).
+
+  5.4.6. The mimeview file
+
+   mimeview specifies which programs are started when you click on an Open
+   link in a result list. Ie: HTML is normally displayed using firefox, but
+   you may prefer Konqueror, your openoffice.org program might be named
+   oofice instead of openoffice etc.
+
+   Changes to this file can be done by direct editing, or through the recoll
+   GUI preferences dialog.
+
+   If Use desktop preferences to choose document editor is checked in the
+   Recoll GUI preferences, all mimeview entries will be ignored except the
+   one labelled application/x-all (which is set to use xdg-open by default).
+
+   In this case, the xallexcepts top level variable defines a list of MIME
+   type exceptions which will be processed according to the local entries
+   instead of being passed to the desktop. This is so that specific Recoll
+   options such as a page number or a search string can be passed to
+   applications that support them, such as the evince viewer.
+
+   As for the other configuration files, the normal usage is to have a
+   mimeview inside your own configuration directory, with just the
+   non-default entries, which will override those from the central
+   configuration file.
+
+   All viewer definition entries must be placed under a [view] section.
+
+   The keys in the file are normally MIME types. You can add an application
+   tag to specialize the choice for an area of the filesystem (using a
+   localfields specification in mimeconf). The syntax for the key is
+   mimetype|tag
+
+   The nouncompforviewmts entry, (placed at the top level, outside of the
+   [view] section), holds a list of MIME types that should not be
+   uncompressed before starting the viewer (if they are found compressed, ie:
+   mydoc.doc.gz).
+
+   The right side of each assignment holds a command to be executed for
+   opening the file. The following substitutions are performed:
+
+     o %D. Document date
+
+     o %f. File name. This may be the name of a temporary file if it was
+       necessary to create one (ie: to extract a subdocument from a
+       container).
+
+     o %i. Internal path, for subdocuments of containers. The format depends
+       on the container type. If this appears in the command line, Recoll
+       will not create a temporary file to extract the subdocument, expecting
+       the called application (possibly a script) to be able to handle it.
+
+     o %M. MIME type
+
+     o %p. Page index. Only significant for a subset of document types,
+       currently only PDF, Postscript and DVI files. Can be used to start the
+       editor at the right page for a match or snippet.
+
+     o %s. Search term. The value will only be set for documents with indexed
+       page numbers (ie: PDF). The value will be one of the matched search
+       terms. It would allow pre-setting the value in the "Find" entry inside
+       Evince for example, for easy highlighting of the term.
+
+     o %u. Url.
+
+   In addition to the predefined values above, all strings like %(fieldname)
+   will be replaced by the value of the field named fieldname for the
+   document. This could be used in combination with field customisation to
+   help with opening the document.
+
+  5.4.7. The ptrans file
+
+   ptrans specifies query-time path translations. These can be useful in
+   multiple cases.
+
+   The file has a section for any index which needs translations, either the
+   main one or additional query indexes. The sections are named with the
+   Xapian index directory names. No slash character should exist at the end
+   of the paths (all comparisons are textual). An exemple should make things
+   sufficiently clear
+
+           [/home/me/.recoll/xapiandb]
+           /this/directory/moved = /to/this/place
+
+           [/path/to/additional/xapiandb]
+           /server/volume1/docdir = /net/server/volume1/docdir
+           /server/volume2/docdir = /net/server/volume2/docdir
+        
+
+  5.4.8. Examples of configuration adjustments
+
+    5.4.8.1. Adding an external viewer for an non-indexed type
+
+   Imagine that you have some kind of file which does not have indexable
+   content, but for which you would like to have a functional Open link in
+   the result list (when found by file name). The file names end in .blob and
+   can be displayed by application blobviewer.
+
+   You need two entries in the configuration files for this to work:
+
+     o In $RECOLL_CONFDIR/mimemap (typically ~/.recoll/mimemap), add the
+       following line:
+
+ .blob = application/x-blobapp
+
+       Note that the MIME type is made up here, and you could call it
+       diesel/oil just the same.
+
+     o In $RECOLL_CONFDIR/mimeview under the [view] section, add:
+
+ application/x-blobapp = blobviewer %f
+
+       We are supposing that blobviewer wants a file name parameter here, you
+       would use %u if it liked URLs better.
+
+   If you just wanted to change the application used by Recoll to display a
+   MIME type which it already knows, you would just need to edit mimeview.
+   The entries you add in your personal file override those in the central
+   configuration, which you do not need to alter. mimeview can also be
+   modified from the Gui.
+
+    5.4.8.2. Adding indexing support for a new file type
+
+   Let us now imagine that the above .blob files actually contain indexable
+   text and that you know how to extract it with a command line program.
+   Getting Recoll to index the files is easy. You need to perform the above
+   alteration, and also to add data to the mimeconf file (typically in
+   ~/.recoll/mimeconf):
+
+     o Under the [index] section, add the following line (more about the
+       rclblob indexing script later):
+
+ application/x-blobapp = exec rclblob
+
+     o Under the [icons] section, you should choose an icon to be displayed
+       for the files inside the result lists. Icons are normally 64x64 pixels
+       PNG files which live in /usr/[local/]share/recoll/images.
+
+     o Under the [categories] section, you should add the MIME type where it
+       makes sense (you can also create a category). Categories may be used
+       for filtering in advanced search.
+
+   The rclblob handler should be an executable program or script which exists
+   inside /usr/[local/]share/recoll/filters. It will be given a file name as
+   argument and should output the text or html contents on the standard
+   output.
+
+   The filter programming section describes in more detail how to write an
+   input handler.
diff --git a/src/VERSION b/src/VERSION
new file mode 100644
index 00000000..57807d6d
--- /dev/null
+++ b/src/VERSION
@@ -0,0 +1 @@
+1.22.0
diff --git a/src/aspell/Makefile b/src/aspell/Makefile
new file mode 100644
index 00000000..598acfca
--- /dev/null
+++ b/src/aspell/Makefile
@@ -0,0 +1,12 @@
+PROGS = rclaspell
+all: $(PROGS)
+
+RCLASPELL_OBJS= trrclaspell.o 
+rclaspell : $(RCLASPELL_OBJS)
+	$(CXX) $(ALL_CXXFLAGS) -o rclaspell $(RCLASPELL_OBJS) \
+          $(LIBRECOLL)
+trrclaspell.o : rclaspell.cpp
+	$(CXX) $(ALL_CXXFLAGS) -DTEST_RCLASPELL -c -o trrclaspell.o \
+	       rclaspell.cpp
+
+include ../utils/utmkdefs.mk
diff --git a/src/aspell/aspell-local.h b/src/aspell/aspell-local.h
new file mode 100644
index 00000000..421c9380
--- /dev/null
+++ b/src/aspell/aspell-local.h
@@ -0,0 +1,729 @@
+/* Automatically generated file.  Do not edit directly. */
+
+/* This file is part of The New Aspell
+ * Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL
+ * license version 2.0 or 2.1.  You should have received a copy of the
+ * LGPL license along with this library if you did not you can find it
+ * at http://www.gnu.org/.                                              */
+
+#ifndef ASPELL_ASPELL__H
+#define ASPELL_ASPELL__H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************* type id *******************************/
+
+
+union AspellTypeId {
+
+  unsigned int num;
+
+  char str[4];
+
+};
+
+
+typedef union AspellTypeId AspellTypeId;
+
+
+/************************** mutable container **************************/
+
+
+typedef struct AspellMutableContainer AspellMutableContainer;
+
+
+int aspell_mutable_container_add(struct AspellMutableContainer * ths, const char * to_add);
+
+int aspell_mutable_container_remove(struct AspellMutableContainer * ths, const char * to_rem);
+
+void aspell_mutable_container_clear(struct AspellMutableContainer * ths);
+
+struct AspellMutableContainer * aspell_mutable_container_to_mutable_container(struct AspellMutableContainer * ths);
+
+
+
+/******************************* key info *******************************/
+
+
+
+enum AspellKeyInfoType {AspellKeyInfoString, AspellKeyInfoInt, AspellKeyInfoBool, AspellKeyInfoList};
+typedef enum AspellKeyInfoType AspellKeyInfoType;
+
+
+struct AspellKeyInfo {
+
+  /* The name of the key. */
+  const char * name;
+
+  /* The key type. */
+  enum AspellKeyInfoType type;
+
+  /* The default value of the key. */
+  const char * def;
+
+  /* A brief description of the key or NULL if internal value. */
+  const char * desc;
+
+  int flags;
+
+  int other_data;
+
+};
+
+
+typedef struct AspellKeyInfo AspellKeyInfo;
+
+
+/******************************** config ********************************/
+
+
+typedef struct AspellKeyInfoEnumeration AspellKeyInfoEnumeration;
+
+
+int aspell_key_info_enumeration_at_end(const struct AspellKeyInfoEnumeration * ths);
+
+const struct AspellKeyInfo * aspell_key_info_enumeration_next(struct AspellKeyInfoEnumeration * ths);
+
+void delete_aspell_key_info_enumeration(struct AspellKeyInfoEnumeration * ths);
+
+struct AspellKeyInfoEnumeration * aspell_key_info_enumeration_clone(const struct AspellKeyInfoEnumeration * ths);
+
+void aspell_key_info_enumeration_assign(struct AspellKeyInfoEnumeration * ths, const struct AspellKeyInfoEnumeration * other);
+
+
+
+typedef struct AspellConfig AspellConfig;
+
+
+struct AspellConfig * new_aspell_config();
+
+void delete_aspell_config(struct AspellConfig * ths);
+
+struct AspellConfig * aspell_config_clone(const struct AspellConfig * ths);
+
+void aspell_config_assign(struct AspellConfig * ths, const struct AspellConfig * other);
+
+unsigned int aspell_config_error_number(const struct AspellConfig * ths);
+
+const char * aspell_config_error_message(const struct AspellConfig * ths);
+
+const struct AspellError * aspell_config_error(const struct AspellConfig * ths);
+
+/* Sets extra keys which this config class should
+ * accept. begin and end are expected to point to
+ * the beginning and ending of an array of Aspell
+ * Key Info. */
+void aspell_config_set_extra(struct AspellConfig * ths, const struct AspellKeyInfo * begin, const struct AspellKeyInfo * end);
+
+/* Returns the KeyInfo object for the
+ * corresponding key or returns NULL and sets
+ * error_num to PERROR_UNKNOWN_KEY if the key is
+ * not valid. The pointer returned is valid for
+ * the lifetime of the object. */
+const struct AspellKeyInfo * aspell_config_keyinfo(struct AspellConfig * ths, const char * key);
+
+/* Returns a newly allocated enumeration of all
+ * the possible objects this config class uses. */
+struct AspellKeyInfoEnumeration * aspell_config_possible_elements(struct AspellConfig * ths, int include_extra);
+
+/* Returns the default value for given key which
+ * may involve substituting variables, thus it is
+ * not the same as keyinfo(key)->def returns NULL
+ * and sets error_num to PERROR_UNKNOWN_KEY if
+ * the key is not valid. Uses the temporary
+ * string. */
+const char * aspell_config_get_default(struct AspellConfig * ths, const char * key);
+
+/* Returns a newly allocated enumeration of all
+ * the key/value pairs. This DOES not include ones
+ * which are set to their default values. */
+struct AspellStringPairEnumeration * aspell_config_elements(struct AspellConfig * ths);
+
+/* Inserts an item, if the item already exists it
+ * will be replaced. Returns TRUE if it succeeded
+ * or FALSE on error. If the key in not valid it
+ * sets error_num to PERROR_UNKNOWN_KEY, if the
+ * value is not valid it will set error_num to
+ * PERROR_BAD_VALUE, if the value can not be
+ * changed it sets error_num to
+ * PERROR_CANT_CHANGE_VALUE, and if the value is
+ * a list and you are trying to set its directory,
+ * it sets error_num to PERROR_LIST_SET */
+int aspell_config_replace(struct AspellConfig * ths, const char * key, const char * value);
+
+/* Remove a key and returns TRUE if it exists
+ * otherwise return FALSE. This effectively sets
+ * the key to its default value. Calling replace
+ * with a value of "" will also call
+ * remove. If the key does not exist then it sets
+ * error_num to 0 or PERROR_NOT, if the key is
+ * not valid then it sets error_num to
+ * PERROR_UNKNOWN_KEY, if the value can not be
+ * changed then it sets error_num to
+ * PERROR_CANT_CHANGE_VALUE */
+int aspell_config_remove(struct AspellConfig * ths, const char * key);
+
+int aspell_config_have(const struct AspellConfig * ths, const char * key);
+
+/* Returns NULL on error. */
+const char * aspell_config_retrieve(struct AspellConfig * ths, const char * key);
+
+int aspell_config_retrieve_list(struct AspellConfig * ths, const char * key, struct AspellMutableContainer * lst);
+
+/* Return -1 on error, 0 if false, 1 if true. */
+int aspell_config_retrieve_bool(struct AspellConfig * ths, const char * key);
+
+/* Return -1 on error. */
+int aspell_config_retrieve_int(struct AspellConfig * ths, const char * key);
+
+
+
+/******************************** error ********************************/
+
+
+struct AspellError {
+
+  const char * mesg;
+
+  const struct AspellErrorInfo * err;
+
+};
+
+
+typedef struct AspellError AspellError;
+
+int aspell_error_is_a(const struct AspellError * ths, const struct AspellErrorInfo * e);
+
+
+struct AspellErrorInfo {
+
+  const struct AspellErrorInfo * isa;
+
+  const char * mesg;
+
+  unsigned int num_parms;
+
+  const char * parms[3];
+
+};
+
+
+typedef struct AspellErrorInfo AspellErrorInfo;
+
+
+/**************************** can have error ****************************/
+
+
+typedef struct AspellCanHaveError AspellCanHaveError;
+
+
+unsigned int aspell_error_number(const struct AspellCanHaveError * ths);
+
+const char * aspell_error_message(const struct AspellCanHaveError * ths);
+
+const struct AspellError * aspell_error(const struct AspellCanHaveError * ths);
+
+void delete_aspell_can_have_error(struct AspellCanHaveError * ths);
+
+
+
+/******************************** errors ********************************/
+
+
+extern const struct AspellErrorInfo * const aerror_other;
+extern const struct AspellErrorInfo * const aerror_operation_not_supported;
+extern const struct AspellErrorInfo * const   aerror_cant_copy;
+extern const struct AspellErrorInfo * const   aerror_unimplemented_method;
+extern const struct AspellErrorInfo * const aerror_file;
+extern const struct AspellErrorInfo * const   aerror_cant_open_file;
+extern const struct AspellErrorInfo * const     aerror_cant_read_file;
+extern const struct AspellErrorInfo * const     aerror_cant_write_file;
+extern const struct AspellErrorInfo * const   aerror_invalid_name;
+extern const struct AspellErrorInfo * const   aerror_bad_file_format;
+extern const struct AspellErrorInfo * const aerror_dir;
+extern const struct AspellErrorInfo * const   aerror_cant_read_dir;
+extern const struct AspellErrorInfo * const aerror_config;
+extern const struct AspellErrorInfo * const   aerror_unknown_key;
+extern const struct AspellErrorInfo * const   aerror_cant_change_value;
+extern const struct AspellErrorInfo * const   aerror_bad_key;
+extern const struct AspellErrorInfo * const   aerror_bad_value;
+extern const struct AspellErrorInfo * const   aerror_duplicate;
+extern const struct AspellErrorInfo * const   aerror_key_not_string;
+extern const struct AspellErrorInfo * const   aerror_key_not_int;
+extern const struct AspellErrorInfo * const   aerror_key_not_bool;
+extern const struct AspellErrorInfo * const   aerror_key_not_list;
+extern const struct AspellErrorInfo * const   aerror_no_value_reset;
+extern const struct AspellErrorInfo * const   aerror_no_value_enable;
+extern const struct AspellErrorInfo * const   aerror_no_value_disable;
+extern const struct AspellErrorInfo * const   aerror_no_value_clear;
+extern const struct AspellErrorInfo * const aerror_language_related;
+extern const struct AspellErrorInfo * const   aerror_unknown_language;
+extern const struct AspellErrorInfo * const   aerror_unknown_soundslike;
+extern const struct AspellErrorInfo * const   aerror_language_not_supported;
+extern const struct AspellErrorInfo * const   aerror_no_wordlist_for_lang;
+extern const struct AspellErrorInfo * const   aerror_mismatched_language;
+extern const struct AspellErrorInfo * const aerror_affix;
+extern const struct AspellErrorInfo * const   aerror_corrupt_affix;
+extern const struct AspellErrorInfo * const   aerror_invalid_cond;
+extern const struct AspellErrorInfo * const   aerror_invalid_cond_strip;
+extern const struct AspellErrorInfo * const   aerror_incorrect_encoding;
+extern const struct AspellErrorInfo * const aerror_encoding;
+extern const struct AspellErrorInfo * const   aerror_unknown_encoding;
+extern const struct AspellErrorInfo * const   aerror_encoding_not_supported;
+extern const struct AspellErrorInfo * const   aerror_conversion_not_supported;
+extern const struct AspellErrorInfo * const aerror_pipe;
+extern const struct AspellErrorInfo * const   aerror_cant_create_pipe;
+extern const struct AspellErrorInfo * const   aerror_process_died;
+extern const struct AspellErrorInfo * const aerror_bad_input;
+extern const struct AspellErrorInfo * const   aerror_invalid_string;
+extern const struct AspellErrorInfo * const   aerror_invalid_word;
+extern const struct AspellErrorInfo * const   aerror_invalid_affix;
+extern const struct AspellErrorInfo * const   aerror_inapplicable_affix;
+extern const struct AspellErrorInfo * const   aerror_unknown_unichar;
+extern const struct AspellErrorInfo * const   aerror_word_list_flags;
+extern const struct AspellErrorInfo * const     aerror_invalid_flag;
+extern const struct AspellErrorInfo * const     aerror_conflicting_flags;
+extern const struct AspellErrorInfo * const aerror_version_control;
+extern const struct AspellErrorInfo * const   aerror_bad_version_string;
+extern const struct AspellErrorInfo * const aerror_filter;
+extern const struct AspellErrorInfo * const   aerror_cant_dlopen_file;
+extern const struct AspellErrorInfo * const   aerror_empty_filter;
+extern const struct AspellErrorInfo * const   aerror_no_such_filter;
+extern const struct AspellErrorInfo * const   aerror_confusing_version;
+extern const struct AspellErrorInfo * const   aerror_bad_version;
+extern const struct AspellErrorInfo * const   aerror_identical_option;
+extern const struct AspellErrorInfo * const   aerror_options_only;
+extern const struct AspellErrorInfo * const   aerror_invalid_option_modifier;
+extern const struct AspellErrorInfo * const   aerror_cant_describe_filter;
+extern const struct AspellErrorInfo * const aerror_filter_mode_file;
+extern const struct AspellErrorInfo * const   aerror_mode_option_name;
+extern const struct AspellErrorInfo * const   aerror_no_filter_to_option;
+extern const struct AspellErrorInfo * const   aerror_bad_mode_key;
+extern const struct AspellErrorInfo * const   aerror_expect_mode_key;
+extern const struct AspellErrorInfo * const   aerror_mode_version_requirement;
+extern const struct AspellErrorInfo * const   aerror_confusing_mode_version;
+extern const struct AspellErrorInfo * const   aerror_bad_mode_version;
+extern const struct AspellErrorInfo * const   aerror_missing_magic_expression;
+extern const struct AspellErrorInfo * const   aerror_empty_file_ext;
+extern const struct AspellErrorInfo * const aerror_filter_mode_expand;
+extern const struct AspellErrorInfo * const   aerror_unknown_mode;
+extern const struct AspellErrorInfo * const   aerror_mode_extend_expand;
+extern const struct AspellErrorInfo * const aerror_filter_mode_magic;
+extern const struct AspellErrorInfo * const   aerror_file_magic_pos;
+extern const struct AspellErrorInfo * const   aerror_file_magic_range;
+extern const struct AspellErrorInfo * const   aerror_missing_magic;
+extern const struct AspellErrorInfo * const   aerror_bad_magic;
+extern const struct AspellErrorInfo * const aerror_expression;
+extern const struct AspellErrorInfo * const   aerror_invalid_expression;
+
+
+/******************************* speller *******************************/
+
+
+typedef struct AspellSpeller AspellSpeller;
+
+
+struct AspellCanHaveError * new_aspell_speller(struct AspellConfig * config);
+
+struct AspellSpeller * to_aspell_speller(struct AspellCanHaveError * obj);
+
+void delete_aspell_speller(struct AspellSpeller * ths);
+
+unsigned int aspell_speller_error_number(const struct AspellSpeller * ths);
+
+const char * aspell_speller_error_message(const struct AspellSpeller * ths);
+
+const struct AspellError * aspell_speller_error(const struct AspellSpeller * ths);
+
+struct AspellConfig * aspell_speller_config(struct AspellSpeller * ths);
+
+/* Returns 0 if it is not in the dictionary,
+ * 1 if it is, or -1 on error. */
+int aspell_speller_check(struct AspellSpeller * ths, const char * word, int word_size);
+
+/* Add this word to your own personal word list. */
+int aspell_speller_add_to_personal(struct AspellSpeller * ths, const char * word, int word_size);
+
+/* Add this word to the current spelling session. */
+int aspell_speller_add_to_session(struct AspellSpeller * ths, const char * word, int word_size);
+
+/* This is your own personal word list file plus
+ * any extra words added during this session to
+ * your own personal word list. */
+const struct AspellWordList * aspell_speller_personal_word_list(struct AspellSpeller * ths);
+
+/* This is a list of words added to this session
+ * that are not in the main word list or in your
+ * own personal list but are considered valid for
+ * this spelling session. */
+const struct AspellWordList * aspell_speller_session_word_list(struct AspellSpeller * ths);
+
+/* This is the main list of words used during this
+ * spelling session. */
+const struct AspellWordList * aspell_speller_main_word_list(struct AspellSpeller * ths);
+
+int aspell_speller_save_all_word_lists(struct AspellSpeller * ths);
+
+int aspell_speller_clear_session(struct AspellSpeller * ths);
+
+/* Return NULL on error.
+ * The word list returned by suggest is only
+ * valid until the next call to suggest. */
+const struct AspellWordList * aspell_speller_suggest(struct AspellSpeller * ths, const char * word, int word_size);
+
+int aspell_speller_store_replacement(struct AspellSpeller * ths, const char * mis, int mis_size, const char * cor, int cor_size);
+
+
+
+/******************************** filter ********************************/
+
+
+typedef struct AspellFilter AspellFilter;
+
+
+void delete_aspell_filter(struct AspellFilter * ths);
+
+unsigned int aspell_filter_error_number(const struct AspellFilter * ths);
+
+const char * aspell_filter_error_message(const struct AspellFilter * ths);
+
+const struct AspellError * aspell_filter_error(const struct AspellFilter * ths);
+
+struct AspellFilter * to_aspell_filter(struct AspellCanHaveError * obj);
+
+
+
+/*************************** document checker ***************************/
+
+
+struct AspellToken {
+
+  unsigned int offset;
+
+  unsigned int len;
+
+};
+
+
+typedef struct AspellToken AspellToken;
+
+
+typedef struct AspellDocumentChecker AspellDocumentChecker;
+
+
+void delete_aspell_document_checker(struct AspellDocumentChecker * ths);
+
+unsigned int aspell_document_checker_error_number(const struct AspellDocumentChecker * ths);
+
+const char * aspell_document_checker_error_message(const struct AspellDocumentChecker * ths);
+
+const struct AspellError * aspell_document_checker_error(const struct AspellDocumentChecker * ths);
+
+/* Creates a new document checker.
+ * The speller class is expected to last until
+ * this class is destroyed.
+ * If config is given it will be used to override
+ * any relevent options set by this speller class.
+ * The config class is not once this function is done.
+ * If filter is given then it will take ownership of
+ * the filter class and use it to do the filtering.
+ * You are expected to free the checker when done. */
+struct AspellCanHaveError * new_aspell_document_checker(struct AspellSpeller * speller);
+
+struct AspellDocumentChecker * to_aspell_document_checker(struct AspellCanHaveError * obj);
+
+/* Reset the internal state of the filter.
+ * Should be called whenever a new document is
+ * being filtered. */
+void aspell_document_checker_reset(struct AspellDocumentChecker * ths);
+
+/* Process a string.
+ * The string passed in should only be split on
+ * white space characters.  Furthermore, between
+ * calls to reset, each string should be passed
+ * in exactly once and in the order they appeared
+ * in the document.  Passing in strings out of
+ * order, skipping strings or passing them in
+ * more than once may lead to undefined results. */
+void aspell_document_checker_process(struct AspellDocumentChecker * ths, const char * str, int size);
+
+/* Returns the next misspelled word in the
+ * processed string.  If there are no more
+ * misspelled words, then token.word will be
+ * NULL and token.size will be 0 */
+struct AspellToken aspell_document_checker_next_misspelling(struct AspellDocumentChecker * ths);
+
+/* Returns the underlying filter class. */
+struct AspellFilter * aspell_document_checker_filter(struct AspellDocumentChecker * ths);
+
+
+
+/****************************** word list ******************************/
+
+
+typedef struct AspellWordList AspellWordList;
+
+
+int aspell_word_list_empty(const struct AspellWordList * ths);
+
+unsigned int aspell_word_list_size(const struct AspellWordList * ths);
+
+struct AspellStringEnumeration * aspell_word_list_elements(const struct AspellWordList * ths);
+
+
+
+/************************** string enumeration **************************/
+
+
+typedef struct AspellStringEnumeration AspellStringEnumeration;
+
+
+void delete_aspell_string_enumeration(struct AspellStringEnumeration * ths);
+
+struct AspellStringEnumeration * aspell_string_enumeration_clone(const struct AspellStringEnumeration * ths);
+
+void aspell_string_enumeration_assign(struct AspellStringEnumeration * ths, const struct AspellStringEnumeration * other);
+
+int aspell_string_enumeration_at_end(const struct AspellStringEnumeration * ths);
+
+const char * aspell_string_enumeration_next(struct AspellStringEnumeration * ths);
+
+
+
+/********************************* info *********************************/
+
+
+struct AspellModuleInfo {
+
+  const char * name;
+
+  double order_num;
+
+  const char * lib_dir;
+
+  struct AspellStringList * dict_dirs;
+
+  struct AspellStringList * dict_exts;
+
+};
+
+
+typedef struct AspellModuleInfo AspellModuleInfo;
+
+
+struct AspellDictInfo {
+
+  /* The Name to identify this dictionary by. */
+  const char * name;
+
+  /* The language code to identify this dictionary.
+   * A two letter UPPER-CASE ISO 639 language code
+   * and an optional two letter ISO 3166 country
+   * code after a dash or underscore. */
+  const char * code;
+
+  /* Any extra information to distinguish this
+   * variety of dictionary from other dictionaries
+   * which may have the same language and size. */
+  const char * jargon;
+
+  int size;
+
+  /* A two char digit code describing the size of
+   * the dictionary: 10=tiny, 20=really small,
+   * 30=small, 40=med-small, 50=med, 60=med-large,
+   * 70=large, 80=huge, 90=insane.  Please check
+   * the README in aspell-lang-200?????.tar.bz2 or
+   * see SCOWL (http://wordlist.sourceforge.net)
+   * for an example of how these sizes are used. */
+  const char * size_str;
+
+  struct AspellModuleInfo * module;
+
+};
+
+
+typedef struct AspellDictInfo AspellDictInfo;
+
+
+typedef struct AspellModuleInfoList AspellModuleInfoList;
+
+
+struct AspellModuleInfoList * get_aspell_module_info_list(struct AspellConfig * config);
+
+int aspell_module_info_list_empty(const struct AspellModuleInfoList * ths);
+
+unsigned int aspell_module_info_list_size(const struct AspellModuleInfoList * ths);
+
+struct AspellModuleInfoEnumeration * aspell_module_info_list_elements(const struct AspellModuleInfoList * ths);
+
+
+
+typedef struct AspellDictInfoList AspellDictInfoList;
+
+
+struct AspellDictInfoList * get_aspell_dict_info_list(struct AspellConfig * config);
+
+int aspell_dict_info_list_empty(const struct AspellDictInfoList * ths);
+
+unsigned int aspell_dict_info_list_size(const struct AspellDictInfoList * ths);
+
+struct AspellDictInfoEnumeration * aspell_dict_info_list_elements(const struct AspellDictInfoList * ths);
+
+
+
+typedef struct AspellModuleInfoEnumeration AspellModuleInfoEnumeration;
+
+
+int aspell_module_info_enumeration_at_end(const struct AspellModuleInfoEnumeration * ths);
+
+const struct AspellModuleInfo * aspell_module_info_enumeration_next(struct AspellModuleInfoEnumeration * ths);
+
+void delete_aspell_module_info_enumeration(struct AspellModuleInfoEnumeration * ths);
+
+struct AspellModuleInfoEnumeration * aspell_module_info_enumeration_clone(const struct AspellModuleInfoEnumeration * ths);
+
+void aspell_module_info_enumeration_assign(struct AspellModuleInfoEnumeration * ths, const struct AspellModuleInfoEnumeration * other);
+
+
+
+typedef struct AspellDictInfoEnumeration AspellDictInfoEnumeration;
+
+
+int aspell_dict_info_enumeration_at_end(const struct AspellDictInfoEnumeration * ths);
+
+const struct AspellDictInfo * aspell_dict_info_enumeration_next(struct AspellDictInfoEnumeration * ths);
+
+void delete_aspell_dict_info_enumeration(struct AspellDictInfoEnumeration * ths);
+
+struct AspellDictInfoEnumeration * aspell_dict_info_enumeration_clone(const struct AspellDictInfoEnumeration * ths);
+
+void aspell_dict_info_enumeration_assign(struct AspellDictInfoEnumeration * ths, const struct AspellDictInfoEnumeration * other);
+
+
+
+/***************************** string list *****************************/
+
+
+typedef struct AspellStringList AspellStringList;
+
+
+struct AspellStringList * new_aspell_string_list();
+
+int aspell_string_list_empty(const struct AspellStringList * ths);
+
+unsigned int aspell_string_list_size(const struct AspellStringList * ths);
+
+struct AspellStringEnumeration * aspell_string_list_elements(const struct AspellStringList * ths);
+
+int aspell_string_list_add(struct AspellStringList * ths, const char * to_add);
+
+int aspell_string_list_remove(struct AspellStringList * ths, const char * to_rem);
+
+void aspell_string_list_clear(struct AspellStringList * ths);
+
+struct AspellMutableContainer * aspell_string_list_to_mutable_container(struct AspellStringList * ths);
+
+void delete_aspell_string_list(struct AspellStringList * ths);
+
+struct AspellStringList * aspell_string_list_clone(const struct AspellStringList * ths);
+
+void aspell_string_list_assign(struct AspellStringList * ths, const struct AspellStringList * other);
+
+
+
+/****************************** string map ******************************/
+
+
+typedef struct AspellStringMap AspellStringMap;
+
+
+struct AspellStringMap * new_aspell_string_map();
+
+int aspell_string_map_add(struct AspellStringMap * ths, const char * to_add);
+
+int aspell_string_map_remove(struct AspellStringMap * ths, const char * to_rem);
+
+void aspell_string_map_clear(struct AspellStringMap * ths);
+
+struct AspellMutableContainer * aspell_string_map_to_mutable_container(struct AspellStringMap * ths);
+
+void delete_aspell_string_map(struct AspellStringMap * ths);
+
+struct AspellStringMap * aspell_string_map_clone(const struct AspellStringMap * ths);
+
+void aspell_string_map_assign(struct AspellStringMap * ths, const struct AspellStringMap * other);
+
+int aspell_string_map_empty(const struct AspellStringMap * ths);
+
+unsigned int aspell_string_map_size(const struct AspellStringMap * ths);
+
+struct AspellStringPairEnumeration * aspell_string_map_elements(const struct AspellStringMap * ths);
+
+/* Insert a new element.
+ * Will NOT overwrite an existing entry.
+ * Returns FALSE if the element already exists. */
+int aspell_string_map_insert(struct AspellStringMap * ths, const char * key, const char * value);
+
+/* Insert a new element.
+ * Will overwrite an existing entry.
+ * Always returns TRUE. */
+int aspell_string_map_replace(struct AspellStringMap * ths, const char * key, const char * value);
+
+/* Looks up an element and returns the value.
+ * Returns NULL if the element does not exist.
+ * Returns an empty string if the element exists
+ * but has a NULL value. */
+const char * aspell_string_map_lookup(const struct AspellStringMap * ths, const char * key);
+
+
+
+/***************************** string pair *****************************/
+
+
+struct AspellStringPair {
+
+  const char * first;
+
+  const char * second;
+
+};
+
+
+typedef struct AspellStringPair AspellStringPair;
+
+
+/*********************** string pair enumeration ***********************/
+
+
+typedef struct AspellStringPairEnumeration AspellStringPairEnumeration;
+
+
+int aspell_string_pair_enumeration_at_end(const struct AspellStringPairEnumeration * ths);
+
+struct AspellStringPair aspell_string_pair_enumeration_next(struct AspellStringPairEnumeration * ths);
+
+void delete_aspell_string_pair_enumeration(struct AspellStringPairEnumeration * ths);
+
+struct AspellStringPairEnumeration * aspell_string_pair_enumeration_clone(const struct AspellStringPairEnumeration * ths);
+
+void aspell_string_pair_enumeration_assign(struct AspellStringPairEnumeration * ths, const struct AspellStringPairEnumeration * other);
+
+
+
+/******************************** cache ********************************/
+
+
+/* Reset the global cache(s) so that cache queries will
+ * create a new object. If existing objects are still in
+ * use they are not deleted. If which is NULL then all
+ * caches will be reset. Current caches are "encode",
+ * "decode", "dictionary", "language", and "keyboard". */
+int aspell_reset_cache(const char * which);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ASPELL_ASPELL__H */
diff --git a/src/aspell/rclaspell.cpp b/src/aspell/rclaspell.cpp
new file mode 100644
index 00000000..1a1f7c1f
--- /dev/null
+++ b/src/aspell/rclaspell.cpp
@@ -0,0 +1,586 @@
+#ifndef TEST_RCLASPELL
+/* Copyright (C) 2006 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include "autoconfig.h"
+#endif
+
+#ifdef RCL_USE_ASPELL
+
+#include 
+#include 
+#include 
+
+#include ASPELL_INCLUDE
+
+#include "pathut.h"
+#include "execmd.h"
+#include "rclaspell.h"
+#include "debuglog.h"
+#include "unacpp.h"
+#include "ptmutex.h"
+
+using namespace std;
+
+// Just a place where we keep the Aspell library entry points together
+class AspellApi {
+public:
+    struct AspellConfig *(*new_aspell_config)();
+    int (*aspell_config_replace)(struct AspellConfig *, const char * key, 
+				 const char * value);
+    struct AspellCanHaveError *(*new_aspell_speller)(struct AspellConfig *);
+    void (*delete_aspell_config)(struct AspellConfig *);
+    void (*delete_aspell_can_have_error)(struct AspellCanHaveError *);
+    struct AspellSpeller * (*to_aspell_speller)(struct AspellCanHaveError *);
+    struct AspellConfig * (*aspell_speller_config)(struct AspellSpeller *);
+    const struct AspellWordList * (*aspell_speller_suggest)
+	(struct AspellSpeller *, const char *, int);
+    int (*aspell_speller_check)(struct AspellSpeller *, const char *, int);
+    struct AspellStringEnumeration * (*aspell_word_list_elements)
+	(const struct AspellWordList * ths);
+    const char * (*aspell_string_enumeration_next)
+	(struct AspellStringEnumeration * ths);
+    void (*delete_aspell_string_enumeration)(struct AspellStringEnumeration *);
+    const struct AspellError *(*aspell_error)
+	(const struct AspellCanHaveError *);
+    const char *(*aspell_error_message)(const struct AspellCanHaveError *);
+    const char *(*aspell_speller_error_message)(const struct AspellSpeller *);
+    void (*delete_aspell_speller)(struct AspellSpeller *);
+
+};
+static AspellApi aapi;
+static PTMutexInit o_aapi_mutex;
+
+#define NMTOPTR(NM, TP)							\
+    if ((aapi.NM = TP dlsym(m_data->m_handle, #NM)) == 0) {		\
+	badnames += #NM + string(" ");					\
+    }
+
+static const char *aspell_lib_suffixes[] = {
+  ".so",
+  ".so.15",
+  ".so.16"
+};
+static const unsigned int nlibsuffs  = sizeof(aspell_lib_suffixes) / sizeof(char *);
+
+// Stuff that we don't wish to see in the .h (possible sysdeps, etc.)
+class AspellData {
+public:
+    AspellData() 
+        : m_handle(0), m_speller(0) 
+    {}
+    ~AspellData() {
+        LOGDEB2(("~AspellData\n"));
+	if (m_handle) {
+	    dlclose(m_handle);
+            m_handle = 0;
+        }
+        if (m_speller) {
+            // Dumps core if I do this?? 
+            //aapi.delete_aspell_speller(m_speller);
+            m_speller = 0;
+            LOGDEB2(("~AspellData: speller done\n"));
+        }
+    }
+
+    void  *m_handle;
+    string m_exec;
+    AspellSpeller *m_speller;    
+};
+
+Aspell::Aspell(RclConfig *cnf)
+    : m_config(cnf), m_data(0) 
+{
+}
+
+Aspell::~Aspell()
+{
+    deleteZ(m_data);
+}
+
+bool Aspell::init(string &reason)
+{
+    PTMutexLocker locker(o_aapi_mutex);
+    deleteZ(m_data);
+
+    // Language: we get this from the configuration, else from the NLS
+    // environment. The aspell language names used for selecting language 
+    // definition files (used to create dictionaries) are like en, fr
+    if (!m_config->getConfParam("aspellLanguage", m_lang) || m_lang.empty()) {
+	string lang = "en";
+	const char *cp;
+	if ((cp = getenv("LC_ALL")))
+	    lang = cp;
+	else if ((cp = getenv("LANG")))
+	    lang = cp;
+	if (!lang.compare("C"))
+	    lang = "en";
+	m_lang = lang.substr(0, lang.find_first_of("_"));
+    }
+
+    m_data = new AspellData;
+
+    const char *aspell_prog_from_env = getenv("ASPELL_PROG");
+    if (aspell_prog_from_env && access(aspell_prog_from_env, X_OK) == 0) {
+	m_data->m_exec = aspell_prog_from_env;
+#ifdef ASPELL_PROG
+    } else if (access(ASPELL_PROG, X_OK) == 0) {
+	m_data->m_exec = ASPELL_PROG;
+#endif // ASPELL_PROG
+    } else {
+	ExecCmd::which("aspell", m_data->m_exec);
+    }
+
+    if (m_data->m_exec.empty()) {
+	reason = "aspell program not found or not executable";
+        deleteZ(m_data);
+	return false;
+    }
+
+    reason = "Could not open shared library ";
+    string libbase("libaspell");
+    string lib;
+    for (unsigned int i = 0; i < nlibsuffs; i++) {
+        lib = libbase + aspell_lib_suffixes[i];
+        reason += string("[") + lib + "] ";
+        if ((m_data->m_handle = dlopen(lib.c_str(), RTLD_LAZY)) != 0) {
+            reason.erase();
+            goto found;
+        }
+    }
+    
+ found:
+    if (m_data->m_handle == 0) {
+        reason += string(" : ") + dlerror();
+        deleteZ(m_data);
+        return false;
+    }
+
+    string badnames;
+    NMTOPTR(new_aspell_config, (struct AspellConfig *(*)()));
+    NMTOPTR(aspell_config_replace, (int (*)(struct AspellConfig *, 
+					    const char *, const char *)));
+    NMTOPTR(new_aspell_speller, 
+	    (struct AspellCanHaveError *(*)(struct AspellConfig *)));
+    NMTOPTR(delete_aspell_config, 
+	    (void (*)(struct AspellConfig *)));
+    NMTOPTR(delete_aspell_can_have_error, 
+	    (void (*)(struct AspellCanHaveError *)));
+    NMTOPTR(to_aspell_speller, 
+	    (struct AspellSpeller *(*)(struct AspellCanHaveError *)));
+    NMTOPTR(aspell_speller_config, 
+	    (struct AspellConfig *(*)(struct AspellSpeller *)));
+    NMTOPTR(aspell_speller_suggest, 
+	    (const struct AspellWordList *(*)(struct AspellSpeller *, 
+					       const char *, int)));
+    NMTOPTR(aspell_speller_check, 
+	    (int (*)(struct AspellSpeller *, const char *, int)));
+    NMTOPTR(aspell_word_list_elements, 
+	    (struct AspellStringEnumeration *(*)
+	     (const struct AspellWordList *)));
+    NMTOPTR(aspell_string_enumeration_next, 
+	    (const char * (*)(struct AspellStringEnumeration *)));
+    NMTOPTR(delete_aspell_string_enumeration, 
+	    (void (*)(struct AspellStringEnumeration *)));
+    NMTOPTR(aspell_error, 
+	    (const struct AspellError*(*)(const struct AspellCanHaveError *)));
+    NMTOPTR(aspell_error_message,
+	    (const char *(*)(const struct AspellCanHaveError *)));
+    NMTOPTR(aspell_speller_error_message, 
+	    (const char *(*)(const struct AspellSpeller *)));
+    NMTOPTR(delete_aspell_speller, (void (*)(struct AspellSpeller *)));
+
+    if (!badnames.empty()) {
+	reason = string("Aspell::init: symbols not found:") + badnames;
+        deleteZ(m_data);
+	return false;
+    }
+
+    return true;
+}
+
+bool Aspell::ok() const
+{
+    return m_data != 0 && m_data->m_handle != 0;
+}
+
+string Aspell::dicPath()
+{
+    return path_cat(m_config->getConfDir(), 
+		    string("aspdict.") + m_lang + string(".rws"));
+}
+
+
+// The data source for the create dictionary aspell command. We walk
+// the term list, filtering out things that are probably not words.
+// Note that the manual for the current version (0.60) of aspell
+// states that utf-8 is not well supported, so that we should maybe
+// also filter all 8bit chars.
+class AspExecPv : public ExecCmdProvide {
+public:
+    string *m_input; // pointer to string used as input buffer to command
+    Rcl::TermIter *m_tit;
+    Rcl::Db &m_db;
+    AspExecPv(string *i, Rcl::TermIter *tit, Rcl::Db &db) 
+	: m_input(i), m_tit(tit), m_db(db)
+    {}
+    void newData() {
+	while (m_db.termWalkNext(m_tit, *m_input)) {
+	    LOGDEB2(("Aspell::buildDict: term: [%s]\n", m_input->c_str()));
+	    if (!Rcl::Db::isSpellingCandidate(*m_input)) {
+		LOGDEB2(("Aspell::buildDict: SKIP\n"));
+		continue;
+	    }
+	    if (!o_index_stripchars) {
+		string lower;
+		if (!unacmaybefold(*m_input, lower, "UTF-8", UNACOP_FOLD))
+		    continue;
+		m_input->swap(lower);
+	    }
+	    // Got a non-empty sort-of appropriate term, let's send it to
+	    // aspell
+	    LOGDEB2(("Apell::buildDict: SEND\n"));
+	    m_input->append("\n");
+	    return;
+	}
+	// End of data. Tell so. Exec will close cmd.
+	m_input->erase();
+    }
+};
+
+
+bool Aspell::buildDict(Rcl::Db &db, string &reason)
+{
+    if (!ok())
+	return false;
+
+    string addCreateParam;
+    m_config->getConfParam("aspellAddCreateParam", addCreateParam);
+
+    // We create the dictionary by executing the aspell command:
+    // aspell --lang=[lang] create master [dictApath]
+    string cmdstring(m_data->m_exec);
+    ExecCmd aspell;
+    vector args;
+    args.push_back(string("--lang=")+ m_lang);
+    cmdstring += string(" ") + string("--lang=") + m_lang;
+    args.push_back("--encoding=utf-8");
+    cmdstring += string(" ") + "--encoding=utf-8";
+    if (!addCreateParam.empty()) {
+	args.push_back(addCreateParam);
+	cmdstring += string(" ") + addCreateParam;
+    }
+    args.push_back("create");
+    cmdstring += string(" ") + "create";
+    args.push_back("master");
+    cmdstring += string(" ") + "master";
+    args.push_back(dicPath());
+    cmdstring += string(" ") + dicPath();
+
+    // Have to disable stderr, as numerous messages about bad strings are
+    // printed. We'd like to keep errors about missing databases though, so
+    // make it configurable for diags
+    bool keepStderr = false;
+    m_config->getConfParam("aspellKeepStderr", &keepStderr);
+    if (!keepStderr)
+	aspell.setStderr("/dev/null");
+
+    Rcl::TermIter *tit = db.termWalkOpen();
+    if (tit == 0) {
+	reason = "termWalkOpen failed\n";
+	return false;
+    }
+    string termbuf;
+    AspExecPv pv(&termbuf, tit, db);
+    aspell.setProvide(&pv);
+    
+    if (aspell.doexec(m_data->m_exec, args, &termbuf)) {
+	ExecCmd cmd;
+	args.clear();
+	args.push_back("dicts");
+	string dicts;
+	bool hasdict = false;
+	if (cmd.doexec(m_data->m_exec, args, 0, &dicts)) {
+	    vector vdicts;
+	    stringToTokens(dicts, vdicts, "\n\r\t ");
+	    if (find(vdicts.begin(), vdicts.end(), m_lang) != vdicts.end()) {
+		hasdict = true;
+	    }
+	}
+	if (hasdict)
+	    reason = string(
+		"\naspell dictionary creation command [") +
+                cmdstring + string("] failed. Reason unknown.\n"
+		"Try to set aspellKeepStderr = 1 in recoll.conf, and execute \n"
+		"the indexing command in a terminal to see the aspell "
+		"diagnostic output.\n");
+	else
+	    reason = string("aspell dictionary creation command failed:\n") +
+                cmdstring + "\n"
+                "One possible reason might be missing language "
+                "data files for lang = " + m_lang +
+                ". Maybe try to execute the command by hand for a better diag.";
+	return false;
+    }
+    db.termWalkClose(tit);
+    return true;
+}
+
+
+bool Aspell::make_speller(string& reason)
+{
+    if (!ok())
+	return false;
+    if (m_data->m_speller != 0)
+        return true;
+
+    AspellCanHaveError *ret;
+
+    AspellConfig *config = aapi.new_aspell_config();
+    aapi.aspell_config_replace(config, "lang", m_lang.c_str());
+    aapi.aspell_config_replace(config, "encoding", "utf-8");
+    aapi.aspell_config_replace(config, "master", dicPath().c_str());
+    aapi.aspell_config_replace(config, "sug-mode", "fast");
+    //    aapi.aspell_config_replace(config, "sug-edit-dist", "2");
+    ret = aapi.new_aspell_speller(config);
+    aapi.delete_aspell_config(config);
+
+    if (aapi.aspell_error(ret) != 0) {
+	reason = aapi.aspell_error_message(ret);
+	aapi.delete_aspell_can_have_error(ret);
+	return false;
+    }
+    m_data->m_speller = aapi.to_aspell_speller(ret);
+    return true;
+}
+
+bool Aspell::check(const string &iterm, string& reason)
+{
+    LOGDEB2(("Aspell::check [%s]\n", iterm.c_str()));
+    string mterm(iterm);
+
+    if (!ok() || !make_speller(reason))
+	return false;
+    if (iterm.empty())
+        return true; //??
+
+    if (!o_index_stripchars) {
+	string lower;
+	if (!unacmaybefold(mterm, lower, "UTF-8", UNACOP_FOLD)) {
+	    LOGERR(("Aspell::check : cant lowercase input\n"));
+	    return false;
+	}
+	mterm.swap(lower);
+    }
+
+    int ret = aapi.aspell_speller_check(m_data->m_speller, 
+                                        mterm.c_str(), mterm.length());
+    reason.clear();
+    switch (ret) {
+    case 0: return false;
+    case 1: return true;
+    default:
+    case -1:
+        reason.append("Aspell error: ");
+        reason.append(aapi.aspell_speller_error_message(m_data->m_speller));
+        return false;
+    }
+}
+
+bool Aspell::suggest(Rcl::Db &db, const string &_term, 
+                     list& suggestions, string& reason)
+{
+    if (!ok() || !make_speller(reason))
+	return false;
+    string mterm(_term);
+    if (mterm.empty())
+        return true; //??
+
+    if (!o_index_stripchars) {
+	string lower;
+	if (!unacmaybefold(mterm, lower, "UTF-8", UNACOP_FOLD)) {
+	    LOGERR(("Aspell::check : cant lowercase input\n"));
+	    return false;
+	}
+	mterm.swap(lower);
+    }
+
+    AspellCanHaveError *ret;
+
+    const AspellWordList *wl = 
+	aapi.aspell_speller_suggest(m_data->m_speller, 
+                                    mterm.c_str(), mterm.length());
+    if (wl == 0) {
+	reason = aapi.aspell_speller_error_message(m_data->m_speller);
+	return false;
+    }
+    AspellStringEnumeration *els = aapi.aspell_word_list_elements(wl);
+    const char *word;
+    while ((word = aapi.aspell_string_enumeration_next(els)) != 0) {
+	// Check that the word exists in the index (we don't want
+	// aspell computed stuff, only exact terms from the
+	// dictionary).  We used to also check that it stems
+	// differently from the base word but this is complicated
+	// (stemming on/off + language), so we now leave this to the
+	// caller.
+	if (db.termExists(word))
+	    suggestions.push_back(word);
+    }
+    aapi.delete_aspell_string_enumeration(els);
+    return true;
+}
+
+#endif // RCL_USE_ASPELL
+
+#else // TEST_RCLASPELL test driver ->
+
+#ifdef HAVE_CONFIG_H
+#include "autoconfig.h"
+#endif
+
+#ifdef RCL_USE_ASPELL
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+using namespace std;
+
+#include "rclinit.h"
+#include "rclconfig.h"
+#include "rcldb.h"
+#include "rclaspell.h"
+
+static char *thisprog;
+RclConfig *rclconfig;
+
+static char usage [] =
+" -b : build dictionary\n"
+" -s : suggestions for term\n"
+" -c : check term\n"
+"\n"
+;
+static void
+Usage(void)
+{
+    fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_MOINS 0x1
+#define OPT_s	  0x2 
+#define OPT_b	  0x4 
+#define OPT_c     0x8
+
+int main(int argc, char **argv)
+{
+    string word;
+    
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 'b':	op_flags |= OPT_b; break;
+	    case 'c':	op_flags |= OPT_c; if (argc < 2)  Usage();
+		word = *(++argv);
+		argc--; 
+		goto b1;
+	    case 's':	op_flags |= OPT_s; if (argc < 2)  Usage();
+		word = *(++argv);
+		argc--; 
+		goto b1;
+	    default: Usage();	break;
+	    }
+    b1: argc--; argv++;
+    }
+
+    if (argc != 0 || op_flags == 0)
+	Usage();
+
+    string reason;
+    rclconfig = recollinit(0, 0, reason);
+    if (!rclconfig || !rclconfig->ok()) {
+	fprintf(stderr, "Configuration problem: %s\n", reason.c_str());
+	exit(1);
+    }
+
+    string dbdir = rclconfig->getDbDir();
+    if (dbdir.empty()) {
+	fprintf(stderr, "No db directory in configuration");
+	exit(1);
+    }
+
+    Rcl::Db rcldb(rclconfig);
+
+    if (!rcldb.open(Rcl::Db::DbRO, 0)) {
+	fprintf(stderr, "Could not open database in %s\n", dbdir.c_str());
+	exit(1);
+    }
+
+    Aspell aspell(rclconfig);
+
+    if (!aspell.init(reason)) {
+	cerr << "Init failed: " << reason << endl;
+	exit(1);
+    }
+    if (op_flags & OPT_b) {
+	if (!aspell.buildDict(rcldb, reason)) {
+	    cerr << "buildDict failed: " << reason << endl;
+	    exit(1);
+	}
+    } else if (op_flags & OPT_c) {
+	bool ret = aspell.check(word, reason);
+	if (!ret && reason.size()) {
+	    cerr << "Aspell error: " << reason << endl;
+	    return 1;
+	}
+	cout << word;
+	if (ret) {
+	    cout << " is in dictionary" << endl;
+	} else {
+	    cout << " not in dictionary" << endl;
+	}
+    } else {
+	list suggs;
+	if (!aspell.suggest(rcldb, word, suggs, reason)) {
+	    cerr << "suggest failed: " << reason << endl;
+	    exit(1);
+	}
+	cout << "Suggestions for " << word << ":" << endl;
+	for (list::iterator it = suggs.begin(); 
+	     it != suggs.end(); it++) {
+	    cout << *it << endl;
+	}
+    }
+    exit(0);
+}
+#else
+int main(int argc, char **argv)
+{return 1;}
+#endif // RCL_USE_ASPELL
+
+#endif // TEST_RCLASPELL test driver
diff --git a/src/aspell/rclaspell.h b/src/aspell/rclaspell.h
new file mode 100644
index 00000000..a493b5d9
--- /dev/null
+++ b/src/aspell/rclaspell.h
@@ -0,0 +1,79 @@
+/* Copyright (C) 2006 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _RCLASPELL_H_INCLUDED_
+#define _RCLASPELL_H_INCLUDED_
+
+/* autoconfig.h must be included before this file */
+#ifdef RCL_USE_ASPELL
+
+/**
+ * Aspell speller interface class.
+ *
+ * Aspell is used to let the user find about spelling variations that may 
+ * exist in the document set for a given word.
+ * A specific aspell dictionary is created out of all the terms in the 
+ * xapian index, and we then use it to expand a term to spelling neighbours.
+ * We use the aspell C api for term expansion, but have 
+ * to execute the program to create dictionaries.
+ */
+
+#include 
+#include 
+
+#include "rclconfig.h"
+#include "rcldb.h"
+
+class AspellData;
+
+class Aspell {
+ public:
+    Aspell(RclConfig *cnf);
+    ~Aspell();
+
+    /** Check health */
+    bool ok() const;
+
+    /** Find the aspell command and shared library, init function pointers */
+    bool init(std::string &reason); 
+
+    /**  Build dictionary out of index term list. This is done at the end
+     * of an indexing pass. */
+    bool buildDict(Rcl::Db &db, std::string &reason);
+
+    /** Check that word is in dictionary. Note that this would mean
+     * that the EXACT word is: aspell just does a lookup, no
+     * grammatical, case or diacritics magic of any kind
+     *
+     * @return true if word in dic, false if not. reason.size() -> error
+     */
+    bool check(const std::string& term, std::string& reason);
+
+    /** Return a list of possible expansions for a given word */
+    bool suggest(Rcl::Db &db, const std::string& term, 
+		 std::list &suggestions, std::string &reason);
+
+ private:
+    std::string dicPath();
+    RclConfig  *m_config;
+    std::string      m_lang;
+    AspellData *m_data;
+
+    bool make_speller(std::string& reason);
+};
+
+#endif /* RCL_USE_ASPELL */
+#endif /* _RCLASPELL_H_INCLUDED_ */
diff --git a/src/autogen.sh b/src/autogen.sh
new file mode 100755
index 00000000..7cdf4b80
--- /dev/null
+++ b/src/autogen.sh
@@ -0,0 +1,4 @@
+aclocal
+libtoolize
+automake --add-missing
+autoconf
diff --git a/src/bincimapmime/00README.recoll b/src/bincimapmime/00README.recoll
new file mode 100644
index 00000000..38fb36c8
--- /dev/null
+++ b/src/bincimapmime/00README.recoll
@@ -0,0 +1,3 @@
+Most of the code in this directory was taken from the Binc IMAP project
+(http://www.bincimap.org/), version 1.3.3
+
diff --git a/src/bincimapmime/AUTHORS b/src/bincimapmime/AUTHORS
new file mode 100644
index 00000000..1ece119f
--- /dev/null
+++ b/src/bincimapmime/AUTHORS
@@ -0,0 +1,45 @@
+The following parties have participated in writing code or otherwise
+contributed to the Binc IMAP project:
+
+Author:
+Andreas Aardal Hanssen                  
+
+Several users have been very helpful with bug reports and suggestions, and
+the author is very grateful for their contributions.
+
+Some users have also gone to the extra effort of debugging the cause of a
+bug, or have found a way of implementing a feature, and have either provided
+a very good description of what is needed, or they have actually provided a
+patch that has been added to Binc IMAP.
+
+While adding extra value to the discussion around the discovery of a bug or
+the evaluation of a new feature, these contributors also take some load of
+the author's back, so they deserve extra thanks.
+
+In this list are also included people who have contributed with mirrors and
+translations of the web pages.
+
+Henry Baragar                           
+Jürgen Botz                             
+Charlie Brady                           
+Caskey Dickson                          
+Ketil Froyn                             
+Gary Gordon                             
+Marek Gutkowski                         
+Daniel James                            
+Zak Johnson                             
+Sergei Kolobov                          
+Rafal Kupka                             
+Eivind Kvedalen                         
+HIROSHIMA Naoki                         
+Greger Stolt Nilsen			
+John Starks                             
+Peter Stuge                             
+Gerrit Pape                             
+Jeremy Rossi                            
+Dale Woolridge                          
+
+If you have contributed to the Binc IMAP project but are not listed here
+(this happens quite often), please send a mail to andreas-binc@bincimap.org
+and I'll add you to the list.
+
diff --git a/src/bincimapmime/COPYING b/src/bincimapmime/COPYING
new file mode 100644
index 00000000..e4397077
--- /dev/null
+++ b/src/bincimapmime/COPYING
@@ -0,0 +1,356 @@
+This software is released under the GPL. Find a full copy of the GNU
+General Public License below.
+
+In addition, as a special exception, Andreas Aardal Hanssen, author of
+Binc IMAP, gives permission to link the code of this program with the
+OpenSSL library (or with modified versions of OpenSSL that use the
+same license as OpenSSL, listed in the included COPYING.OpenSSL file),
+and distribute linked combinations including the two.
+
+You must obey the GNU General Public License in all respects for all
+of the code used other than OpenSSL.  If you modify this file, you may
+extend this exception to your version of the file, but you are not
+obligated to do so. If you do not wish to do so, delete this exception
+statement from your version.
+
+---------------------------------------------------------------------
+                   GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    
+    Copyright (C)   
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  , 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/bincimapmime/Makefile b/src/bincimapmime/Makefile
new file mode 100644
index 00000000..218b1d52
--- /dev/null
+++ b/src/bincimapmime/Makefile
@@ -0,0 +1,11 @@
+PROGS = trbinc
+all: $(PROGS)
+
+TRBINCOBJS = trbinc.o
+trbinc: trbinc.o
+	$(CXX) -o trbinc trbinc.o $(LIBRECOLL)
+
+trbinc.o: trbinc.cc
+	$(CXX) $(ALL_CXXFLAGS) -c -o trbinc.o trbinc.cc
+
+include ../utils/utmkdefs.mk
diff --git a/src/bincimapmime/config.h b/src/bincimapmime/config.h
new file mode 100644
index 00000000..e69de29b
diff --git a/src/bincimapmime/convert.cc b/src/bincimapmime/convert.cc
new file mode 100644
index 00000000..73d58117
--- /dev/null
+++ b/src/bincimapmime/convert.cc
@@ -0,0 +1,133 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    convert.cc
+ *  
+ *  Description:
+ *    Implementation of miscellaneous convertion functions.
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#include "convert.h"
+#include 
+
+#ifndef NO_NAMESPACES
+using namespace ::std;
+using namespace Binc;
+#endif /* NO_NAMESPACES */
+
+//------------------------------------------------------------------------
+BincStream::BincStream(void)
+{
+}
+
+//------------------------------------------------------------------------
+BincStream::~BincStream(void)
+{
+  clear();
+}
+
+//------------------------------------------------------------------------
+string BincStream::popString(std::string::size_type size)
+{
+  if (size > nstr.length())
+    size = nstr.length();
+  string tmp = nstr.substr(0, size);
+  nstr = nstr.substr(size);
+  return tmp;
+}
+
+//------------------------------------------------------------------------
+char BincStream::popChar(void)
+{
+  if (nstr.length() == 0)
+    return '\0';
+
+  char c = nstr[0];
+  nstr = nstr.substr(1);
+  return c;
+}
+
+//------------------------------------------------------------------------
+void BincStream::unpopChar(char c)
+{
+  nstr = c + nstr;
+}
+
+//------------------------------------------------------------------------
+void BincStream::unpopStr(const string &s)
+{
+  nstr = s + nstr;
+}
+
+//------------------------------------------------------------------------
+const string &BincStream::str(void) const
+{
+  return nstr;
+}
+
+//------------------------------------------------------------------------
+void BincStream::clear(void)
+{
+  nstr.clear();
+}
+
+//------------------------------------------------------------------------
+unsigned int BincStream::getSize(void) const
+{
+  return (unsigned int) nstr.length();
+}
+
+//------------------------------------------------------------------------
+BincStream &BincStream::operator << (std::ostream&(*)(std::ostream&))
+{
+  nstr += "\r\n";
+  return *this;
+}
+
+//------------------------------------------------------------------------
+BincStream &BincStream::operator << (const string &t)
+{
+  nstr += t;
+  return *this;
+}
+
+//------------------------------------------------------------------------
+BincStream &BincStream::operator << (int t)
+{
+  nstr += toString(t);
+  return *this;
+}
+
+//------------------------------------------------------------------------
+BincStream &BincStream::operator << (unsigned int t)
+{
+  nstr += toString(t);
+  return *this;
+}
+
+//------------------------------------------------------------------------
+BincStream &BincStream::operator << (char t)
+{
+  nstr += t;
+  return *this;
+}
diff --git a/src/bincimapmime/convert.h b/src/bincimapmime/convert.h
new file mode 100644
index 00000000..2ed9b3a7
--- /dev/null
+++ b/src/bincimapmime/convert.h
@@ -0,0 +1,316 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    src/util/convert.h
+ *  
+ *  Description:
+ *    Declaration of miscellaneous convertion functions.
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifndef convert_h_included
+#define convert_h_included
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+namespace Binc {
+
+  //----------------------------------------------------------------------
+  inline std::string toString(int i_in)
+  {
+    char intbuf[16];
+    snprintf(intbuf, sizeof(intbuf), "%d", i_in);
+    return std::string(intbuf);
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string toString(unsigned int i_in)
+  {
+    char intbuf[16];
+    snprintf(intbuf, sizeof(intbuf), "%u", i_in);
+    return std::string(intbuf);
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string toString(unsigned long i_in)
+  {
+    char longbuf[40];
+    snprintf(longbuf, sizeof(longbuf), "%lu", i_in);
+    return std::string(longbuf);
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string toString(const char *i_in)
+  {
+    return std::string(i_in);
+  }
+
+  //----------------------------------------------------------------------
+  inline int atoi(const std::string &s_in)
+  {
+    return ::atoi(s_in.c_str());
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string toHex(const std::string &s)
+  {
+    const char hexchars[] = "0123456789abcdef";
+    std::string tmp;
+    for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {
+      unsigned char c = (unsigned char)*i;
+      tmp += hexchars[((c & 0xf0) >> 4)];
+      tmp += hexchars[c & 0x0f];
+    }
+    
+    return tmp;
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string fromHex(const std::string &s)
+  {
+    const char hexchars[] = "0123456789abcdef";
+    std::string tmp;
+    for (std::string::const_iterator i = s.begin();
+	 i != s.end() && i + 1 != s.end(); i += 2) {
+      ptrdiff_t n;
+      unsigned char c = *i;
+      unsigned char d = *(i + 1);
+      
+      const char *t;
+      if ((t = strchr(hexchars, c)) == 0)
+	return "out of range";
+      n = (t - hexchars) << 4;
+      
+      
+      if ((t = strchr(hexchars, d)) == 0)
+	return "out of range";
+      n += (t - hexchars);
+      
+      if (n >= 0 && n <= 255)
+	tmp += (char) n;
+      else
+	return "out of range";
+    }
+    
+    return tmp;
+  }
+  
+  //----------------------------------------------------------------------
+  inline std::string toImapString(const std::string &s_in)
+  {
+    for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) {
+      unsigned char c = (unsigned char)*i;
+      if (c <= 31 || c >= 127 || c == '\"' || c == '\\')
+	return "{" + toString((unsigned long)s_in.length()) + "}\r\n" + s_in;
+    }
+    
+    return "\"" + s_in + "\"";
+  }
+
+  //----------------------------------------------------------------------
+  inline void uppercase(std::string &input)
+  {
+    for (std::string::iterator i = input.begin(); i != input.end(); ++i)
+      *i = toupper(*i);
+  }
+
+  //----------------------------------------------------------------------
+  inline void lowercase(std::string &input)
+  {
+    for (std::string::iterator i = input.begin(); i != input.end(); ++i)
+      *i = tolower(*i);
+  }
+
+  //----------------------------------------------------------------------
+  inline void chomp(std::string &s_in, const std::string &chars = " \t\r\n")
+  {
+    std::string::size_type n = s_in.length();
+    while (n > 1 && chars.find(s_in[n - 1]) != std::string::npos)
+      s_in.resize(n-- - 1);
+  }
+
+  //----------------------------------------------------------------------
+  inline void trim(std::string &s_in, const std::string &chars = " \t\r\n")
+  {
+    while (s_in != "" && chars.find(s_in[0]) != std::string::npos)
+      s_in = s_in.substr(1);
+    chomp(s_in, chars);
+  }
+
+  //----------------------------------------------------------------------
+  inline const std::string unfold(const std::string &a, 
+				  bool removecomment = true)
+  {
+    std::string tmp;
+    bool incomment = false;
+    bool inquotes = false;
+    for (std::string::const_iterator i = a.begin(); i != a.end(); ++i) {
+      unsigned char c = (unsigned char)*i;
+      if (!inquotes && removecomment) {
+	if (c == '(') {
+	  incomment = true; 
+	  tmp += " ";
+	} else if (c == ')') {
+	  incomment = false; 
+	} else if (c != 0x0a && c != 0x0d) {
+	  tmp += *i;
+        }
+      } else if (c != 0x0a && c != 0x0d) {
+	tmp += *i;
+      }
+
+      if (!incomment) {
+        if (*i == '\"') 
+          inquotes = !inquotes;
+      }
+    }
+
+    trim(tmp);
+    return tmp;
+  }
+  
+  //----------------------------------------------------------------------
+  inline void split(const std::string &s_in, const std::string &delim, 
+	     std::vector &dest, bool skipempty = true)
+  {
+    std::string token;
+    for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) {
+      if (delim.find(*i) != std::string::npos) {
+	if (!skipempty || token != "")
+	  dest.push_back(token);
+	token.clear();
+      } else
+	token += *i;
+    }
+
+    if (token != "")
+      dest.push_back(token);
+  }
+
+  //----------------------------------------------------------------------
+  inline void splitAddr(const std::string &s_in,
+			std::vector &dest, bool skipempty = true)
+  {
+    static const std::string delim = ",";
+    std::string token;
+    bool inquote = false;
+    for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) {
+      if (inquote && *i == '\"') inquote = false;
+      else if (!inquote && *i == '\"') inquote = true;
+
+      if (!inquote && delim.find(*i) != std::string::npos) {
+	if (!skipempty || token != "")
+	  dest.push_back(token);
+	token.clear();
+      } else
+	token += *i;
+    }
+    if (token != "")
+      dest.push_back(token);
+  }
+
+  //----------------------------------------------------------------------
+  inline std::string toCanonMailbox(const std::string &s_in)
+  {
+    if (s_in.find("..") != std::string::npos) return std::string();
+
+    if (s_in.length() >= 5) {
+      std::string a = s_in.substr(0, 5);
+      uppercase(a);
+      return a == "INBOX" ?
+	a + (s_in.length() > 5 ? s_in.substr(5) : std::string()) : s_in;
+    }
+    
+    return s_in;
+  }
+
+  //------------------------------------------------------------------------
+  inline std::string toRegex(const std::string &s_in, char delimiter)
+  {
+    std::string regex = "^";
+    for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) {
+      if (*i == '.' || *i == '[' || *i == ']' || *i == '{' || *i == '}' ||
+	  *i == '(' || *i == ')' || *i == '^' || *i == '$' || *i == '?' ||
+	  *i == '+' || *i == '\\') {
+	regex += "\\";
+	regex += *i;
+      } else if (*i == '*')
+	regex += ".*?";
+       else if (*i == '%') {
+        regex += "(\\";
+        regex += delimiter;
+        regex += "){0,1}";
+	regex += "[^\\";
+	regex += delimiter;
+	regex += "]*?";
+      } else regex += *i;
+    }
+    
+    if (regex[regex.length() - 1] == '?')
+      regex[regex.length() - 1] = '$';
+    else
+      regex += "$";
+
+    return regex;
+  }
+
+  //------------------------------------------------------------------------
+  class BincStream {
+  private:
+    std::string nstr;
+
+  public:
+
+    //--
+    BincStream &operator << (std::ostream&(*)(std::ostream&));
+    BincStream &operator << (const std::string &t);
+    BincStream &operator << (unsigned int t);
+    BincStream &operator << (int t);
+    BincStream &operator << (char t);
+
+    //--
+    std::string popString(std::string::size_type size);
+
+    //--
+    char popChar(void);
+    void unpopChar(char c);
+    void unpopStr(const std::string &s);
+
+    //--
+    const std::string &str(void) const;
+
+    //--
+    unsigned int getSize(void) const;
+
+    //--
+    void clear(void);
+
+    //--
+    BincStream(void);
+    ~BincStream(void);
+  };
+}
+
+#endif
diff --git a/src/bincimapmime/mime-inputsource.h b/src/bincimapmime/mime-inputsource.h
new file mode 100644
index 00000000..977d7689
--- /dev/null
+++ b/src/bincimapmime/mime-inputsource.h
@@ -0,0 +1,222 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    src/mime-inputsource.h
+ *  
+ *  Description:
+ *    The base class of the MIME input source
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifndef mime_inputsource_h_included
+#define mime_inputsource_h_included
+#include "autoconfig.h"
+// Data source for MIME parser
+
+// Note about large files: we might want to change the unsigned int
+// used for offsets into an off_t for intellectual satisfaction, but
+// in the context of recoll, we could only get into trouble if a
+// *single message* exceeded 2GB, which seems rather unlikely. When
+// parsing a mailbox files, we read each message in memory and use the
+// stream input source (from a memory buffer, no file offsets). When
+// parsing a raw message file, it's only one message.
+
+#include 
+#include "safeunistd.h"
+
+#include 
+
+namespace Binc {
+
+  class MimeInputSource {
+  public:
+    // Note that we do NOT take ownership of fd, won't close it on delete
+    inline MimeInputSource(int fd, unsigned int start = 0);
+    virtual inline ~MimeInputSource(void);
+
+    virtual inline ssize_t fillRaw(char *raw, size_t nbytes);
+    virtual inline void reset(void);
+
+    virtual inline bool fillInputBuffer(void);
+    inline void seek(unsigned int offset);
+    inline bool getChar(char *c);
+    inline void ungetChar(void);
+    inline int getFileDescriptor(void) const;
+
+    inline unsigned int getOffset(void) const;
+
+  private:
+    int fd;
+    char data[16384];
+    unsigned int offset;
+    unsigned int tail;
+    unsigned int head;
+    unsigned int start;
+    char lastChar;
+  };
+
+  inline MimeInputSource::MimeInputSource(int fd, unsigned int start)
+  {
+    this->fd = fd;
+    this->start = start;
+    offset = 0;
+    tail = 0;
+    head = 0;
+    lastChar = '\0';
+    memset(data, '\0', sizeof(data));
+
+    seek(start);
+  }
+
+  inline MimeInputSource::~MimeInputSource(void)
+  {
+  }
+
+  inline ssize_t MimeInputSource::fillRaw(char *raw, size_t nbytes)
+  {
+      return read(fd, raw, nbytes);
+  }
+
+  inline bool MimeInputSource::fillInputBuffer(void)
+  {
+    char raw[4096];
+    ssize_t nbytes = fillRaw(raw, 4096);
+    if (nbytes <= 0) {
+      // FIXME: If ferror(crlffile) we should log this.
+      return false;
+    }
+
+    for (ssize_t i = 0; i < nbytes; ++i) {
+      const char c = raw[i];
+      if (c == '\r') {
+	if (lastChar == '\r') {
+	  data[tail++ & (0x4000-1)] = '\r';
+	  data[tail++ & (0x4000-1)] = '\n';
+	}
+      } else if (c == '\n') {
+	data[tail++ & (0x4000-1)] = '\r';
+	data[tail++ & (0x4000-1)] = '\n';
+      } else {
+	if (lastChar == '\r') {
+	  data[tail++ & (0x4000-1)] = '\r';
+	  data[tail++ & (0x4000-1)] = '\n';
+	}
+
+	data[tail++ & (0x4000-1)] = c;
+      }
+      
+      lastChar = c;
+    }
+
+    return true;
+  }
+
+  inline void MimeInputSource::reset(void)
+  {
+    offset = head = tail = 0;
+    lastChar = '\0';
+
+    if (fd != -1)
+      lseek(fd, 0, SEEK_SET);
+  }
+
+  inline void MimeInputSource::seek(unsigned int seekToOffset)
+  {
+    if (offset > seekToOffset)
+      reset();
+   
+    char c;
+    int n = 0;
+    while (seekToOffset > offset) {
+      if (!getChar(&c))
+	break;
+      ++n;
+    }
+  }
+
+  inline bool MimeInputSource::getChar(char *c)
+  {
+    if (head == tail && !fillInputBuffer())
+      return false;
+
+    *c = data[head++ & (0x4000-1)];
+    ++offset;
+    return true;
+  }
+
+  inline void MimeInputSource::ungetChar()
+  {
+    --head;
+    --offset;
+  }
+
+  inline int MimeInputSource::getFileDescriptor(void) const
+  {
+    return fd;
+  }
+
+  inline unsigned int MimeInputSource::getOffset(void) const
+  {
+    return offset;
+  }
+
+    ///////////////////////////////////
+    class MimeInputSourceStream : public MimeInputSource {
+  public:
+    inline MimeInputSourceStream(istream& s, unsigned int start = 0);
+    virtual inline ssize_t fillRaw(char *raw, size_t nb);
+    virtual inline void reset(void);
+  private:
+      istream& s;
+  };
+
+  inline MimeInputSourceStream::MimeInputSourceStream(istream& si, 
+						      unsigned int start)
+      : MimeInputSource(-1, start), s(si)
+  {
+  }
+
+  inline ssize_t MimeInputSourceStream::fillRaw(char *raw, size_t nb)
+  {
+    // Why can't streams tell how many characters were actually read
+    // when hitting eof ?
+    std::streampos st = s.tellg();
+    s.seekg(0, ios::end);
+    std::streampos lst = s.tellg();
+    s.seekg(st);
+    size_t nbytes = size_t(lst - st);
+    if (nbytes > nb) {
+	nbytes = nb;
+    }
+    if (nbytes <= 0) {
+	return (ssize_t)-1;
+    }
+
+    s.read(raw, nbytes);
+    return static_cast(nbytes);
+  }
+
+  inline void MimeInputSourceStream::reset(void)
+  {
+      MimeInputSource::reset();
+      s.seekg(0);
+  }
+
+}
+
+#endif
diff --git a/src/bincimapmime/mime-parsefull.cc b/src/bincimapmime/mime-parsefull.cc
new file mode 100644
index 00000000..e4a3e3a0
--- /dev/null
+++ b/src/bincimapmime/mime-parsefull.cc
@@ -0,0 +1,629 @@
+ /* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    mime-parsefull.cc
+ *  
+ *  Description:
+ *    Implementation of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#ifndef NO_NAMESPACES
+using namespace ::std;
+#endif /* NO_NAMESPACES */
+
+#include "mime.h"
+#include "mime-utils.h"
+#include "mime-inputsource.h"
+#include "convert.h"
+
+// #define MPF
+#ifdef MPF
+#define MPFDEB(X) fprintf X
+#else
+#define MPFDEB(X)
+#endif
+
+//------------------------------------------------------------------------
+void Binc::MimeDocument::parseFull(int fd)
+{
+  if (allIsParsed)
+    return;
+
+  allIsParsed = true;
+
+  delete doc_mimeSource;
+  doc_mimeSource = new MimeInputSource(fd);
+
+  headerstartoffsetcrlf = 0;
+  headerlength = 0;
+  bodystartoffsetcrlf = 0;
+  bodylength = 0;
+  size = 0;
+  messagerfc822 = false;
+  multipart = false;
+
+  int bsize = 0;
+  string bound;
+  doParseFull(doc_mimeSource, bound, bsize);
+
+  // eat any trailing junk to get the correct size
+  char c;
+  while (doc_mimeSource->getChar(&c));
+
+  size = doc_mimeSource->getOffset();
+}
+
+void Binc::MimeDocument::parseFull(istream& s)
+{
+  if (allIsParsed)
+    return;
+
+  allIsParsed = true;
+
+  delete doc_mimeSource;
+  doc_mimeSource = new MimeInputSourceStream(s);
+
+  headerstartoffsetcrlf = 0;
+  headerlength = 0;
+  bodystartoffsetcrlf = 0;
+  bodylength = 0;
+  size = 0;
+  messagerfc822 = false;
+  multipart = false;
+
+  int bsize = 0;
+  string bound;
+  doParseFull(doc_mimeSource, bound, bsize);
+
+  // eat any trailing junk to get the correct size
+  char c;
+  while (doc_mimeSource->getChar(&c));
+
+  size = doc_mimeSource->getOffset();
+}
+
+//------------------------------------------------------------------------
+bool Binc::MimePart::parseOneHeaderLine(Binc::Header *header, 
+					unsigned int *nlines)
+{
+  using namespace ::Binc;
+  char c;
+  bool eof = false;
+  char cqueue[4];
+  string name;
+  string content;
+
+  while (mimeSource->getChar(&c)) {
+    // If we encounter a \r before we got to the first ':', then
+    // rewind back to the start of the line and assume we're at the
+    // start of the body.
+    if (c == '\r') {
+      for (int i = 0; i < (int) name.length() + 1; ++i)
+	mimeSource->ungetChar();
+      return false;
+    }
+
+    // A colon marks the end of the header name
+    if (c == ':') break;
+
+    // Otherwise add to the header name
+    name += c;
+  }
+
+  cqueue[0] = '\0';
+  cqueue[1] = '\0';
+  cqueue[2] = '\0';
+  cqueue[3] = '\0';
+
+  // Read until the end of the header.
+  bool endOfHeaders = false;
+  while (!endOfHeaders) {
+    if (!mimeSource->getChar(&c)) {
+      eof = true;
+      break;
+    }
+
+    if (c == '\n') ++*nlines;
+
+    for (int i = 0; i < 3; ++i)
+      cqueue[i] = cqueue[i + 1];
+    cqueue[3] = c;
+
+    if (strncmp(cqueue, "\r\n\r\n", 4) == 0) {
+      endOfHeaders = true;
+      break;
+    }
+
+    // If the last character was a newline, and the first now is not
+    // whitespace, then rewind one character and store the current
+    // key,value pair.
+    if (cqueue[2] == '\n' && c != ' ' && c != '\t') {
+      if (content.length() > 2)
+	content.resize(content.length() - 2);
+
+      trim(content);
+      header->add(name, content);
+
+      if (c != '\r') {
+	mimeSource->ungetChar();
+	if (c == '\n') --*nlines;
+	return true;
+      }
+	
+      mimeSource->getChar(&c);
+      return false;
+    }
+
+    content += c;
+  }
+
+  if (name != "") {
+    if (content.length() > 2)
+      content.resize(content.length() - 2);
+    header->add(name, content);
+  }
+
+  return !(eof || endOfHeaders);
+}
+
+//------------------------------------------------------------------------
+void Binc::MimePart::parseHeader(Binc::Header *header, unsigned int *nlines)
+{
+  while (parseOneHeaderLine(header, nlines))
+  { }
+}
+
+//------------------------------------------------------------------------
+void Binc::MimePart::analyzeHeader(Binc::Header *header, bool *multipart,
+				   bool *messagerfc822, string *subtype,
+				   string *boundary)
+{
+  using namespace ::Binc;
+
+  // Do simple parsing of headers to determine the
+  // type of message (multipart,messagerfc822 etc)
+  HeaderItem ctype;
+  if (header->getFirstHeader("content-type", ctype)) {
+    vector types;
+    split(ctype.getValue(), ";", types);
+
+    if (types.size() > 0) {
+      // first element should describe content type
+      string tmp = types[0];
+      trim(tmp);
+      vector v;
+      split(tmp, "/", v);
+      string key, value;
+
+      key = (v.size() > 0) ? v[0] : "text";
+      value = (v.size() > 1) ? v[1] : "plain";
+      lowercase(key);
+
+      if (key == "multipart") {
+	*multipart = true;
+	lowercase(value);
+	*subtype = value;
+      } else if (key == "message") {
+	lowercase(value);
+	if (value == "rfc822")
+	  *messagerfc822 = true;
+      }
+    }
+
+    for (vector::const_iterator i = types.begin();
+	 i != types.end(); ++i) {
+      string element = *i;
+      trim(element);
+
+      if (element.find("=") != string::npos) {
+	string::size_type pos = element.find('=');
+	string key = element.substr(0, pos);
+	string value = element.substr(pos + 1);
+	
+	lowercase(key);
+	trim(key);
+
+	if (key == "boundary") {
+	  trim(value, " \"");
+	  *boundary = value;
+	}
+      }
+    }
+  }
+}
+
+void Binc::MimePart::parseMessageRFC822(vector *members,
+					bool *foundendofpart,
+					unsigned int *bodylength,
+					unsigned int *nbodylines,
+					const string &toboundary)
+{
+  using namespace ::Binc;
+
+  // message rfc822 means a completely enclosed mime document. we
+  // call the parser recursively, and pass on the boundary string
+  // that we got. when parse() finds this boundary, it returns 0. if
+  // it finds the end boundary (boundary + "--"), it returns != 0.
+  MimePart m;
+
+  unsigned int bodystartoffsetcrlf = mimeSource->getOffset();
+    
+  // parsefull returns the number of bytes that need to be removed
+  // from the body because of the terminating boundary string.
+  int bsize = 0;
+  if (m.doParseFull(mimeSource, toboundary, bsize))
+    *foundendofpart = true;
+
+  // make sure bodylength doesn't overflow    
+  *bodylength = mimeSource->getOffset();
+  if (*bodylength >= bodystartoffsetcrlf) {
+    *bodylength -= bodystartoffsetcrlf;
+    if (*bodylength >= (unsigned int) bsize) {
+      *bodylength -= (unsigned int) bsize;
+    } else {
+      *bodylength = 0;
+    }
+  } else {
+    *bodylength = 0;
+  }
+
+  *nbodylines += m.getNofLines();
+
+  members->push_back(m);
+}
+
+bool Binc::MimePart::skipUntilBoundary(const string &delimiter,
+				       unsigned int *nlines, bool *eof)
+{
+  string::size_type endpos = delimiter.length();
+  char *delimiterqueue = 0;
+  string::size_type delimiterpos = 0;
+  const char *delimiterStr = delimiter.c_str();
+  if (delimiter != "") {
+    delimiterqueue = new char[endpos];
+    memset(delimiterqueue, 0, endpos);
+  }
+
+  // first, skip to the first delimiter string. Anything between the
+  // header and the first delimiter string is simply ignored (it's
+  // usually a text message intended for non-mime clients)
+  char c;
+
+  bool foundBoundary = false;
+  for (;;) {    
+    if (!mimeSource->getChar(&c)) {
+      *eof = true;
+      break;
+    }
+
+    if (c == '\n')
+      ++*nlines;
+
+    // if there is no delimiter, we just read until the end of the
+    // file.
+    if (!delimiterqueue)
+      continue;
+
+    delimiterqueue[delimiterpos++] = c;
+    if (delimiterpos ==  endpos)
+      delimiterpos = 0;
+      
+    if (compareStringToQueue(delimiterStr, delimiterqueue,
+			     delimiterpos, int(endpos))) {
+      foundBoundary = true;
+      break;
+    }
+  }
+
+  delete [] delimiterqueue;
+  delimiterqueue = 0;
+
+  return foundBoundary;
+}
+
+// JFD: Things we do after finding a boundary (something like CRLF--somestring)
+// Need to see if this is a final one (with an additional -- at the end),
+// and need to check if it is immediately followed by another boundary 
+// (in this case, we give up our final CRLF in its favour)
+inline void Binc::MimePart::postBoundaryProcessing(bool *eof,
+						   unsigned int *nlines,
+						   int *boundarysize,
+						   bool *foundendofpart)
+{
+    // Read two more characters. This may be CRLF, it may be "--" and
+    // it may be any other two characters.
+    char a = '\0';
+    if (!mimeSource->getChar(&a))
+      *eof = true;
+    if (a == '\n')
+      ++*nlines; 
+
+    char b = '\0';
+    if (!mimeSource->getChar(&b))
+      *eof = true;
+    if (b == '\n')
+      ++*nlines;
+    
+    // If eof, we're done here
+    if (*eof)
+      return;
+
+    // If we find two dashes after the boundary, then this is the end
+    // of boundary marker, and we need to get 2 more chars
+    if (a == '-' && b == '-') {
+      *foundendofpart = true;
+      *boundarysize += 2;
+	
+      if (!mimeSource->getChar(&a))
+	*eof = true;
+      if (a == '\n')
+	++*nlines; 
+	
+      if (!mimeSource->getChar(&b))
+	*eof = true;
+      if (b == '\n')
+	++*nlines;
+    }
+
+    // If the boundary is followed by CRLF, we need to handle the
+    // special case where another boundary line follows
+    // immediately. In this case we consider the CRLF to be part of
+    // the NEXT boundary.
+    if (a == '\r' && b == '\n') {
+      // Get 2 more
+      if (!mimeSource->getChar(&a) || !mimeSource->getChar(&b)) {
+	*eof = true; 
+      } else if (a == '-' && b == '-') {
+	MPFDEB((stderr, "BINC: consecutive delimiters, giving up CRLF\n"));
+	mimeSource->ungetChar();
+	mimeSource->ungetChar();
+	mimeSource->ungetChar();
+	mimeSource->ungetChar();
+      } else {
+	// We unget the 2 chars, and keep our crlf (increasing our own size)
+	MPFDEB((stderr, "BINC: keeping my CRLF\n"));
+	mimeSource->ungetChar();
+	mimeSource->ungetChar();
+	*boundarysize += 2;
+      }
+
+    } else {
+      // Boundary string not followed by CRLF, don't read more and let
+      // others skip the rest. Note that this is allowed but quite uncommon
+      mimeSource->ungetChar();
+      mimeSource->ungetChar();
+    }
+}
+
+void Binc::MimePart::parseMultipart(const string &boundary,
+				    const string &toboundary,
+				    bool *eof,
+				    unsigned int *nlines,
+				    int *boundarysize,
+				    bool *foundendofpart,
+				    unsigned int *bodylength,
+				    vector *members)
+{
+  MPFDEB((stderr, "BINC: ParseMultipart: boundary [%s], toboundary[%s]\n", 
+	  boundary.c_str(),
+	  toboundary.c_str()));
+  using namespace ::Binc;
+  unsigned int bodystartoffsetcrlf = mimeSource->getOffset();
+
+  // multipart parsing starts with skipping to the first
+  // boundary. then we call parse() for all parts. the last parse()
+  // command will return a code indicating that it found the last
+  // boundary of this multipart. Note that the first boundary does
+  // not have to start with CRLF.
+  string delimiter = "--" + boundary;
+
+  skipUntilBoundary(delimiter, nlines, eof);
+
+  if (!eof)
+    *boundarysize = int(delimiter.size());
+
+  postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart);
+
+  // read all mime parts.
+  if (!*foundendofpart && !*eof) {
+    bool quit = false;
+    do {
+      MimePart m;
+
+      // If parseFull returns != 0, then it encountered the multipart's
+      // final boundary.
+      int bsize = 0;
+      if (m.doParseFull(mimeSource, boundary, bsize)) {
+	quit = true;
+	*boundarysize = bsize;
+      }
+
+      members->push_back(m);
+
+    } while (!quit);
+  }
+
+  if (!*foundendofpart && !*eof) {
+    // multipart parsing starts with skipping to the first
+    // boundary. then we call parse() for all parts. the last parse()
+    // command will return a code indicating that it found the last
+    // boundary of this multipart. Note that the first boundary does
+    // not have to start with CRLF.
+    string delimiter = "\r\n--" + toboundary;
+    skipUntilBoundary(delimiter, nlines, eof);
+
+    if (!*eof)
+      *boundarysize = int(delimiter.size());
+
+    postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart);
+  }
+
+  // make sure bodylength doesn't overflow    
+  *bodylength = mimeSource->getOffset();
+  if (*bodylength >= bodystartoffsetcrlf) {
+    *bodylength -= bodystartoffsetcrlf;
+    if (*bodylength >= (unsigned int) *boundarysize) {
+      *bodylength -= (unsigned int) *boundarysize;
+    } else {
+      *bodylength = 0;
+    }
+  } else {
+    *bodylength = 0;
+  }
+  MPFDEB((stderr, "BINC: ParseMultipart return\n"));
+}
+
+void Binc::MimePart::parseSinglePart(const string &toboundary,
+			    int *boundarysize,
+			    unsigned int *nbodylines,
+			    unsigned int *nlines,
+			    bool *eof, bool *foundendofpart,
+			    unsigned int *bodylength)
+{
+  MPFDEB((stderr, "BINC: parseSinglePart, boundary [%s]\n", 
+	  toboundary.c_str()));
+  using namespace ::Binc;
+  unsigned int bodystartoffsetcrlf = mimeSource->getOffset();
+
+  // If toboundary is empty, then we read until the end of the
+  // file. Otherwise we will read until we encounter toboundary.
+  string _toboundary; 
+  if (toboundary != "") {
+    _toboundary = "\r\n--";
+    _toboundary += toboundary;
+  }
+
+  //  if (skipUntilBoundary(_toboundary, nlines, eof))
+  //    *boundarysize = _toboundary.length();
+
+  char *boundaryqueue = 0;
+  size_t endpos = _toboundary.length();
+  if (toboundary != "") {
+    boundaryqueue = new char[endpos];
+    memset(boundaryqueue, 0, endpos);
+  }
+
+  *boundarysize = 0;
+
+  const char *_toboundaryStr = _toboundary.c_str();
+  string line;
+  bool toboundaryIsEmpty = (toboundary == "");
+  char c;
+  string::size_type boundarypos = 0;
+  while (mimeSource->getChar(&c)) {
+    if (c == '\n') { ++*nbodylines; ++*nlines; }
+
+    if (toboundaryIsEmpty)
+      continue;
+
+    // find boundary
+    boundaryqueue[boundarypos++] = c;
+    if (boundarypos == endpos)
+      boundarypos = 0;
+      
+    if (compareStringToQueue(_toboundaryStr, boundaryqueue,
+			     boundarypos, int(endpos))) {
+      *boundarysize = static_cast(_toboundary.length());
+      break;
+    }
+  }
+
+  delete [] boundaryqueue;
+
+  if (toboundary != "") {
+    postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart);
+  } else {
+    // Recoll: in the case of a multipart body with a null
+    // boundary (probably illegal but wtf), eof was not set and
+    // multipart went into a loop until bad alloc.
+    *eof = true;
+  }
+
+  // make sure bodylength doesn't overflow    
+  *bodylength = mimeSource->getOffset();
+  if (*bodylength >= bodystartoffsetcrlf) {
+    *bodylength -= bodystartoffsetcrlf;
+    if (*bodylength >= (unsigned int) *boundarysize) {
+      *bodylength -= (unsigned int) *boundarysize;
+    } else {
+      *bodylength = 0;
+    }
+  } else {
+    *bodylength = 0;
+  }
+  MPFDEB((stderr, "BINC: parseSimple ret: bodylength %d, boundarysize %d\n",
+	  *bodylength, *boundarysize));
+}
+
+//------------------------------------------------------------------------
+int Binc::MimePart::doParseFull(MimeInputSource *ms, const string &toboundary,
+				int &boundarysize)
+{
+  MPFDEB((stderr, "BINC: doParsefull, toboundary[%s]\n", toboundary.c_str()));
+  mimeSource = ms;
+  headerstartoffsetcrlf = mimeSource->getOffset();
+
+  // Parse the header of this mime part.
+  parseHeader(&h, &nlines);
+
+  // Headerlength includes the seperating CRLF. Body starts after the
+  // CRLF.
+  headerlength = mimeSource->getOffset() - headerstartoffsetcrlf;
+  bodystartoffsetcrlf = mimeSource->getOffset();
+  MPFDEB((stderr, "BINC: doParsefull, bodystartoffsetcrlf %d\n", bodystartoffsetcrlf));
+  bodylength = 0;
+
+  // Determine the type of mime part by looking at fields in the
+  // header.
+  analyzeHeader(&h, &multipart, &messagerfc822, &subtype, &boundary);
+
+  bool eof = false;
+  bool foundendofpart = false;
+
+  if (messagerfc822) {
+    parseMessageRFC822(&members, &foundendofpart, &bodylength,
+		       &nbodylines, toboundary);
+
+  } else if (multipart) {
+    parseMultipart(boundary, toboundary, &eof, &nlines, &boundarysize,
+		   &foundendofpart, &bodylength,
+		   &members);
+  } else {
+    parseSinglePart(toboundary, &boundarysize, &nbodylines, &nlines,
+		    &eof, &foundendofpart, &bodylength);
+  }
+
+  MPFDEB((stderr, "BINC: doParsefull ret, toboundary[%s]\n", toboundary.c_str()));
+  return (eof || foundendofpart) ? 1 : 0;
+}
diff --git a/src/bincimapmime/mime-parseonlyheader.cc b/src/bincimapmime/mime-parseonlyheader.cc
new file mode 100644
index 00000000..c8a67bbd
--- /dev/null
+++ b/src/bincimapmime/mime-parseonlyheader.cc
@@ -0,0 +1,193 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    mime-parseonlyheader.cc
+ *  
+ *  Description:
+ *    Implementation of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#include "mime.h"
+#include "mime-utils.h"
+#include "mime-inputsource.h"
+#include "convert.h"
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+
+#ifndef NO_NAMESPACES
+using namespace ::std;
+#endif /* NO_NAMESPACES */
+
+//------------------------------------------------------------------------
+void Binc::MimeDocument::parseOnlyHeader(int fd)
+{
+  if (allIsParsed || headerIsParsed)
+    return;
+  
+  headerIsParsed = true;
+
+  delete doc_mimeSource;
+  doc_mimeSource = new MimeInputSource(fd);
+
+  headerstartoffsetcrlf = 0;
+  headerlength = 0;
+  bodystartoffsetcrlf = 0;
+  bodylength = 0;
+  messagerfc822 = false;
+  multipart = false;
+
+  nlines = 0;
+  nbodylines = 0;
+
+  doParseOnlyHeader(doc_mimeSource, "");
+}
+
+void Binc::MimeDocument::parseOnlyHeader(istream& s)
+{
+  if (allIsParsed || headerIsParsed)
+    return;
+  
+  headerIsParsed = true;
+
+  delete doc_mimeSource;
+  doc_mimeSource = new MimeInputSourceStream(s);
+
+  headerstartoffsetcrlf = 0;
+  headerlength = 0;
+  bodystartoffsetcrlf = 0;
+  bodylength = 0;
+  messagerfc822 = false;
+  multipart = false;
+
+  nlines = 0;
+  nbodylines = 0;
+
+  doParseOnlyHeader(doc_mimeSource, "");
+}
+
+//------------------------------------------------------------------------
+int Binc::MimePart::doParseOnlyHeader(MimeInputSource *ms, 
+				      const string &toboundary)
+{
+  mimeSource = ms;
+  string name;
+  string content;
+  char cqueue[4];
+  memset(cqueue, 0, sizeof(cqueue));
+
+  headerstartoffsetcrlf = mimeSource->getOffset();
+
+  bool quit = false;
+  char c = '\0';
+
+  while (!quit) {
+    // read name
+    while (1) {
+      if (!mimeSource->getChar(&c)) {
+	quit = true;
+	break;
+      }
+
+      if (c == '\n') ++nlines;
+      if (c == ':') break;
+      if (c == '\n') {
+	for (string::size_type i = name.length() - 1; i >= 0; --i)
+	  mimeSource->ungetChar();
+
+	quit = true;
+	name.clear();
+	break;
+      }
+
+      name += c;
+
+      if (name.length() == 2 && name.substr(0, 2) == "\r\n") {
+	name.clear();
+	quit = true;
+	break;
+      }
+    }
+
+    if (name.length() == 1 && name[0] == '\r') {
+      name.clear();
+      break;
+    }
+
+    if (quit) break;
+
+    while (!quit) {
+      if (!mimeSource->getChar(&c)) {
+	quit = true;
+	break;
+      }
+
+      if (c == '\n') ++nlines;
+
+      for (int i = 0; i < 3; ++i)
+	cqueue[i] = cqueue[i + 1];
+      cqueue[3] = c;
+
+      if (strncmp(cqueue, "\r\n\r\n", 4) == 0) {
+	quit = true;
+	break;
+      }
+
+      if (cqueue[2] == '\n') {
+
+	// guess the mime rfc says what can not appear on the beginning
+	// of a line.
+	if (!isspace(cqueue[3])) {
+	  if (content.length() > 2)
+	    content.resize(content.length() - 2);
+
+	  trim(content);
+	  h.add(name, content);
+
+	  name = c;
+	  content.clear();
+	  break;
+	}
+      }
+
+      content += c;
+    }
+  }
+
+  if (name != "") {
+    if (content.length() > 2)
+      content.resize(content.length() - 2);
+    h.add(name, content);
+  }
+
+  headerlength = mimeSource->getOffset() - headerstartoffsetcrlf;
+
+  return 1;
+}
diff --git a/src/bincimapmime/mime-printbody.cc b/src/bincimapmime/mime-printbody.cc
new file mode 100644
index 00000000..6f8268f6
--- /dev/null
+++ b/src/bincimapmime/mime-printbody.cc
@@ -0,0 +1,52 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    mime-printbody.cc
+ *  
+ *  Description:
+ *    Implementation of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+
+#include "mime.h"
+#include "mime-utils.h"
+#include "mime-inputsource.h"
+
+#include 
+
+using namespace ::std;
+
+void Binc::MimePart::getBody(string &s,
+			     unsigned int startoffset,
+			     unsigned int length) const
+{
+  mimeSource->reset();
+  mimeSource->seek(bodystartoffsetcrlf + startoffset);
+  s.reserve(length);
+  if (startoffset + length > bodylength)
+    length = bodylength - startoffset;
+
+  char c = '\0';
+  for (unsigned int i = 0; i < length; ++i) {
+    if (!mimeSource->getChar(&c))
+      break;
+
+    s += (char)c;
+  }
+}
diff --git a/src/bincimapmime/mime-utils.h b/src/bincimapmime/mime-utils.h
new file mode 100644
index 00000000..19b10b63
--- /dev/null
+++ b/src/bincimapmime/mime-utils.h
@@ -0,0 +1,55 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    mime.cc
+ *  
+ *  Description:
+ *    Implementation of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifndef mime_utils_h_included
+#define mime_utils_h_included
+
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#include 
+#include 
+#include 
+#include 
+
+#ifndef NO_NAMESPACES
+using namespace ::std;
+#endif /* NO_NAMESPACES */
+
+inline bool compareStringToQueue(const char *s_in, char *bqueue,
+				 int pos, int size)
+{
+  for (int i = 0; i < size; ++i)  {
+    if (s_in[i] != bqueue[pos])
+      return false;
+    if (++pos == size)
+      pos = 0;
+  }
+
+  return true;
+}
+
+#endif
diff --git a/src/bincimapmime/mime.cc b/src/bincimapmime/mime.cc
new file mode 100644
index 00000000..dfe858f7
--- /dev/null
+++ b/src/bincimapmime/mime.cc
@@ -0,0 +1,168 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    mime.cc
+ *  
+ *  Description:
+ *    Implementation of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#ifndef NO_NAMESPACES
+using namespace ::std;
+#endif /* NO_NAMESPACES */
+
+
+#include "mime.h"
+#include "convert.h"
+#include "mime-inputsource.h"
+
+//------------------------------------------------------------------------
+Binc::MimeDocument::MimeDocument(void)
+{
+  allIsParsed = false;
+  headerIsParsed = false;
+  doc_mimeSource = 0;
+}
+
+//------------------------------------------------------------------------
+Binc::MimeDocument::~MimeDocument(void)
+{
+  delete doc_mimeSource;
+  doc_mimeSource = 0;
+}
+
+//------------------------------------------------------------------------
+void Binc::MimeDocument::clear(void)
+{
+  members.clear();
+  h.clear();
+  headerIsParsed = false;
+  allIsParsed = false;
+  delete doc_mimeSource;
+  doc_mimeSource = 0;
+}
+
+//------------------------------------------------------------------------
+void Binc::MimePart::clear(void)
+{
+  members.clear();
+  h.clear();
+  mimeSource = 0;
+}
+
+//------------------------------------------------------------------------
+Binc::MimePart::MimePart(void)
+{
+  size = 0;
+  messagerfc822 = false;
+  multipart = false;
+
+  nlines = 0;
+  nbodylines = 0;
+  mimeSource = 0;
+}
+
+//------------------------------------------------------------------------
+Binc::MimePart::~MimePart(void)
+{
+}
+
+//------------------------------------------------------------------------
+Binc::HeaderItem::HeaderItem(void)
+{
+}
+
+//------------------------------------------------------------------------
+Binc::HeaderItem::HeaderItem(const string &key, const string &value)
+{
+  this->key = key;
+  this->value = value;
+}
+
+//------------------------------------------------------------------------
+Binc::Header::Header(void)
+{
+}
+
+//------------------------------------------------------------------------
+Binc::Header::~Header(void)
+{
+}
+
+//------------------------------------------------------------------------
+bool Binc::Header::getFirstHeader(const string &key, HeaderItem &dest) const
+{
+  string k = key;
+  lowercase(k);
+
+  for (vector::const_iterator i = content.begin();
+       i != content.end(); ++i) {
+    string tmp = (*i).getKey();
+    lowercase(tmp);
+
+    if (tmp == k) {
+      dest = *i;
+      return true;
+    }
+  }
+  return false;
+}
+
+//------------------------------------------------------------------------
+bool Binc::Header::getAllHeaders(const string &key, vector &dest) const
+{
+  string k = key;
+  lowercase(k);
+
+  for (vector::const_iterator i = content.begin();
+       i != content.end(); ++i) {
+    string tmp = (*i).getKey();
+    lowercase(tmp);
+    if (tmp == k)
+      dest.push_back(*i);
+  }
+
+  return (dest.size() != 0);
+}
+
+//------------------------------------------------------------------------
+void Binc::Header::clear(void)
+{
+  content.clear();
+}
+
+//------------------------------------------------------------------------
+void Binc::Header::add(const string &key, const string &value)
+{
+  content.push_back(HeaderItem(key, value));
+}
diff --git a/src/bincimapmime/mime.h b/src/bincimapmime/mime.h
new file mode 100644
index 00000000..75de6008
--- /dev/null
+++ b/src/bincimapmime/mime.h
@@ -0,0 +1,191 @@
+/* -*- mode:c++;c-basic-offset:2 -*- */
+/*  --------------------------------------------------------------------
+ *  Filename:
+ *    src/parsers/mime/mime.h
+ *  
+ *  Description:
+ *    Declaration of main mime parser components
+ *  --------------------------------------------------------------------
+ *  Copyright 2002-2005 Andreas Aardal Hanssen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *  --------------------------------------------------------------------
+ */
+#ifdef HAVE_CONFIG_H
+#include 
+#endif
+
+#ifndef mime_h_included
+#define mime_h_included
+#include 
+#include 
+#include 
+#include 
+
+namespace Binc {
+
+  class MimeInputSource;
+
+
+  //---------------------------------------------------------------------- 
+  class HeaderItem {
+  private:
+    mutable std::string key;
+    mutable std::string value;
+
+  public:
+    inline const std::string &getKey(void) const { return key; }
+    inline const std::string &getValue(void) const { return value; }
+
+    //--
+    HeaderItem(void);
+    HeaderItem(const std::string &key, const std::string &value);
+  };
+
+  //---------------------------------------------------------------------- 
+  class Header {
+  private:
+    mutable std::vector content;
+
+  public:
+    bool getFirstHeader(const std::string &key, HeaderItem &dest) const;
+    bool getAllHeaders(const std::string &key, std::vector &dest) const;
+    void add(const std::string &name, const std::string &content);
+    void clear(void);
+
+    //--
+    Header(void);
+    ~Header(void);
+  };
+
+  //----------------------------------------------------------------------
+  class IODevice;
+  class MimeDocument;
+  class MimePart {
+  protected:
+  public:
+    mutable bool multipart;
+    mutable bool messagerfc822;
+    mutable std::string subtype;
+    mutable std::string boundary;
+
+    mutable unsigned int headerstartoffsetcrlf;
+    mutable unsigned int headerlength;
+
+    mutable unsigned int bodystartoffsetcrlf;
+    mutable unsigned int bodylength;
+    mutable unsigned int nlines;
+    mutable unsigned int nbodylines;
+    mutable unsigned int size;
+
+  public:
+    enum FetchType {
+      FetchBody,
+      FetchHeader,
+      FetchMime
+    };
+
+    mutable Header h;
+
+    mutable std::vector members;
+
+    inline const std::string &getSubType(void) const { return subtype; }
+    inline bool isMultipart(void) const { return multipart; }
+    inline bool isMessageRFC822(void) const { return messagerfc822; }
+    inline unsigned int getSize(void) const { return bodylength; }
+    inline unsigned int getNofLines(void) const { return nlines; }
+    inline unsigned int getNofBodyLines(void) const { return nbodylines; }
+    inline unsigned int getBodyLength(void) const { return bodylength; }
+    inline unsigned int getBodyStartOffset(void) const { return bodystartoffsetcrlf; }
+
+    void printBody(Binc::IODevice &output, unsigned int startoffset, unsigned int length) const;
+      void getBody(std::string& s, unsigned int startoffset, unsigned int length) const;
+    virtual void clear(void);
+
+    virtual int doParseOnlyHeader(MimeInputSource *ms, 
+				  const std::string &toboundary);
+    virtual int doParseFull(MimeInputSource *ms, 
+			    const std::string &toboundary, int &boundarysize);
+
+    MimePart(void);
+    virtual ~MimePart(void);
+
+  private:
+    MimeInputSource *mimeSource;
+
+    bool parseOneHeaderLine(Binc::Header *header, unsigned int *nlines);
+
+    bool skipUntilBoundary(const std::string &delimiter,
+			   unsigned int *nlines, bool *eof);
+    inline void postBoundaryProcessing(bool *eof,
+				       unsigned int *nlines,
+				       int *boundarysize,
+				       bool *foundendofpart);
+      void parseMultipart(const std::string &boundary,
+			   const std::string &toboundary,
+			   bool *eof,
+			   unsigned int *nlines,
+			   int *boundarysize,
+			   bool *foundendofpart,
+			   unsigned int *bodylength,
+			  std::vector *members);
+      void parseSinglePart(const std::string &toboundary,
+			    int *boundarysize,
+			    unsigned int *nbodylines,
+			    unsigned int *nlines,
+			    bool *eof, bool *foundendofpart,
+			   unsigned int *bodylength);
+    void parseHeader(Binc::Header *header, unsigned int *nlines);
+    void analyzeHeader(Binc::Header *header, bool *multipart,
+		       bool *messagerfc822, std::string *subtype,
+		       std::string *boundary);
+    void parseMessageRFC822(std::vector *members,
+			    bool *foundendofpart,
+			    unsigned int *bodylength,
+			    unsigned int *nbodylines,
+			    const std::string &toboundary);
+  };
+
+  //----------------------------------------------------------------------
+  class MimeDocument : public MimePart {
+  public:
+    MimeDocument(void);
+    ~MimeDocument(void);
+
+    void parseOnlyHeader(int fd);
+    void parseFull(int fd);
+    void parseOnlyHeader(std::istream& s);
+    void parseFull(std::istream& s);
+
+    void clear(void);
+    
+    bool isHeaderParsed(void) const 
+    {
+      return headerIsParsed; 
+    }
+    bool isAllParsed(void) const 
+    { 
+      return allIsParsed; 
+    }
+
+  private:
+    bool headerIsParsed;
+    bool allIsParsed;
+    MimeInputSource *doc_mimeSource;
+  };
+
+};
+
+#endif
diff --git a/src/bincimapmime/trbinc.cc b/src/bincimapmime/trbinc.cc
new file mode 100644
index 00000000..fe2db3d1
--- /dev/null
+++ b/src/bincimapmime/trbinc.cc
@@ -0,0 +1,126 @@
+/* Copyright (C) 2006 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include 
+#include 
+#include 
+#include "safefcntl.h"
+#include "safeunistd.h"
+#include 
+
+#include 
+
+#ifndef NO_NAMESPACES
+using namespace std;
+#endif /* NO_NAMESPACES */
+
+#include "mime.h"
+
+static char *thisprog;
+
+static char usage [] =
+    "trbinc  \n\n"
+    ;
+static void
+Usage(void)
+{
+    fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_MOINS 0x1
+#define OPT_s	  0x2 
+#define OPT_b	  0x4 
+
+#define DEFCOUNT 10
+
+const char *hnames[] = {"Subject", "Content-type"};
+int nh = sizeof(hnames) / sizeof(char *);
+
+int main(int argc, char **argv)
+{
+    int count = DEFCOUNT;
+    
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 's':	op_flags |= OPT_s; break;
+	    case 'b':	op_flags |= OPT_b; if (argc < 2)  Usage();
+		if ((sscanf(*(++argv), "%d", &count)) != 1) 
+		    Usage(); 
+		argc--; 
+		goto b1;
+	    default: Usage();	break;
+	    }
+    b1: argc--; argv++;
+    }
+
+    if (argc != 1)
+	Usage();
+
+    char *mfile = *argv++;argc--;
+    int fd;
+    if ((fd = open(mfile, 0)) < 0) {
+	perror("Opening");
+	exit(1);
+    }
+    Binc::MimeDocument doc;
+
+#if 0
+    doc.parseFull(fd);
+#else
+    char *cp;
+    int size = lseek(fd, 0, SEEK_END);
+    lseek(fd, 0, 0);
+    fprintf(stderr, "Size: %d\n", size);
+    cp = (char *)malloc(size);
+    if (cp==0) {
+	fprintf(stderr, "Malloc %d failed\n", size);
+	exit(1);
+    }
+    int n;
+    if ((n=read(fd, cp, size)) != size) {
+	fprintf(stderr, "Read failed: requested %d, got %d\n", size, n);
+	exit(1);
+    }
+    std::stringstream s(string(cp, size), ios::in);
+    doc.parseFull(s);
+#endif
+
+    if (!doc.isHeaderParsed() && !doc.isAllParsed()) {
+	fprintf(stderr, "Parse error\n");
+	exit(1);
+    }
+    close(fd);
+    Binc::HeaderItem hi;
+    for (int i = 0; i < nh ; i++) {
+	if (!doc.h.getFirstHeader(hnames[i], hi)) {
+	    fprintf(stderr, "No %s\n", hnames[i]);
+	    exit(1);
+	}
+	printf("%s: %s\n", hnames[i], hi.getValue().c_str());
+    }
+    exit(0);
+}
diff --git a/src/common/Makefile b/src/common/Makefile
new file mode 100644
index 00000000..c30268bc
--- /dev/null
+++ b/src/common/Makefile
@@ -0,0 +1,33 @@
+
+PROGS = unacpp textsplit rclconfig syngroups
+
+all: $(PROGS) 
+
+UNACPP_OBJS= trunacpp.o
+unacpp : $(UNACPP_OBJS)
+	$(CXX) $(ALL_CXXFLAGS) -o unacpp $(UNACPP_OBJS) $(LIBRECOLL)
+trunacpp.o : unacpp.cpp unacpp.h
+	$(CXX) $(ALL_CXXFLAGS) -DTEST_UNACPP -c -o trunacpp.o unacpp.cpp
+
+TEXTSPLIT_OBJS= trtextsplit.o  
+textsplit : $(TEXTSPLIT_OBJS)
+	$(CXX) $(ALL_CXXFLAGS) -o textsplit $(TEXTSPLIT_OBJS) $(LIBRECOLL)
+trtextsplit.o : textsplit.cpp 
+	$(CXX) $(ALL_CXXFLAGS) -DTEST_TEXTSPLIT -c -o trtextsplit.o \
+	       textsplit.cpp
+
+RCLCONFIG_OBJS= trrclconfig.o 
+rclconfig : $(RCLCONFIG_OBJS) 
+	$(CXX) $(ALL_CXXFLAGS) -o rclconfig $(RCLCONFIG_OBJS) $(LIBRECOLL) 
+trrclconfig.o : rclconfig.cpp 
+	$(CXX) $(ALL_CXXFLAGS) -DTEST_RCLCONFIG -c -o trrclconfig.o \
+	       rclconfig.cpp
+
+SYNGROUPS_OBJS= trsyngroups.o 
+syngroups : $(SYNGROUPS_OBJS) 
+	$(CXX) $(ALL_CXXFLAGS) -o syngroups $(SYNGROUPS_OBJS) $(LIBRECOLL) 
+trsyngroups.o : syngroups.cpp 
+	$(CXX) $(ALL_CXXFLAGS) -DTEST_SYNGROUPS -c -o trsyngroups.o \
+	       syngroups.cpp
+
+include ../utils/utmkdefs.mk
diff --git a/src/common/autoconfig-win.h b/src/common/autoconfig-win.h
new file mode 100644
index 00000000..349a2b98
--- /dev/null
+++ b/src/common/autoconfig-win.h
@@ -0,0 +1,186 @@
+/* Manually edited version of autoconfig.h for windows. Many things are
+overriden in the c++ code by ifdefs _WIN32 anyway  */
+#ifndef _AUTOCONFIG_H_INCLUDED
+#define _AUTOCONFIG_H_INCLUDED
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* Path to the aspell api include file */
+/* #undef ASPELL_INCLUDE "aspell-local.h" */
+
+/* Path to the aspell program */
+/* #define ASPELL_PROG "/usr/bin/aspell" */
+
+/* No X11 session monitoring support */
+#define DISABLE_X11MON
+
+/* Path to the fam api include file */
+/* #undef FAM_INCLUDE */
+
+/* Path to the file program */
+#define FILE_PROG "/usr/bin/file"
+
+/* "Have C++0x" */
+#undef HAVE_CXX0X_UNORDERED
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#define HAVE_LIBDL 1
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_LIBPTHREAD 1
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkdtemp' function. */
+/* #undef HAVE_MKDTEMP */
+
+/* Define to 1 if you have the `posix_spawn,' function. */
+/* #undef HAVE_POSIX_SPAWN_ */
+
+/* Define to 1 if you have the `setrlimit' function. */
+#define HAVE_SETRLIMIT 1
+
+/* Has std::shared_ptr */
+#define HAVE_SHARED_PTR_STD
+
+/* Has std::tr1::shared_ptr */
+/* #undef HAVE_SHARED_PTR_TR1 */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SPAWN_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_MOUNT_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_PARAM_H_ */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_STATFS_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_STATVFS_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_VFS_H */
+
+/* "Have tr1" */
+/* #undef HAVE_TR1_UNORDERED */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_UNISTD_H */
+
+/* Use multiple threads for indexing */
+#define IDX_THREADS 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "Recoll"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "Recoll 1.22.0"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "recoll"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.22.0"
+
+/* putenv parameter is const */
+/* #undef PUTENV_ARG_CONST */
+
+/* iconv parameter 2 is const char** */
+#define RCL_ICONV_INBUF_CONST 1
+
+/* Real time monitoring option */
+#undef RCL_MONITOR
+
+/* Split camelCase words */
+/* #undef RCL_SPLIT_CAMELCASE */
+
+/* Compile the aspell interface */
+/* #undef RCL_USE_ASPELL */
+
+/* Compile the fam interface */
+/* #undef RCL_USE_FAM */
+
+/* Compile the inotify interface */
+#define RCL_USE_INOTIFY 1
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Use posix_spawn() */
+/* #undef USE_POSIX_SPAWN */
+
+/* Enable using the system's 'file' command to id mime if we fail internally
+   */
+/* #undef USE_SYSTEM_FILE_COMMAND */
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+/* #  undef WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* Define to 1 if the X Window System is missing or not being used. */
+/* #undef X_DISPLAY_MISSING */
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+#define DISABLE_WEB_INDEXER
+
+#include "conf_post.h"
+#endif // already included
diff --git a/src/common/autoconfig.h.in b/src/common/autoconfig.h.in
new file mode 100644
index 00000000..e6ced0ff
--- /dev/null
+++ b/src/common/autoconfig.h.in
@@ -0,0 +1,181 @@
+/* common/autoconfig.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Path to the aspell api include file */
+#undef ASPELL_INCLUDE
+
+/* Path to the aspell program */
+#undef ASPELL_PROG
+
+/* No X11 session monitoring support */
+#undef DISABLE_X11MON
+
+/* Path to the fam api include file */
+#undef FAM_INCLUDE
+
+/* Path to the file program */
+#undef FILE_PROG
+
+/* "Have C++0x" */
+#undef HAVE_CXX0X_UNORDERED
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the `z' library (-lz). */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkdtemp' function. */
+#undef HAVE_MKDTEMP
+
+/* Define to 1 if you have the `posix_spawn,' function. */
+#undef HAVE_POSIX_SPAWN_
+
+/* Define to 1 if you have the `setrlimit' function. */
+#undef HAVE_SETRLIMIT
+
+/* Has std::shared_ptr */
+#undef HAVE_SHARED_PTR_STD
+
+/* Has std::tr1::shared_ptr */
+#undef HAVE_SHARED_PTR_TR1
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SPAWN_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_MOUNT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_PARAM_H_
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_STATFS_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_STATVFS_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_VFS_H
+
+/* "Have tr1" */
+#undef HAVE_TR1_UNORDERED
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_UNISTD_H
+
+/* Use multiple threads for indexing */
+#undef IDX_THREADS
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* putenv parameter is const */
+#undef PUTENV_ARG_CONST
+
+/* iconv parameter 2 is const char** */
+#undef RCL_ICONV_INBUF_CONST
+
+/* Real time monitoring option */
+#undef RCL_MONITOR
+
+/* Split camelCase words */
+#undef RCL_SPLIT_CAMELCASE
+
+/* Compile the aspell interface */
+#undef RCL_USE_ASPELL
+
+/* Compile the fam interface */
+#undef RCL_USE_FAM
+
+/* Compile the inotify interface */
+#undef RCL_USE_INOTIFY
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Use posix_spawn() */
+#undef USE_POSIX_SPAWN
+
+/* Enable using the system's 'file' command to id mime if we fail internally
+   */
+#undef USE_SYSTEM_FILE_COMMAND
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+#include "conf_post.h"
diff --git a/src/common/beaglequeuecache.cpp b/src/common/beaglequeuecache.cpp
new file mode 100644
index 00000000..99b165b5
--- /dev/null
+++ b/src/common/beaglequeuecache.cpp
@@ -0,0 +1,95 @@
+/* Copyright (C) 2011 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include "autoconfig.h"
+
+#include "cstr.h"
+#include "beaglequeuecache.h"
+#include "circache.h"
+#include "debuglog.h"
+#include "rclconfig.h"
+#include "pathut.h"
+#include "rcldoc.h"
+
+const string cstr_bgc_mimetype("mimetype");
+
+BeagleQueueCache::BeagleQueueCache(RclConfig *cnf) 
+{
+    string ccdir;
+    cnf->getConfParam("webcachedir", ccdir);
+    if (ccdir.empty())
+        ccdir = "webcache";
+    ccdir = path_tildexpand(ccdir);
+    // If not an absolute path, compute relative to config dir
+    if (!path_isabsolute(ccdir))
+        ccdir = path_cat(cnf->getConfDir(), ccdir);
+
+    int maxmbs = 40;
+    cnf->getConfParam("webcachemaxmbs", &maxmbs);
+    if ((m_cache = new CirCache(ccdir)) == 0) {
+	LOGERR(("BeagleQueueCache: cant create CirCache object\n"));
+	return;
+    }
+    if (!m_cache->create(off_t(maxmbs)*1000*1024, CirCache::CC_CRUNIQUE)) {
+	LOGERR(("BeagleQueueCache: cache file creation failed: %s\n",
+		m_cache->getReason().c_str()));
+	delete m_cache;
+	m_cache = 0;
+	return;
+    }
+}
+
+BeagleQueueCache::~BeagleQueueCache()
+{
+    delete m_cache;
+}
+
+// Read  document from cache. Return the metadata as an Rcl::Doc
+// @param htt Beagle Hit Type 
+bool BeagleQueueCache::getFromCache(const string& udi, Rcl::Doc &dotdoc, 
+				    string& data, string *htt)
+{
+    string dict;
+
+    if (m_cache == 0) {
+	LOGERR(("BeagleQueueCache::getFromCache: cache is null\n"));
+	return false;
+    }
+    if (!m_cache->get(udi, dict, data)) {
+	LOGDEB(("BeagleQueueCache::getFromCache: get failed\n"));
+	return false;
+    }
+
+    ConfSimple cf(dict, 1);
+    
+    if (htt)
+        cf.get(Rcl::Doc::keybght, *htt, cstr_null);
+
+    // Build a doc from saved metadata 
+    cf.get(cstr_url, dotdoc.url, cstr_null);
+    cf.get(cstr_bgc_mimetype, dotdoc.mimetype, cstr_null);
+    cf.get(cstr_fmtime, dotdoc.fmtime, cstr_null);
+    cf.get(cstr_fbytes, dotdoc.pcbytes, cstr_null);
+    dotdoc.sig.clear();
+    vector names = cf.getNames(cstr_null);
+    for (vector::const_iterator it = names.begin();
+         it != names.end(); it++) {
+        cf.get(*it, dotdoc.meta[*it], cstr_null);
+    }
+    dotdoc.meta[Rcl::Doc::keyudi] = udi;
+    return true;
+}
diff --git a/src/common/beaglequeuecache.h b/src/common/beaglequeuecache.h
new file mode 100644
index 00000000..5297d61c
--- /dev/null
+++ b/src/common/beaglequeuecache.h
@@ -0,0 +1,50 @@
+/* Copyright (C) 2009 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _beaglequeuecache_h_included_
+#define _beaglequeuecache_h_included_
+
+#include 
+using std::string;
+
+class RclConfig;
+namespace Rcl {
+    class Db;
+    class Doc;
+}
+class CirCache;
+
+/**
+ * Manage the CirCache for the Beagle Queue indexer. Separated from the main
+ * indexer code because it's also used for querying (getting the data for a
+ * preview 
+ */
+class BeagleQueueCache {
+public:
+    BeagleQueueCache(RclConfig *config);
+    ~BeagleQueueCache();
+
+    bool getFromCache(const string& udi, Rcl::Doc &doc, string& data,
+                      string *hittype = 0);
+    // We could write proxies for all the circache ops, but why bother?
+    CirCache *cc() {return m_cache;}
+
+private:
+    CirCache *m_cache;
+};
+extern const string cstr_bgc_mimetype;
+
+#endif /* _beaglequeuecache_h_included_ */
diff --git a/src/common/conf_post.h b/src/common/conf_post.h
new file mode 100644
index 00000000..57d3cff9
--- /dev/null
+++ b/src/common/conf_post.h
@@ -0,0 +1,67 @@
+#ifdef  HAVE_CXX0X_UNORDERED
+#  define UNORDERED_MAP_INCLUDE 
+#  define UNORDERED_SET_INCLUDE 
+#  define STD_UNORDERED_MAP std::unordered_map
+#  define STD_UNORDERED_SET std::unordered_set
+#elif defined(HAVE_TR1_UNORDERED)
+#  define UNORDERED_MAP_INCLUDE 
+#  define UNORDERED_SET_INCLUDE 
+#  define STD_UNORDERED_MAP std::tr1::unordered_map
+#  define STD_UNORDERED_SET std::tr1::unordered_set
+#else
+#  define UNORDERED_MAP_INCLUDE 
+#  define UNORDERED_SET_INCLUDE 
+#  define STD_UNORDERED_MAP std::map
+#  define STD_UNORDERED_SET std::set
+#endif
+
+#ifdef HAVE_SHARED_PTR_STD
+#  define MEMORY_INCLUDE 
+#  define STD_SHARED_PTR    std::shared_ptr
+#elif defined(HAVE_SHARED_PTR_TR1)
+#  define MEMORY_INCLUDE 
+#  define STD_SHARED_PTR    std::tr1::shared_ptr
+#else
+#  define MEMORY_INCLUDE "refcntr.h"
+#  define STD_SHARED_PTR    RefCntr
+#endif
+
+#ifdef _WIN32
+#include "safewindows.h"
+typedef int pid_t;
+inline int readlink(const char *cp, void *buf, int cnt) {
+	return -1;
+}
+#define HAVE_STRUCT_TIMESPEC
+#define strdup _strdup
+#define timegm _mkgmtime
+#ifdef _MSC_VER
+// gmtime is supposedly thread-safe on windows
+#define gmtime_r(A, B) gmtime(A)
+#define localtime_r(A,B) localtime(A)
+#define PATH_MAX MAX_PATH
+#define MAXPATHLEN PATH_MAX
+typedef int mode_t;
+#endif
+
+typedef DWORD32 u_int32_t;
+typedef DWORD64 u_int64_t;
+typedef unsigned __int8 u_int8_t;
+typedef int ssize_t;
+#define strncasecmp _strnicmp
+#define strcasecmp _stricmp
+#define ftruncate _chsize_s
+#define chdir _chdir
+
+#define R_OK 4
+#define W_OK 2
+#define X_OK 4
+#define RECOLL_DATADIR "C:\\recoll\\"
+#define S_ISLNK(X) false
+#define lstat stat
+#define fseeko _fseeki64 
+#define ftello (off_t)_ftelli64
+#define timegm _mkgmtime
+#endif
+
+
diff --git a/src/common/cstr.cpp b/src/common/cstr.cpp
new file mode 100644
index 00000000..0119e809
--- /dev/null
+++ b/src/common/cstr.cpp
@@ -0,0 +1,6 @@
+
+#include "cstr.h"
+#define RCLIN_CSTR_CPPFILE
+#undef _CSTR_H_INCLUDED_
+#include "cstr.h"
+
diff --git a/src/common/cstr.h b/src/common/cstr.h
new file mode 100644
index 00000000..c3c55ca1
--- /dev/null
+++ b/src/common/cstr.h
@@ -0,0 +1,86 @@
+/* Copyright (C) 2011 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef _CSTR_H_INCLUDED_
+#define _CSTR_H_INCLUDED_
+
+// recoll mostly uses STL strings. In many places we had automatic
+// conversion from a C string to an STL one. This costs, and can
+// become significant if used often.
+//
+// This file and the associated .cpp file declares/defines constant
+// strings used in the program. Strings are candidates for a move here
+// when they are used in a fast loop or are shared.
+
+#include 
+using std::string;
+
+// The following slightly hacky preprocessing directives and the
+// companion code in the cpp file looks complicated, but it just
+// ensures that we only have to write the strings once to get the
+// extern declaration and the definition.
+#ifdef RCLIN_CSTR_CPPFILE
+#undef DEF_CSTR
+#define DEF_CSTR(NM, STR) const string cstr_##NM(STR)
+#else
+#define DEF_CSTR(NM, STR) extern const string cstr_##NM
+#endif
+
+DEF_CSTR(caption, "caption");
+DEF_CSTR(colon, ":");
+DEF_CSTR(dmtime, "dmtime");
+DEF_CSTR(dquote, "\"");
+DEF_CSTR(fbytes, "fbytes");
+DEF_CSTR(fileu, "file://");
+DEF_CSTR(fmtime, "fmtime");
+DEF_CSTR(iso_8859_1, "ISO-8859-1");
+DEF_CSTR(utf8, "UTF-8");
+DEF_CSTR(cp1252, "CP1252");
+DEF_CSTR(minwilds, "*?[");
+DEF_CSTR(newline, "\n");
+DEF_CSTR(null, "");
+DEF_CSTR(plus, "+");
+DEF_CSTR(textplain, "text/plain");
+DEF_CSTR(url, "url");
+// Marker for HTML format fields
+DEF_CSTR(fldhtm, "\007");
+// Characters that can -begin- a wildcard or regexp expression. 
+DEF_CSTR(wildSpecStChars, "*?[");
+DEF_CSTR(regSpecStChars, "(.[{");
+
+// Values used as keys inside Dijon::Filter::metaData[]. This structure is 
+// used to store all data generated by format-translating filters. It is
+// different from Rcl::Doc for mostly historical reasons. The translation
+// from Filter to Doc occurs inside internfile.cpp
+DEF_CSTR(dj_keyds, "description");
+DEF_CSTR(dj_keyfn, "filename");
+DEF_CSTR(dj_keymd, "modificationdate");
+DEF_CSTR(dj_keyorigcharset, "origcharset");
+DEF_CSTR(dj_keytitle, "title");
+DEF_CSTR(dj_keyrecipient, "recipient");
+DEF_CSTR(dj_keymsgid, "msgid");
+DEF_CSTR(dj_keyabstract, "abstract");
+DEF_CSTR(dj_keyauthor, "author");
+DEF_CSTR(dj_keycharset, "charset");
+DEF_CSTR(dj_keycontent, "content");
+DEF_CSTR(dj_keyipath, "ipath");
+DEF_CSTR(dj_keymd5, "md5");
+DEF_CSTR(dj_keymt, "mimetype");
+DEF_CSTR(dj_keydocsize, "docsize");
+DEF_CSTR(dj_keyanc, "rclanc");
+
+#endif /* _CSTR_H_INCLUDED_ */
diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp
new file mode 100644
index 00000000..0b93f888
--- /dev/null
+++ b/src/common/rclconfig.cpp
@@ -0,0 +1,1680 @@
+/* Copyright (C) 2004 J.F.Dockes 
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef TEST_RCLCONFIG
+#include "autoconfig.h"
+
+#include 
+#include 
+#ifndef _WIN32
+#include 
+#include 
+#endif
+#include 
+#include "safesysstat.h"
+#include "safeunistd.h"
+#ifdef __FreeBSD__
+#include 
+#endif
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "cstr.h"
+#include "pathut.h"
+#include "rclconfig.h"
+#include "conftree.h"
+#include "debuglog.h"
+#include "smallut.h"
+#include "textsplit.h"
+#include "readfile.h"
+#include "fstreewalk.h"
+#include "cpuconf.h"
+#include "execmd.h"
+
+using namespace std;
+
+typedef pair RclPII;
+
+// Static, logically const, RclConfig members are initialized once from the
+// first object build during process initialization.
+
+// We default to a case- and diacritics-less index for now
+bool o_index_stripchars = true;
+
+bool o_uptodate_test_use_mtime = false;
+
+string RclConfig::o_localecharset; 
+string RclConfig::o_origcwd; 
+
+bool ParamStale::needrecompute()
+{
+    LOGDEB2(("ParamStale:: needrecompute. parent gen %d mine %d\n", 
+	     parent->m_keydirgen, savedkeydirgen));
+    if (active && parent->m_keydirgen != savedkeydirgen) {
+	LOGDEB2(("ParamState:: needrecompute. conffile %p\n", conffile));
+
+        savedkeydirgen = parent->m_keydirgen;
+        string newvalue;
+        if (!conffile)
+            return false;
+        conffile->get(paramname, newvalue, parent->m_keydir);
+        if (newvalue.compare(savedvalue)) {
+            savedvalue = newvalue;
+	    LOGDEB2(("ParamState:: needrecompute. return true newvalue [%s]\n",
+		     newvalue.c_str()));
+            return true;
+        }
+    }
+    return false;
+}
+
+void ParamStale::init(ConfNull *cnf)
+{
+    conffile = cnf;
+    active = false;
+    if (conffile)
+      active = conffile->hasNameAnywhere(paramname);
+    savedkeydirgen = -1;
+}
+
+ParamStale::ParamStale(RclConfig *rconf, const string& nm)
+    : parent(rconf), conffile(0), paramname(nm),
+      active(false), savedkeydirgen(-1)
+{
+}
+
+void RclConfig::zeroMe() {
+    m_ok = false; 
+    m_keydirgen = 0;
+    m_conf = 0; 
+    mimemap = 0; 
+    mimeconf = 0; 
+    mimeview = 0; 
+    m_fields = 0;
+    m_ptrans = 0;
+    m_stopsuffixes = 0;
+    m_maxsufflen = 0;
+
+    m_oldstpsuffstate.init(0);
+    m_stpsuffstate.init(0);
+    m_skpnstate.init(0);
+    m_rmtstate.init(0);
+    m_xmtstate.init(0);
+    m_mdrstate.init(0);
+}
+
+bool RclConfig::isDefaultConfig() const
+{
+    string defaultconf = path_cat(path_homedata(),
+                                  path_defaultrecollconfsubdir());
+    string specifiedconf = path_canon(m_confdir);
+    path_catslash(specifiedconf);
+    return !defaultconf.compare(specifiedconf);
+}
+
+RclConfig::RclConfig(const string *argcnf)
+    : m_oldstpsuffstate(this, "recoll_noindex"),
+      m_stpsuffstate(this, "noContentSuffixes"),
+      m_skpnstate(this, "skippedNames"),
+      m_rmtstate(this, "indexedmimetypes"),
+      m_xmtstate(this, "excludedmimetypes"),
+      m_mdrstate(this, "metadatacmds")
+{
+    zeroMe();
+
+    if (o_origcwd.empty()) {
+	char buf[MAXPATHLEN];
+	if (getcwd(buf, MAXPATHLEN)) {
+	    o_origcwd = string(buf);
+	} else {
+	    fprintf(stderr, "recollxx: can't retrieve current working directory: relative path translations will fail\n");
+	}
+    }
+
+    // Compute our data dir name, typically /usr/local/share/recoll
+    m_datadir = path_sharedatadir();
+    // We only do the automatic configuration creation thing for the default
+    // config dir, not if it was specified through -c or RECOLL_CONFDIR
+    bool autoconfdir = false;
+
+    // Command line config name overrides environment
+    if (argcnf && !argcnf->empty()) {
+	m_confdir = path_absolute(*argcnf);
+	if (m_confdir.empty()) {
+	    m_reason = 
+		string("Cant turn [") + *argcnf + "] into absolute path";
+	    return;
+	}
+    } else {
+	const char *cp = getenv("RECOLL_CONFDIR");
+	if (cp) {
+	    m_confdir = path_canon(cp);
+	} else {
+	    autoconfdir = true;
+	    m_confdir = path_cat(path_homedata(), path_defaultrecollconfsubdir());
+	}
+    }
+
+    // Note: autoconfdir and isDefaultConfig() are normally the same. We just 
+    // want to avoid the imperfect test in isDefaultConfig() if we actually know
+    // this is the default conf
+    if (!autoconfdir && !isDefaultConfig()) {
+	if (!path_exists(m_confdir)) {
+	    m_reason = "Explicitly specified configuration "
+		"directory must exist"
+		" (won't be automatically created). Use mkdir first";
+	    return;
+	}
+    }
+
+    if (!path_exists(m_confdir)) {
+	if (!initUserConfig()) 
+	    return;
+    }
+
+    // This can't change once computed inside a process. It would be
+    // nicer to move this to a static class initializer to avoid
+    // possible threading issues but this doesn't work (tried) as
+    // things would not be ready. In practise we make sure that this
+    // is called from the main thread at once, by constructing a config
+    // from recollinit
+    if (o_localecharset.empty()) {
+#ifndef _WIN32
+	const char *cp;
+	cp = nl_langinfo(CODESET);
+	// We don't keep US-ASCII. It's better to use a superset
+	// Ie: me have a C locale and some french file names, and I
+	// can't imagine a version of iconv that couldn't translate
+	// from iso8859?
+	// The 646 thing is for solaris. 
+	if (cp && *cp && strcmp(cp, "US-ASCII") 
+#ifdef sun
+	    && strcmp(cp, "646")
+#endif
+	    ) {
+	    o_localecharset = string(cp);
+	} else {
+	    // Use cp1252 instead of iso-8859-1, it's a superset.
+	    o_localecharset = string(cstr_cp1252);
+	}
+#else
+        o_localecharset = "UTF-8";
+#endif
+	LOGDEB1(("RclConfig::getDefCharset: localecharset [%s]\n",
+		 o_localecharset.c_str()));
+    }
+
+    const char *cp;
+
+    // Additional config directory, values override user ones
+    if ((cp = getenv("RECOLL_CONFTOP"))) {
+	m_cdirs.push_back(cp);
+    } 
+
+    // User config
+    m_cdirs.push_back(m_confdir);
+
+    // Additional config directory, overrides system's, overridden by user's
+    if ((cp = getenv("RECOLL_CONFMID"))) {
+	m_cdirs.push_back(cp);
+    } 
+
+    // Base/installation config
+    m_cdirs.push_back(path_cat(m_datadir, "examples"));
+
+    string cnferrloc;
+    for (vector::const_iterator it = m_cdirs.begin();
+	 it != m_cdirs.end(); it++) {
+	if (it != m_cdirs.begin())
+	    cnferrloc += string(" or ");
+	cnferrloc += *it;
+    }
+
+    // Read and process "recoll.conf"
+    if (!updateMainConfig())
+	return;
+    // Other files
+    mimemap = new ConfStack("mimemap", m_cdirs, true);
+    if (mimemap == 0 || !mimemap->ok()) {
+	m_reason = string("No or bad mimemap file in: ") + cnferrloc;
+	return;
+    }
+    mimeconf = new ConfStack("mimeconf", m_cdirs, true);
+    if (mimeconf == 0 || !mimeconf->ok()) {
+	m_reason = string("No/bad mimeconf in: ") + cnferrloc;
+	return;
+    }
+    mimeview = new ConfStack("mimeview", m_cdirs, false);
+    if (mimeview == 0)
+	mimeview = new ConfStack("mimeview", m_cdirs, true);
+    if (mimeview == 0 || !mimeview->ok()) {
+	m_reason = string("No/bad mimeview in: ") + cnferrloc;
+	return;
+    }
+    if (!readFieldsConfig(cnferrloc))
+	return;
+
+    // Default is no threading
+    m_thrConf = create_vector
+	(RclPII(-1, 0))(RclPII(-1, 0))(RclPII(-1, 0));
+
+    m_ptrans = new ConfSimple(path_cat(m_confdir, "ptrans").c_str());
+
+    m_ok = true;
+    setKeyDir(cstr_null);
+
+    m_oldstpsuffstate.init(mimemap);
+    m_stpsuffstate.init(m_conf);
+    m_skpnstate.init(m_conf);
+    m_rmtstate.init(m_conf);
+    m_xmtstate.init(m_conf);
+    m_mdrstate.init(m_conf);
+
+    return;
+}
+
+bool RclConfig::updateMainConfig()
+{
+    ConfStack *newconf = 
+	new ConfStack("recoll.conf", m_cdirs, true);
+    if (newconf == 0 || !newconf->ok()) {
+	if (m_conf)
+	    return false;
+	string where;
+	stringsToString(m_cdirs, where);
+	m_reason = string("No/bad main configuration file in: ") + where;
+	m_ok = false;
+        m_skpnstate.init(0);
+        m_rmtstate.init(0);
+        m_xmtstate.init(0);
+        m_mdrstate.init(0);
+	return false;
+    }
+
+    delete m_conf;
+    m_conf = newconf;
+
+    m_skpnstate.init(m_conf);
+    m_rmtstate.init(m_conf);
+    m_xmtstate.init(m_conf);
+    m_mdrstate.init(m_conf);
+
+    setKeyDir(cstr_null);
+
+    bool bvalue = false;
+    if (getConfParam("nocjk", &bvalue) && bvalue == true) {
+	TextSplit::cjkProcessing(false);
+    } else {
+	int ngramlen;
+	if (getConfParam("cjkngramlen", &ngramlen)) {
+	    TextSplit::cjkProcessing(true, (unsigned int)ngramlen);
+	} else {
+	    TextSplit::cjkProcessing(true);
+	}
+    }
+
+    bvalue = false;
+    if (getConfParam("nonumbers", &bvalue) && bvalue == true) {
+	TextSplit::noNumbers();
+    }
+
+    bvalue = false;
+    if (getConfParam("dehyphenate", &bvalue)) {
+	TextSplit::deHyphenate(bvalue);
+    }
+
+    bvalue = true;
+    if (getConfParam("skippedPathsFnmPathname", &bvalue) && bvalue == false) {
+	FsTreeWalker::setNoFnmPathname();
+    }
+
+    static int m_index_stripchars_init = 0;
+    if (!m_index_stripchars_init) {
+	getConfParam("indexStripChars", &o_index_stripchars);
+        getConfParam("testmodifusemtime", &o_uptodate_test_use_mtime);
+	m_index_stripchars_init = 1;
+    }
+
+    return true;
+}
+
+ConfNull *RclConfig::cloneMainConfig()
+{
+    ConfNull *conf = new ConfStack("recoll.conf", m_cdirs, false);
+    if (conf == 0 || !conf->ok()) {
+	m_reason = string("Can't read config");
+	return 0;
+    }
+    return conf;
+}
+
+// Remember what directory we're under (for further conf->get()s), and 
+// prefetch a few common values.
+void RclConfig::setKeyDir(const string &dir) 
+{
+    if (!dir.compare(m_keydir))
+        return;
+
+    m_keydirgen++;
+    m_keydir = dir;
+    if (m_conf == 0)
+	return;
+
+    if (!m_conf->get("defaultcharset", m_defcharset, m_keydir))
+	m_defcharset.erase();
+}
+
+bool RclConfig::getConfParam(const string &name, int *ivp, bool shallow) const
+{
+    string value;
+    if (!getConfParam(name, value, shallow))
+	return false;
+    errno = 0;
+    long lval = strtol(value.c_str(), 0, 0);
+    if (lval == 0 && errno)
+	return 0;
+    if (ivp)
+	*ivp = int(lval);
+    return true;
+}
+
+bool RclConfig::getConfParam(const string &name, bool *bvp, bool shallow) const
+{
+    if (!bvp) 
+	return false;
+
+    *bvp = false;
+    string s;
+    if (!getConfParam(name, s, shallow))
+	return false;
+    *bvp = stringToBool(s);
+    return true;
+}
+
+bool RclConfig::getConfParam(const string &name, vector *svvp,
+    bool shallow) const
+{
+    if (!svvp) 
+	return false;
+    svvp->clear();
+    string s;
+    if (!getConfParam(name, s, shallow))
+	return false;
+    return stringToStrings(s, *svvp);
+}
+
+bool RclConfig::getConfParam(const string &name, vector *vip,
+    bool shallow) const
+{
+    if (!vip) 
+	return false;
+    vip->clear();
+    vector vs;
+    if (!getConfParam(name, &vs, shallow))
+	return false;
+    vip->reserve(vs.size());
+    for (unsigned int i = 0; i < vs.size(); i++) {
+	char *ep;
+	vip->push_back(strtol(vs[i].c_str(), &ep, 0));
+	if (ep == vs[i].c_str()) {
+	    LOGDEB(("RclConfig::getConfParam: bad int value in [%s]\n",
+		    name.c_str()));
+	    return false;
+	}
+    }
+    return true;
+}
+
+void RclConfig::initThrConf()
+{
+    // Default is no threading
+    m_thrConf = create_vector
+	(RclPII(-1, 0))(RclPII(-1, 0))(RclPII(-1, 0));
+
+    vector vq;
+    vector vt;
+    if (!getConfParam("thrQSizes", &vq)) {
+	LOGINFO(("RclConfig::initThrConf: no thread info (queues)\n"));
+	goto out;
+    }
+
+    // If the first queue size is 0, autoconf is requested.
+    if (vq.size() > 0 && vq[0] == 0) {
+	LOGDEB(("RclConfig::initThrConf: autoconf requested\n"));
+	CpuConf cpus;
+	if (!getCpuConf(cpus) || cpus.ncpus < 1) {
+	    LOGERR(("RclConfig::initThrConf: could not retrieve cpu conf\n"));
+	    cpus.ncpus = 1;
+	}
+	// Arbitrarily set threads config based on number of CPUS. This also
+	// depends on the IO setup actually, so we're bound to be wrong...
+	if (cpus.ncpus == 1) {
+	    // Somewhat counter-intuitively (because of possible IO//)
+	    // it seems that the best config here is no threading
+	} else if (cpus.ncpus < 4) {
+	    // Untested so let's guess...
+	    m_thrConf = create_vector
+		(RclPII(2, 2))(RclPII(2, 2))(RclPII(2, 1));
+	} else if (cpus.ncpus < 6) {
+	    m_thrConf = create_vector
+		(RclPII(2, 4))(RclPII(2, 2))(RclPII(2, 1));
+	} else {
+	    m_thrConf = create_vector
+		(RclPII(2, 5))(RclPII(2, 3))(RclPII(2, 1));
+	}
+	goto out;
+    } else if (vq.size() > 0 && vq[0] < 0) {
+	// threads disabled by config
+	goto out;
+    }
+
+    if (!getConfParam("thrTCounts", &vt) ) {
+	LOGINFO(("RclConfig::initThrConf: no thread info (threads)\n"));
+	goto out;
+    }
+
+    if (vq.size() != 3 || vt.size() != 3) {
+	LOGINFO(("RclConfig::initThrConf: bad thread info vector sizes\n"));
+	goto out;
+    }
+
+    // Normal case: record info from config
+    m_thrConf.clear();
+    for (unsigned int i = 0; i < 3; i++) {
+	m_thrConf.push_back(RclPII(vq[i], vt[i]));
+    }
+
+out:
+    ostringstream sconf;
+    for (unsigned int i = 0; i < 3; i++) {
+	sconf << "(" << m_thrConf[i].first << ", " << m_thrConf[i].second <<
+	    ") ";
+    }
+
+    LOGDEB(("RclConfig::initThrConf: chosen config (ql,nt): %s\n", 
+	    sconf.str().c_str()));
+}
+
+pair RclConfig::getThrConf(ThrStage who) const
+{
+    if (m_thrConf.size() != 3) {
+	LOGERR(("RclConfig::getThrConf: bad data in rclconfig\n"));
+	return pair(-1,-1);
+    }
+    return m_thrConf[who];
+}
+
+vector RclConfig::getTopdirs() const
+{
+    vector tdl;
+    if (!getConfParam("topdirs", &tdl)) {
+	LOGERR(("RclConfig::getTopdirs: no top directories in config or "
+		"bad list format\n"));
+	return tdl;
+    }
+
+    for (vector::iterator it = tdl.begin(); it != tdl.end(); it++) {
+	*it = path_tildexpand(*it);
+	*it = path_canon(*it);
+    }
+    return tdl;
+}
+
+// Get charset to be used for transcoding to utf-8 if unspecified by doc
+// For document contents:
+//  If defcharset was set (from the config or a previous call, this
+//   is done in setKeydir), use it.
+//  Else, try to guess it from the locale
+//  Use cp1252 (as a superset of iso8859-1) as ultimate default
+//
+// For filenames, same thing except that we do not use the config file value
+// (only the locale).
+const string& RclConfig::getDefCharset(bool filename) const
+{
+    if (filename) {
+	return o_localecharset;
+    } else {
+	return m_defcharset.empty() ? o_localecharset : m_defcharset;
+    }
+}
+
+// Get all known document mime values. We get them from the mimeconf
+// 'index' submap.
+// It's quite possible that there are other mime types in the index
+// (defined in mimemap and not mimeconf, or output by "file -i"). We
+// just ignore them, because there may be myriads, and their contents
+// are not indexed. 
+//
+// This unfortunately means that searches by file names and mime type
+// filtering don't work well together.
+vector RclConfig::getAllMimeTypes() const
+{
+    return mimeconf ? mimeconf->getNames("index") : vector();
+}
+
+// Things for suffix comparison. We define a string class and string 
+// comparison with suffix-only sensitivity
+class SfString {
+public:
+    SfString(const string& s) : m_str(s) {}
+    bool operator==(const SfString& s2) {
+	string::const_reverse_iterator r1 = m_str.rbegin(), re1 = m_str.rend(),
+	    r2 = s2.m_str.rbegin(), re2 = s2.m_str.rend();
+	while (r1 != re1 && r2 != re2) {
+	    if (*r1 != *r2) {
+		return 0;
+	    }
+	    ++r1; ++r2;
+	}
+	return 1;
+    }
+    string m_str;
+};
+
+class SuffCmp {
+public:
+    int operator()(const SfString& s1, const SfString& s2) {
+	//cout << "Comparing " << s1.m_str << " and " << s2.m_str << endl;
+	string::const_reverse_iterator 
+	    r1 = s1.m_str.rbegin(), re1 = s1.m_str.rend(),
+	    r2 = s2.m_str.rbegin(), re2 = s2.m_str.rend();
+	while (r1 != re1 && r2 != re2) {
+	    if (*r1 != *r2) {
+		return *r1 < *r2 ? 1 : 0;
+	    }
+	    ++r1; ++r2;
+	}
+	return 0;
+    }
+};
+typedef multiset SuffixStore;
+
+#define STOPSUFFIXES ((SuffixStore *)m_stopsuffixes)
+
+bool RclConfig::inStopSuffixes(const string& fni)
+{
+    LOGDEB2(("RclConfig::inStopSuffixes(%s)\n", fni.c_str()));
+    // Beware: both needrecompute() need to be called always hence the
+    // bizarre way we do things
+    bool needrecompute = m_stpsuffstate.needrecompute();
+    needrecompute = m_oldstpsuffstate.needrecompute() || needrecompute;
+    if (needrecompute || m_stopsuffixes == 0) {
+	// Need to initialize the suffixes
+        delete STOPSUFFIXES;
+	if ((m_stopsuffixes = new SuffixStore) == 0) {
+	    LOGERR(("RclConfig::inStopSuffixes: out of memory\n"));
+	    return false;
+	}
+        // Let the old customisation have priority: if recoll_noindex
+        // from mimemap is set, it the user's (the default value is
+        // gone). Else use the new variable
+	vector stoplist;
+        if (!m_oldstpsuffstate.savedvalue.empty()) {
+            stringToStrings(m_oldstpsuffstate.savedvalue, stoplist);
+        } else {
+            stringToStrings(m_stpsuffstate.savedvalue, stoplist);
+        }
+	for (vector::const_iterator it = stoplist.begin(); 
+	     it != stoplist.end(); it++) {
+	    STOPSUFFIXES->insert(SfString(stringtolower(*it)));
+	    if (m_maxsufflen < it->length())
+		m_maxsufflen = int(it->length());
+	}
+    }
+
+    // Only need a tail as long as the longest suffix.
+    int pos = MAX(0, int(fni.length() - m_maxsufflen));
+    string fn(fni, pos);
+
+    stringtolower(fn);
+    SuffixStore::const_iterator it = STOPSUFFIXES->find(fn);
+    if (it != STOPSUFFIXES->end()) {
+	LOGDEB2(("RclConfig::inStopSuffixes: Found (%s) [%s]\n", 
+		fni.c_str(), (*it).m_str.c_str()));
+	return true;
+    } else {
+	LOGDEB2(("RclConfig::inStopSuffixes: not found [%s]\n", fni.c_str()));
+	return false;
+    }
+}
+
+string RclConfig::getMimeTypeFromSuffix(const string& suff) const
+{
+    string mtype;
+    mimemap->get(suff, mtype, m_keydir);
+    return mtype;
+}
+
+string RclConfig::getSuffixFromMimeType(const string &mt) const
+{
+    string suffix;
+    vectorsfs = mimemap->getNames(cstr_null);
+    string mt1;
+    for (vector::const_iterator it = sfs.begin(); 
+	 it != sfs.end(); it++) {
+	if (mimemap->get(*it, mt1, cstr_null))
+	    if (!stringicmp(mt, mt1))
+		return *it;
+    }
+    return cstr_null;
+}
+
+/** Get list of file categories from mimeconf */
+bool RclConfig::getMimeCategories(vector& cats) const
+{
+    if (!mimeconf)
+	return false;
+    cats = mimeconf->getNames("categories");
+    return true;
+}
+
+bool RclConfig::isMimeCategory(string& cat) const
+{
+    vectorcats;
+    getMimeCategories(cats);
+    for (vector::iterator it = cats.begin(); it != cats.end(); it++) {
+	if (!stringicmp(*it,cat))
+	    return true;
+    }
+    return false;
+}
+
+/** Get list of mime types for category from mimeconf */
+bool RclConfig::getMimeCatTypes(const string& cat, vector& tps) const
+{
+    tps.clear();
+    if (!mimeconf)
+	return false;
+    string slist;
+    if (!mimeconf->get(cat, slist, "categories"))
+	return false;
+
+    stringToStrings(slist, tps);
+    return true;
+}
+
+string RclConfig::getMimeHandlerDef(const string &mtype, bool filtertypes)
+{
+    string hs;
+
+    if (filtertypes) {
+        if(m_rmtstate.needrecompute()) {
+            m_restrictMTypes.clear();
+            stringToStrings(stringtolower((const string&)m_rmtstate.savedvalue),
+                            m_restrictMTypes);
+        }
+        if (m_xmtstate.needrecompute()) {
+            m_excludeMTypes.clear();
+            stringToStrings(stringtolower((const string&)m_xmtstate.savedvalue),
+                            m_excludeMTypes);
+        }
+        if (!m_restrictMTypes.empty() && 
+            !m_restrictMTypes.count(stringtolower(mtype))) {
+            LOGDEB2(("RclConfig::getMimeHandlerDef: not in mime type list\n"));
+            return hs;
+        }
+        if (!m_excludeMTypes.empty() && 
+            m_excludeMTypes.count(stringtolower(mtype))) {
+            LOGDEB2(("RclConfig::getMimeHandlerDef: in excluded mime list\n"));
+            return hs;
+        }
+    }
+
+    if (!mimeconf->get(mtype, hs, "index")) {
+	LOGDEB1(("getMimeHandler: no handler for '%s'\n", mtype.c_str()));
+    }
+    return hs;
+}
+
+const vector& RclConfig::getMDReapers()
+{
+    string hs;
+    if (m_mdrstate.needrecompute()) {
+        m_mdreapers.clear();
+	// New value now stored in m_mdrstate.savedvalue
+	string& sreapers = m_mdrstate.savedvalue;
+	if (sreapers.empty())
+	  return m_mdreapers;
+	string value;
+	ConfSimple attrs;
+	valueSplitAttributes(sreapers, value, attrs);
+	vector nmlst = attrs.getNames(cstr_null);
+	for (vector::const_iterator it = nmlst.begin();
+	     it != nmlst.end(); it++) {
+	  MDReaper reaper;
+	  reaper.fieldname = fieldCanon(*it);
+	  string s;
+	  attrs.get(*it, s);
+	  stringToStrings(s, reaper.cmdv);
+	  m_mdreapers.push_back(reaper);
+	}
+    }
+    return m_mdreapers;
+}
+
+bool RclConfig::getGuiFilterNames(vector& cats) const
+{
+    if (!mimeconf)
+	return false;
+    cats = mimeconf->getNamesShallow("guifilters");
+    return true;
+}
+
+bool RclConfig::getGuiFilter(const string& catfiltername, string& frag) const
+{
+    frag.clear();
+    if (!mimeconf)
+	return false;
+    if (!mimeconf->get(catfiltername, frag, "guifilters"))
+	return false;
+    return true;
+}
+
+bool RclConfig::valueSplitAttributes(const string& whole, string& value, 
+				     ConfSimple& attrs)
+{
+    /* There is currently no way to escape a semi-colon */
+    string::size_type semicol0 = whole.find_first_of(";");
+    value = whole.substr(0, semicol0);
+    trimstring(value);
+    string attrstr;
+    if (semicol0 != string::npos && semicol0 < whole.size() - 1) {
+        attrstr = whole.substr(semicol0+1);
+    }
+
+    // Handle additional attributes. We substitute the semi-colons
+    // with newlines and use a ConfSimple
+    if (!attrstr.empty()) {
+        for (string::size_type i = 0; i < attrstr.size(); i++) {
+            if (attrstr[i] == ';')
+                attrstr[i] = '\n';
+	}
+        attrs.reparse(attrstr);
+    } else {
+	attrs.clear();
+    }
+    
+    return true;
+}
+
+bool RclConfig::getMissingHelperDesc(string& out) const
+{
+    string fmiss = path_cat(getConfDir(), "missing");
+    out.clear();
+    if (!file_to_string(fmiss, out))
+	return false;
+    return true;
+}
+
+void RclConfig::storeMissingHelperDesc(const string &s)
+{
+    string fmiss = path_cat(getConfDir(), "missing");
+    FILE *fp = fopen(fmiss.c_str(), "w");
+    if (fp) {
+	if (s.size() > 0 && fwrite(s.c_str(), s.size(), 1, fp) != 1) {
+            LOGERR(("storeMissingHelperDesc: fwrite failed\n"));
+        }
+	fclose(fp);
+    }
+}
+
+// Read definitions for field prefixes, aliases, and hierarchy and arrange 
+// things for speed (theses are used a lot during indexing)
+bool RclConfig::readFieldsConfig(const string& cnferrloc)
+{
+    LOGDEB2(("RclConfig::readFieldsConfig\n"));
+    m_fields = new ConfStack("fields", m_cdirs, true);
+    if (m_fields == 0 || !m_fields->ok()) {
+	m_reason = string("No/bad fields file in: ") + cnferrloc;
+	return false;
+    }
+
+    // Build a direct map avoiding all indirections for field to
+    // prefix translation
+    // Add direct prefixes from the [prefixes] section
+    vectortps = m_fields->getNames("prefixes");
+    for (vector::const_iterator it = tps.begin(); 
+	 it != tps.end(); it++) {
+	string val;
+	m_fields->get(*it, val, "prefixes");
+	ConfSimple attrs;
+	FieldTraits ft;
+	if (!valueSplitAttributes(val, ft.pfx, attrs)) {
+	    LOGERR(("readFieldsConfig: bad config line for [%s]: [%s]\n", 
+		    it->c_str(), val.c_str()));
+	    return 0;
+	}
+	string tval;
+	if (attrs.get("wdfinc", tval))
+	    ft.wdfinc = atoi(tval.c_str());
+	if (attrs.get("boost", tval))
+	    ft.boost = atof(tval.c_str());
+	if (attrs.get("pfxonly", tval))
+	    ft.pfxonly = stringToBool(tval);
+	if (attrs.get("noterms", tval))
+	    ft.noterms = stringToBool(tval);
+	m_fldtotraits[stringtolower(*it)] = ft;
+	LOGDEB2(("readFieldsConfig: [%s] -> [%s] %d %.1f\n", 
+		it->c_str(), ft.pfx.c_str(), ft.wdfinc, ft.boost));
+    }
+
+    // Add prefixes for aliases and build alias-to-canonic map while
+    // we're at it. Having the aliases in the prefix map avoids an
+    // additional indirection at index time.
+    tps = m_fields->getNames("aliases");
+    for (vector::const_iterator it = tps.begin(); 
+         it != tps.end(); it++){
+	string canonic = stringtolower(*it); // canonic name
+	FieldTraits ft;
+	map::const_iterator pit = 
+	    m_fldtotraits.find(canonic);
+	if (pit != m_fldtotraits.end()) {
+	    ft = pit->second;
+	}
+	string aliases;
+	m_fields->get(canonic, aliases, "aliases");
+	vector l;
+	stringToStrings(aliases, l);
+	for (vector::const_iterator ait = l.begin();
+	     ait != l.end(); ait++) {
+	    if (pit != m_fldtotraits.end())
+		m_fldtotraits[stringtolower(*ait)] = ft;
+	    m_aliastocanon[stringtolower(*ait)] = canonic;
+	}
+    }
+
+    // Query aliases map
+    tps = m_fields->getNames("queryaliases");
+    for (vector::const_iterator it = tps.begin(); 
+         it != tps.end(); it++){
+	string canonic = stringtolower(*it); // canonic name
+	string aliases;
+	m_fields->get(canonic, aliases, "queryaliases");
+	vector l;
+	stringToStrings(aliases, l);
+	for (vector::const_iterator ait = l.begin();
+	     ait != l.end(); ait++) {
+	    m_aliastoqcanon[stringtolower(*ait)] = canonic;
+	}
+    }
+
+#if 0
+    for (map::const_iterator it = m_fldtotraits.begin();
+	 it != m_fldtotraits.end(); it++) {
+	LOGDEB(("readFieldsConfig: [%s] -> [%s] %d %.1f\n", 
+		it->c_str(), it->second.pfx.c_str(), it->second.wdfinc, 
+		it->second.boost));
+    }
+#endif
+
+    vector sl = m_fields->getNames("stored");
+    if (!sl.empty()) {
+	for (vector::const_iterator it = sl.begin(); 
+	     it != sl.end(); it++) {
+	    string fld = fieldCanon(stringtolower(*it));
+	    m_storedFields.insert(fld);
+	}
+    }
+
+    // Extended file attribute to field translations
+    vectorxattrs = m_fields->getNames("xattrtofields");
+    for (vector::const_iterator it = xattrs.begin(); 
+	 it != xattrs.end(); it++) {
+	string val;
+	m_fields->get(*it, val, "xattrtofields");
+	m_xattrtofld[*it] = val;
+    }
+
+    return true;
+}
+
+// Return specifics for field name:
+bool RclConfig::getFieldTraits(const string& _fld, const FieldTraits **ftpp,
+    bool isquery) const
+{
+    string fld = isquery ? fieldQCanon(_fld) : fieldCanon(_fld);
+    map::const_iterator pit = m_fldtotraits.find(fld);
+    if (pit != m_fldtotraits.end()) {
+	*ftpp = &pit->second;
+	LOGDEB1(("RclConfig::getFieldTraits: [%s]->[%s]\n", 
+		 _fld.c_str(), pit->second.pfx.c_str()));
+	return true;
+    } else {
+	LOGDEB1(("RclConfig::getFieldTraits: no prefix for field [%s]\n",
+		 fld.c_str()));
+	*ftpp = 0;
+	return false;
+    }
+}
+
+set RclConfig::getIndexedFields() const
+{
+    set flds;
+    if (m_fields == 0)
+	return flds;
+
+    vector sl = m_fields->getNames("prefixes");
+    flds.insert(sl.begin(), sl.end());
+    return flds;
+}
+
+string RclConfig::fieldCanon(const string& f) const
+{
+    string fld = stringtolower(f);
+    map::const_iterator it = m_aliastocanon.find(fld);
+    if (it != m_aliastocanon.end()) {
+	LOGDEB1(("RclConfig::fieldCanon: [%s] -> [%s]\n", 
+		 f.c_str(), it->second.c_str()));
+	return it->second;
+    }
+    LOGDEB1(("RclConfig::fieldCanon: [%s] -> [%s]\n", f.c_str(), fld.c_str()));
+    return fld;
+}
+
+string RclConfig::fieldQCanon(const string& f) const
+{
+    string fld = stringtolower(f);
+    map::const_iterator it = m_aliastoqcanon.find(fld);
+    if (it != m_aliastoqcanon.end()) {
+	LOGDEB1(("RclConfig::fieldQCanon: [%s] -> [%s]\n", 
+                f.c_str(), it->second.c_str()));
+	return it->second;
+    }
+    return fieldCanon(f);
+}
+
+vector RclConfig::getFieldSectNames(const string &sk, const char* patrn)
+    const
+{
+    if (m_fields == 0)
+        return vector();
+    return m_fields->getNames(sk, patrn);
+}
+
+bool RclConfig::getFieldConfParam(const string &name, const string &sk, 
+                                  string &value) const
+{
+    if (m_fields == 0)
+        return false;
+    return m_fields->get(name, value, sk);
+}
+
+string RclConfig::getMimeViewerAllEx() const
+{
+    string hs;
+    if (mimeview == 0)
+	return hs;
+    mimeview->get("xallexcepts", hs, "");
+    return hs;
+}
+
+bool RclConfig::setMimeViewerAllEx(const string& allex)
+{
+    if (mimeview == 0)
+        return false;
+    if (!mimeview->set("xallexcepts", allex, "")) {
+	m_reason = string("RclConfig:: cant set value. Readonly?");
+	return false;
+    }
+
+    return true;
+}
+
+string RclConfig::getMimeViewerDef(const string &mtype, const string& apptag,
+				   bool useall) const
+{
+    LOGDEB2(("RclConfig::getMimeViewerDef: mtype [%s] apptag [%s]\n",
+	     mtype.c_str(), apptag.c_str()));
+    string hs;
+    if (mimeview == 0)
+	return hs;
+
+    if (useall) {
+	// Check for exception
+	string excepts = getMimeViewerAllEx();
+	vector vex;
+	stringToTokens(excepts, vex);
+	bool isexcept = false;
+	for (vector::iterator it = vex.begin();
+	     it != vex.end(); it++) {
+	    vector mita;
+	    stringToTokens(*it, mita, "|");
+	    if ((mita.size() == 1 && apptag.empty() && mita[0] == mtype) ||
+		(mita.size() == 2 && mita[1] == apptag && mita[0] == mtype)) {
+		// Exception to x-all
+		isexcept = true;
+		break;
+	    }
+	}
+
+	if (isexcept == false) {
+	    mimeview->get("application/x-all", hs, "view");
+	    return hs;
+	}
+	// Fallthrough to normal case.
+    }
+
+    if (apptag.empty() || !mimeview->get(mtype + string("|") + apptag,
+                                         hs, "view"))
+        mimeview->get(mtype, hs, "view");
+    return hs;
+}
+
+bool RclConfig::getMimeViewerDefs(vector >& defs) const
+{
+    if (mimeview == 0)
+	return false;
+    vectortps = mimeview->getNames("view");
+    for (vector::const_iterator it = tps.begin(); 
+	 it != tps.end();it++) {
+	defs.push_back(pair(*it, getMimeViewerDef(*it, "", 0)));
+    }
+    return true;
+}
+
+bool RclConfig::setMimeViewerDef(const string& mt, const string& def)
+{
+    if (mimeview == 0)
+        return false;
+    bool status;
+    if (!def.empty()) 
+	status = mimeview->set(mt, def, "view");
+    else 
+	status = mimeview->erase(mt, "view");
+
+    if (!status) {
+	m_reason = string("RclConfig:: cant set value. Readonly?");
+	return false;
+    }
+    return true;
+}
+
+bool RclConfig::mimeViewerNeedsUncomp(const string &mimetype) const
+{
+    string s;
+    vector v;
+    if (mimeview != 0 && mimeview->get("nouncompforviewmts", s, "") && 
+        stringToStrings(s, v) && 
+        find_if(v.begin(), v.end(), StringIcmpPred(mimetype)) != v.end()) 
+        return false;
+    return true;
+}
+
+string RclConfig::getMimeIconPath(const string &mtype, const string &apptag)
+    const
+{
+    string iconname;
+    if (!apptag.empty())
+	mimeconf->get(mtype + string("|") + apptag, iconname, "icons");
+    if (iconname.empty())
+        mimeconf->get(mtype, iconname, "icons");
+    if (iconname.empty())
+	iconname = "document";
+
+    string iconpath;
+#if defined (__FreeBSD__) && __FreeBSD_version < 500000
+    // gcc 2.95 dies if we call getConfParam here ??
+    if (m_conf) m_conf->get(string("iconsdir"), iconpath, m_keydir);
+#else
+    getConfParam("iconsdir", iconpath);
+#endif
+
+    if (iconpath.empty()) {
+	iconpath = path_cat(m_datadir, "images");
+    } else {
+	iconpath = path_tildexpand(iconpath);
+    }
+    return path_cat(iconpath, iconname) + ".png";
+}
+
+// Return path defined by varname. May be absolute or relative to
+// confdir, with default in confdir
+string RclConfig::getConfdirPath(const char *varname, const char *dflt) const
+{
+    string result;
+    if (!getConfParam(varname, result)) {
+	result = path_cat(getConfDir(), dflt);
+    } else {
+	result = path_tildexpand(result);
+	// If not an absolute path, compute relative to config dir
+	if (!path_isabsolute(result)) {
+	    result = path_cat(getConfDir(), result);
+	}
+    }
+    return path_canon(result);
+
+}
+
+string RclConfig::getDbDir() const
+{
+    return getConfdirPath("dbdir", "xapiandb");
+}
+
+string RclConfig::getStopfile() const
+{
+    return getConfdirPath("stoplistfile", "stoplist.txt");
+}
+
+string RclConfig::getSynGroupsFile() const
+{
+    return getConfdirPath("syngroupsfile", "syngroups.txt");
+}
+
+// The index status file is fast changing, so it's possible to put it outside
+// of the config directory (for ssds, not sure this is really useful).
+string RclConfig::getIdxStatusFile() const
+{
+    return getConfdirPath("idxstatusfile", "idxstatus.txt");
+}
+
+void RclConfig::urlrewrite(const string& dbdir, string& url) const
+{
+    LOGDEB2(("RclConfig::urlrewrite: dbdir [%s] url [%s]\n",
+	    dbdir.c_str(), url.c_str()));
+
+    // Do path translations exist for this index ?
+    if (m_ptrans == 0 || !m_ptrans->hasSubKey(dbdir)) {
+	LOGDEB2(("RclConfig::urlrewrite: no paths translations (m_ptrans %p)\n",
+		m_ptrans));
+	return;
+    }
+
+    string path = fileurltolocalpath(url);
+    if (path.empty()) {
+	LOGDEB2(("RclConfig::urlrewrite: not file url\n"));
+	return;
+    }
+
+    // For each translation check if the prefix matches the input path,
+    // replace and return the result if it does.
+    vector opaths = m_ptrans->getNames(dbdir);
+    for (vector::const_iterator it = opaths.begin(); 
+	 it != opaths.end(); it++) {
+	if (it->size() <= path.size() && !path.compare(0, it->size(), *it)) {
+	    string npath;
+	    // This call always succeeds because the key comes from getNames()
+	    if (m_ptrans->get(*it, npath, dbdir)) { 
+		path = path.replace(0, it->size(), npath);
+		url = path_pathtofileurl(path);
+	    }
+	    break;
+	}
+    }
+}
+
+bool RclConfig::sourceChanged() const
+{
+    if (m_conf && m_conf->sourceChanged())
+	return true;
+    if (mimemap && mimemap->sourceChanged())
+	return true;
+    if (mimeconf && mimeconf->sourceChanged())
+	return true;
+    if (mimeview && mimeview->sourceChanged())
+	return true;
+    if (m_fields && m_fields->sourceChanged())
+	return true;
+    if (m_ptrans && m_ptrans->sourceChanged())
+	return true;
+    return false;
+}
+
+string RclConfig::getPidfile() const
+{
+    return path_cat(getConfDir(), "index.pid");
+}
+
+string RclConfig::getWebQueueDir() const
+{
+    string webqueuedir;
+    if (!getConfParam("webqueuedir", webqueuedir))
+	webqueuedir = "~/.recollweb/ToIndex/";
+    webqueuedir = path_tildexpand(webqueuedir);
+    return webqueuedir;
+}
+
+vector& RclConfig::getSkippedNames()
+{
+    if (m_skpnstate.needrecompute()) {
+	stringToStrings(m_skpnstate.savedvalue, m_skpnlist);
+    }
+    return m_skpnlist;
+}
+
+vector RclConfig::getSkippedPaths() const
+{
+    vector skpl;
+    getConfParam("skippedPaths", &skpl);
+
+    // Always add the dbdir and confdir to the skipped paths. This is 
+    // especially important for the rt monitor which will go into a loop if we
+    // don't do this.
+    skpl.push_back(getDbDir());
+    skpl.push_back(getConfDir());
+    // And the web queue dir
+    skpl.push_back(getWebQueueDir());
+    for (vector::iterator it = skpl.begin(); it != skpl.end(); it++) {
+	*it = path_tildexpand(*it);
+	*it = path_canon(*it);
+    }
+    sort(skpl.begin(), skpl.end());
+    vector::iterator uit = unique(skpl.begin(), skpl.end());
+    skpl.resize(uit - skpl.begin());
+    return skpl;
+}
+
+vector RclConfig::getDaemSkippedPaths() const
+{
+    vector dskpl;
+    getConfParam("daemSkippedPaths", &dskpl);
+
+    for (vector::iterator it = dskpl.begin(); it != dskpl.end(); it++) {
+	*it = path_tildexpand(*it);
+	*it = path_canon(*it);
+    }
+
+    vector skpl1 = getSkippedPaths();
+    vector skpl;
+    if (dskpl.empty()) {
+	skpl = skpl1;
+    } else {
+	sort(dskpl.begin(), dskpl.end());
+	merge(dskpl.begin(), dskpl.end(), skpl1.begin(), skpl1.end(), 
+	      skpl.begin());
+	vector::iterator uit = unique(skpl.begin(), skpl.end());
+	skpl.resize(uit - skpl.begin());
+    }
+    return skpl;
+}
+
+
+// Look up an executable filter.  We add $RECOLL_FILTERSDIR,
+// and filtersdir from the config file to the PATH, then use execmd::which()
+string RclConfig::findFilter(const string &icmd) const
+{
+    // If the path is absolute, this is it
+    if (path_isabsolute(icmd))
+	return icmd;
+
+    const char *cp = getenv("PATH");
+    if (!cp) //??
+        cp = "";
+    string PATH(cp);
+
+    // For historical reasons: check in personal config directory
+    PATH = getConfDir() + path_PATHsep() + PATH;
+
+    string temp;
+    // Prepend $datadir/filters
+    temp = path_cat(m_datadir, "filters");
+    PATH = temp + path_PATHsep() + PATH;
+
+    // Prepend possible configuration parameter?
+    if (getConfParam(string("filtersdir"), temp)) {
+        temp = path_tildexpand(temp);
+        PATH = temp + path_PATHsep() + PATH;
+    }
+
+    // Prepend possible environment variable
+    if ((cp = getenv("RECOLL_FILTERSDIR"))) {
+        PATH = string(cp) + path_PATHsep() + PATH;
+    } 
+
+    string cmd;
+    if (ExecCmd::which(icmd, cmd, PATH.c_str())) {
+        return cmd;
+    } else {
+        // Let the shell try to find it...
+        return icmd;
+    }
+}
+
+/** 
+ * Return decompression command line for given mime type
+ */
+bool RclConfig::getUncompressor(const string &mtype, vector& cmd) const
+{
+    string hs;
+
+    mimeconf->get(mtype, hs, cstr_null);
+    if (hs.empty())
+	return false;
+    vector tokens;
+    stringToStrings(hs, tokens);
+    if (tokens.empty()) {
+	LOGERR(("getUncompressor: empty spec for mtype %s\n", mtype.c_str()));
+	return false;
+    }
+    vector::iterator it = tokens.begin();
+    if (tokens.size() < 2)
+	return false;
+    if (stringlowercmp("uncompress", *it++)) 
+	return false;
+    cmd.clear();
+    cmd.push_back(findFilter(*it++));
+    cmd.insert(cmd.end(), it, tokens.end());
+    return true;
+}
+
+static const char blurb0[] = 
+"# The system-wide configuration files for recoll are located in:\n"
+"#   %s\n"
+"# The default configuration files are commented, you should take a look\n"
+"# at them for an explanation of what can be set (you could also take a look\n"
+"# at the manual instead).\n"
+"# Values set in this file will override the system-wide values for the file\n"
+"# with the same name in the central directory. The syntax for setting\n"
+"# values is identical.\n"
+    ;
+
+// Use uni2ascii -a K to generate these from the utf-8 strings
+// Swedish and Danish. 
+static const char swedish_ex[] = "unac_except_trans = \303\244\303\244 \303\204\303\244 \303\266\303\266 \303\226\303\266 \303\274\303\274 \303\234\303\274 \303\237ss \305\223oe \305\222oe \303\246ae \303\206ae \357\254\201fi \357\254\202fl \303\245\303\245 \303\205\303\245";
+// German:
+static const char german_ex[] = "unac_except_trans = \303\244\303\244 \303\204\303\244 \303\266\303\266 \303\226\303\266 \303\274\303\274 \303\234\303\274 \303\237ss \305\223oe \305\222oe \303\246ae \303\206ae \357\254\201fi \357\254\202fl";
+
+// Create initial user config by creating commented empty files
+static const char *configfiles[] = {"recoll.conf", "mimemap", "mimeconf", 
+				    "mimeview"};
+static int ncffiles = sizeof(configfiles) / sizeof(char *);
+bool RclConfig::initUserConfig()
+{
+    // Explanatory text
+    const int bs = sizeof(blurb0)+PATH_MAX+1;
+    char blurb[bs];
+    string exdir = path_cat(m_datadir, "examples");
+    snprintf(blurb, bs, blurb0, exdir.c_str());
+
+    // Use protective 700 mode to create the top configuration
+    // directory: documents can be reconstructed from index data.
+    if (!path_exists(m_confdir) && 
+	mkdir(m_confdir.c_str(), 0700) < 0) {
+	m_reason += string("mkdir(") + m_confdir + ") failed: " + 
+	    strerror(errno);
+	return false;
+    }
+    string lang = localelang();
+    for (int i = 0; i < ncffiles; i++) {
+	string dst = path_cat(m_confdir, string(configfiles[i])); 
+	if (!path_exists(dst)) {
+	    FILE *fp = fopen(dst.c_str(), "w");
+	    if (fp) {
+		fprintf(fp, "%s\n", blurb);
+		if (!strcmp(configfiles[i], "recoll.conf")) {
+		    // Add improved unac_except_trans for some languages
+		    if (lang == "se" || lang == "dk" || lang == "no" || 
+			lang == "fi") {
+			fprintf(fp, "%s\n", swedish_ex);
+		    } else if (lang == "de") {
+			fprintf(fp, "%s\n", german_ex);
+		    }
+		}
+		fclose(fp);
+	    } else {
+		m_reason += string("fopen ") + dst + ": " + strerror(errno);
+		return false;
+	    }
+	}
+    }
+    return true;
+}
+
+void RclConfig::freeAll() 
+{
+    delete m_conf;
+    delete mimemap;
+    delete mimeconf; 
+    delete mimeview; 
+    delete m_fields;
+    delete m_ptrans;
+    delete STOPSUFFIXES;
+    // just in case
+    zeroMe();
+}
+
+void RclConfig::initFrom(const RclConfig& r)
+{
+    zeroMe();
+    if (!(m_ok = r.m_ok))
+	return;
+    m_reason = r.m_reason;
+    m_confdir = r.m_confdir;
+    m_datadir = r.m_datadir;
+    m_keydir = r.m_keydir;
+    m_cdirs = r.m_cdirs;
+    if (r.m_conf)
+	m_conf = new ConfStack(*(r.m_conf));
+    if (r.mimemap)
+	mimemap = new ConfStack(*(r.mimemap));
+    if (r.mimeconf)
+	mimeconf = new ConfStack(*(r.mimeconf));
+    if (r.mimeview)
+	mimeview = new ConfStack(*(r.mimeview));
+    if (r.m_fields)
+	m_fields = new ConfStack(*(r.m_fields));
+    if (r.m_ptrans)
+	m_ptrans = new ConfSimple(*(r.m_ptrans));
+    m_fldtotraits = r.m_fldtotraits;
+    m_aliastocanon = r.m_aliastocanon;
+    m_aliastoqcanon = r.m_aliastoqcanon;
+    m_storedFields = r.m_storedFields;
+    m_xattrtofld = r.m_xattrtofld;
+    if (r.m_stopsuffixes)
+	m_stopsuffixes = new SuffixStore(*((SuffixStore*)r.m_stopsuffixes));
+    m_maxsufflen = r.m_maxsufflen;
+    m_defcharset = r.m_defcharset;
+
+    m_oldstpsuffstate.init(mimemap);
+    m_stpsuffstate.init(m_conf);
+    m_skpnstate.init(m_conf);
+    m_rmtstate.init(m_conf);
+    m_xmtstate.init(m_conf);
+    m_mdrstate.init(m_conf);
+
+    m_thrConf = r.m_thrConf;
+}
+
+#else // -> Test
+
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+using namespace std;
+
+#include "debuglog.h"
+#include "rclinit.h"
+#include "rclconfig.h"
+#include "cstr.h"
+
+static char *thisprog;
+
+static char usage [] = "\n"
+"-c: check a few things in the configuration files\n"
+"[-s subkey] -q param : query parameter value\n"
+"-f : print some field data\n"
+"  : default: print parameters\n"
+
+;
+static void
+Usage(void)
+{
+    fprintf(stderr, "%s: usage: %s\n", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_MOINS 0x1
+#define OPT_s	  0x2 
+#define OPT_q	  0x4 
+#define OPT_c     0x8
+#define OPT_f     0x10
+
+int main(int argc, char **argv)
+{
+    string pname, skey;
+    
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 'c':	op_flags |= OPT_c; break;
+	    case 'f':	op_flags |= OPT_f; break;
+	    case 's':	op_flags |= OPT_s; if (argc < 2)  Usage();
+		skey = *(++argv);
+		argc--; 
+		goto b1;
+	    case 'q':	op_flags |= OPT_q; if (argc < 2)  Usage();
+		pname = *(++argv);
+		argc--; 
+		goto b1;
+	    default: Usage();	break;
+	    }
+    b1: argc--; argv++;
+    }
+
+    if (argc != 0)
+	Usage();
+
+    string reason;
+    RclConfig *config = recollinit(0, 0, reason);
+    if (config == 0 || !config->ok()) {
+	cerr << "Configuration problem: " << reason << endl;
+	exit(1);
+    }
+    if (op_flags & OPT_s)
+	config->setKeyDir(skey);
+    if (op_flags & OPT_q) {
+	string value;
+	if (!config->getConfParam(pname, value)) {
+	    fprintf(stderr, "getConfParam failed for [%s]\n", pname.c_str());
+	    exit(1);
+	}
+	printf("[%s] -> [%s]\n", pname.c_str(), value.c_str());
+    } else if (op_flags & OPT_f) {
+	set stored = config->getStoredFields();
+	set indexed = config->getIndexedFields();
+	cout << "Stored fields: ";
+        for (set::const_iterator it = stored.begin(); 
+             it != stored.end(); it++) {
+            cout << "[" << *it << "] ";
+        }
+	cout << endl;	
+	cout << "Indexed fields: ";
+        for (set::const_iterator it = indexed.begin(); 
+             it != indexed.end(); it++) {
+	    const FieldTraits *ftp;
+	    config->getFieldTraits(*it, &ftp);
+	    if (ftp)
+		cout << "[" << *it << "]" << " -> [" << ftp->pfx << "] ";
+	    else 
+		cout << "[" << *it << "]" << " -> [" << "(none)" << "] ";
+
+        }
+	cout << endl;	
+    } else if (op_flags & OPT_c) {
+	// Checking the configuration consistency
+	
+	// Find and display category names
+        vector catnames;
+        config->getMimeCategories(catnames);
+        cout << "Categories: ";
+        for (vector::const_iterator it = catnames.begin(); 
+             it != catnames.end(); it++) {
+            cout << *it << " ";
+        }
+        cout << endl;
+
+	// Compute union of all types from each category. Check that there
+	// are no duplicates while we are at it.
+        set allmtsfromcats;
+        for (vector::const_iterator it = catnames.begin(); 
+             it != catnames.end(); it++) {
+            vector cts;
+            config->getMimeCatTypes(*it, cts);
+            for (vector::const_iterator it1 = cts.begin(); 
+                 it1 != cts.end(); it1++) {
+                // Already in map -> duplicate
+                if (allmtsfromcats.find(*it1) != allmtsfromcats.end()) {
+                    cout << "Duplicate: [" << *it1 << "]" << endl;
+                }
+                allmtsfromcats.insert(*it1);
+            }
+        }
+
+	// Retrieve complete list of mime types 
+        vector mtypes = config->getAllMimeTypes();
+
+	// And check that each mime type is found in exactly one category
+        for (vector::const_iterator it = mtypes.begin();
+             it != mtypes.end(); it++) {
+            if (allmtsfromcats.find(*it) == allmtsfromcats.end()) {
+                cout << "Not found in catgs: [" << *it << "]" << endl;
+            }
+        }
+
+	// List mime types not in mimeview
+        for (vector::const_iterator it = mtypes.begin();
+             it != mtypes.end(); it++) {
+	    if (config->getMimeViewerDef(*it, "", false).empty()) {
+		cout << "No viewer: [" << *it << "]" << endl;
+	    }
+        }
+
+	// Check that each mime type has an indexer
+        for (vector::const_iterator it = mtypes.begin();
+             it != mtypes.end(); it++) {
+	    if (config->getMimeHandlerDef(*it, false).empty()) {
+		cout << "No filter: [" << *it << "]" << endl;
+	    }
+        }
+
+	// Check that each mime type has a defined icon
+        for (vector::const_iterator it = mtypes.begin();
+             it != mtypes.end(); it++) {
+	    if (config->getMimeIconPath(*it, "") == "document") {
+		cout << "No or generic icon: [" << *it << "]" << endl;
+	    }
+        }
+
+    } else {
+        config->setKeyDir(cstr_null);
+	vector names = config->getConfNames();
+	for (vector::iterator it = names.begin(); 
+	     it != names.end();it++) {
+	    string value;
+	    config->getConfParam(*it, value);
+	    cout << *it << " -> [" << value << "]" << endl;
+	}
+    }
+    exit(0);
+}
+
+#endif // TEST_RCLCONFIG
diff --git a/src/common/rclconfig.h b/src/common/rclconfig.h
new file mode 100644
index 00000000..4a371d50
--- /dev/null
+++ b/src/common/rclconfig.h
@@ -0,0 +1,407 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _RCLCONFIG_H_INCLUDED_
+#define _RCLCONFIG_H_INCLUDED_
+#include "autoconfig.h"
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include UNORDERED_SET_INCLUDE
+
+using std::string;
+using std::vector;
+using std::pair;
+using std::set;
+using std::map;
+
+#include "conftree.h"
+#include "smallut.h"
+
+class RclConfig;
+
+// A small class used for parameters that need to be computed from the
+// config string, and which can change with the keydir. Minimize work
+// by using the keydirgen and a saved string to avoid unneeded
+// recomputations
+class ParamStale {
+public:
+    RclConfig *parent;
+    ConfNull  *conffile;
+    string    paramname;
+    bool      active; // Check at init if config defines name at all
+    int       savedkeydirgen;
+    string    savedvalue;
+
+    ParamStale(RclConfig *rconf, const string& nm);
+    void init(ConfNull *cnf);
+    bool needrecompute();
+};
+
+// Hold the description for an external metadata-gathering command
+struct MDReaper {
+  string fieldname;
+  vector cmdv;
+};
+
+// Data associated to a indexed field name: 
+struct FieldTraits {
+    string pfx; // indexing prefix, 
+    int    wdfinc; // Index time term frequency increment (default 1)
+    double boost; // Query time boost (default 1.0)
+    bool   pfxonly; // Suppress prefix-less indexing
+    bool   noterms; // Don't add term to highlight data (e.g.: rclbes)
+    FieldTraits() 
+        : wdfinc(1), boost(1.0), pfxonly(false), noterms(false)
+        {}
+};
+
+class RclConfig {
+ public:
+
+    // Constructor: we normally look for a configuration file, except
+    // if this was specified on the command line and passed through
+    // argcnf
+    RclConfig(const string *argcnf = 0);
+
+    RclConfig(const RclConfig &r) 
+    : m_oldstpsuffstate(this, "recoll_noindex"),
+      m_stpsuffstate(this, "noContentSuffixes"),
+      m_skpnstate(this, "skippedNames"),
+      m_rmtstate(this, "indexedmimetypes"),
+      m_xmtstate(this, "excludedmimetypes"),
+      m_mdrstate(this, "metadatacmds") {
+        initFrom(r);
+    }
+
+    ~RclConfig() {
+	freeAll();
+    }
+
+    // Return a writable clone of the main config. This belongs to the
+    // caller (must delete it when done)
+    ConfNull *cloneMainConfig();
+
+    /** (re)Read recoll.conf */
+    bool updateMainConfig();
+
+    bool ok() const {return m_ok;}
+    const string &getReason() const {return m_reason;}
+
+    /** Return the directory where this configuration is stored. 
+     *  This was possibly silently created by the rclconfig
+     *  constructor it it is the default one (~/.recoll) and it did 
+     *  not exist yet. */
+    string getConfDir() const {return m_confdir;}
+
+    /** Check if the config files were modified since we read them */
+    bool sourceChanged() const;
+
+    /** Returns true if this is ~/.recoll */
+    bool isDefaultConfig() const;
+    /** Get the local value for /usr/local/share/recoll/ */
+    const string& getDatadir() const {return m_datadir;}
+
+    /** Set current directory reference, and fetch automatic parameters. */
+    void setKeyDir(const string &dir);
+    string getKeyDir() const {return m_keydir;}
+
+    /** Get generic configuration parameter according to current keydir */
+    bool getConfParam(const string &name, string &value, 
+                      bool shallow=false) const
+    {
+	if (m_conf == 0)
+	    return false;
+	return m_conf->get(name, value, m_keydir, shallow);
+    }
+    /** Variant with autoconversion to int */
+    bool getConfParam(const string &name, int *value, bool shallow=false) const;
+    /** Variant with autoconversion to bool */
+    bool getConfParam(const string &name, bool *value, 
+                      bool shallow=false) const;
+    /** Variant with conversion to vector
+     *  (stringToStrings). Can fail if the string is malformed. */
+    bool getConfParam(const string &name, vector *value, 
+                      bool shallow=false) const;
+    /** Variant with conversion to vector */
+    bool getConfParam(const string &name, vector *value, 
+                      bool shallow=false) const;
+
+    enum ThrStage {ThrIntern=0, ThrSplit=1, ThrDbWrite=2};
+    pair getThrConf(ThrStage who) const;
+
+    /** 
+     * Get list of config names under current sk, with possible 
+     * wildcard filtering 
+     */
+    vector getConfNames(const char *pattern = 0) const
+    {
+	return m_conf->getNames(m_keydir, pattern);
+    }
+
+    /** Check if name exists anywhere in config */
+    bool hasNameAnywhere(const string& nm) const
+    {
+        return m_conf? m_conf->hasNameAnywhere(nm) : false;
+    }
+
+
+    /** Get default charset for current keydir (was set during setKeydir) 
+     * filenames are handled differently */
+    const string &getDefCharset(bool filename = false) const;
+
+    /** Get list of top directories. This is needed from a number of places
+     * and needs some cleaning-up code. An empty list is always an error, no
+     * need for other status */
+    vector getTopdirs() const;
+
+    string getConfdirPath(const char *varname, const char *dflt) const;
+    /** Get database directory */
+    string getDbDir() const;
+    /** Get stoplist file name */
+    string getStopfile() const;
+    /** Get synonym groups file name */
+    string getSynGroupsFile() const;
+    /** Get indexing pid file name */
+    string getPidfile() const;
+    /** Get indexing status file name */
+    string getIdxStatusFile() const;
+    /** Do path translation according to the ptrans table */
+    void urlrewrite(const string& dbdir, string& url) const;
+    ConfSimple *getPTrans()
+    {
+	return m_ptrans;
+    }
+    /** Get Web Queue directory name */
+    string getWebQueueDir() const;
+
+    /** Get list of skipped file names for current keydir */
+    vector& getSkippedNames();
+
+    /** Get list of skipped paths patterns. Doesn't depend on the keydir */
+    vector getSkippedPaths() const;
+    /** Get list of skipped paths patterns, daemon version (may add some)
+	Doesn't depend on the keydir */
+    vector getDaemSkippedPaths() const;
+
+    /** 
+     * mimemap: Check if file name should be ignored because of suffix
+     *
+     * The list of ignored suffixes is initialized on first call, and
+     * not changed for subsequent setKeydirs.
+     */
+    bool inStopSuffixes(const string& fn);
+
+    /** 
+     * Check in mimeconf if input mime type is a compressed one, and
+     * return command to uncompress if it is.
+     *
+     * The returned command has substitutable places for input file name 
+     * and temp dir name, and will return output name
+     */
+    bool getUncompressor(const string &mtpe, vector& cmd) const;
+
+    /** mimemap: compute mimetype */
+    string getMimeTypeFromSuffix(const string &suffix) const;
+    /** mimemap: get a list of all indexable mime types defined */
+    vector getAllMimeTypes() const;
+    /** mimemap: Get appropriate suffix for mime type. This is inefficient */
+    string getSuffixFromMimeType(const string &mt) const;
+
+    /** mimeconf: get input filter for mimetype */
+    string getMimeHandlerDef(const string &mimetype, bool filtertypes=false);
+
+    /** For lines like: "name = some value; attr1 = value1; attr2 = val2"
+     * Separate the value and store the attributes in a ConfSimple 
+     * @param whole the raw value. No way to escape a semi-colon in there.
+     */
+    static bool valueSplitAttributes(const string& whole, string& value, 
+				     ConfSimple& attrs) ;
+
+    /** Return icon path for mime type and tag */
+    string getMimeIconPath(const string &mt, const string& apptag) const;
+
+    /** mimeconf: get list of file categories */
+    bool getMimeCategories(vector&) const;
+    /** mimeconf: is parameter one of the categories ? */
+    bool isMimeCategory(string&) const;
+    /** mimeconf: get list of mime types for category */
+    bool getMimeCatTypes(const string& cat, vector&) const;
+
+    /** mimeconf: get list of gui filters (doc cats by default */
+    bool getGuiFilterNames(vector&) const;
+    /** mimeconf: get query lang frag for named filter */
+    bool getGuiFilter(const string& filtername, string& frag) const;
+
+    /** fields: get field prefix from field name. Use additional query
+       aliases if isquery is set */
+    bool getFieldTraits(const string& fldname, const FieldTraits **,
+        bool isquery = false) const;
+
+    const set& getStoredFields() const {return m_storedFields;}
+
+    set getIndexedFields() const;
+
+    /** Get canonic name for possible alias */
+    string fieldCanon(const string& fld) const;
+
+    /** Get canonic name for possible alias, including query-only aliases */
+    string fieldQCanon(const string& fld) const;
+
+    /** Get xattr name to field names translations */
+    const map& getXattrToField() const {return m_xattrtofld;}
+
+    /** Get value of a parameter inside the "fields" file. Only some filters 
+     * use this (ie: mh_mail). The information specific to a given filter
+     * is typically stored in a separate section(ie: [mail]) 
+     */
+    vector getFieldSectNames(const string &sk, const char* = 0) const;
+    bool getFieldConfParam(const string &name, const string &sk, string &value)
+    const;
+
+    /** mimeview: get/set external viewer exec string(s) for mimetype(s) */
+    string getMimeViewerDef(const string &mimetype, const string& apptag, 
+			    bool useall) const;
+    string getMimeViewerAllEx() const;
+    bool setMimeViewerAllEx(const string& allex);
+    bool getMimeViewerDefs(vector >&) const;
+    bool setMimeViewerDef(const string& mimetype, const string& cmd);
+    /** Check if mime type is designated as needing no uncompress before view
+     * (if a file of this type is found compressed). Default is true,
+     *  exceptions are found in the nouncompforviewmts mimeview list */
+    bool mimeViewerNeedsUncomp(const string &mimetype) const;
+
+    /** Retrieve extra metadata-gathering commands */
+    const vector& getMDReapers();
+
+    /** Store/retrieve missing helpers description string */
+    bool getMissingHelperDesc(string&) const;
+    void storeMissingHelperDesc(const string &s);
+
+    /** Find exec file for external filter. 
+     *
+     * If the input is an absolute path, we just return it. Else We
+     * look in $RECOLL_FILTERSDIR, "filtersdir" from the config file,
+     * $RECOLL_CONFDIR/. If nothing is found, we return the input with
+     * the assumption that this will be used with a PATH-searching
+     * exec.
+     *
+     * @param cmd is normally the command name from the command string 
+     *    returned by getMimeHandlerDef(), but this could be used for any 
+     *    command. If cmd begins with a /, we return cmd without
+     *    further processing.
+     */
+    string findFilter(const string& cmd) const;
+
+    /** Thread config init is not done automatically because not all
+	programs need it and it uses debuglog so that it's better to
+	call it after primary init */
+    void initThrConf();
+
+    const string& getOrigCwd() 
+    {
+	return o_origcwd;
+    }
+
+    RclConfig& operator=(const RclConfig &r) {
+	if (this != &r) {
+	    freeAll();
+	    initFrom(r);
+	}
+	return *this;
+    }
+
+    friend class ParamStale;
+
+ private:
+    int m_ok;
+    string m_reason;    // Explanation for bad state
+    string m_confdir;   // User directory where the customized files are stored
+    string m_datadir;   // Example: /usr/local/share/recoll
+    string m_keydir;    // Current directory used for parameter fetches.
+    int    m_keydirgen; // To help with knowing when to update computed data.
+
+    vector m_cdirs; // directory stack for the confstacks
+
+    ConfStack *m_conf;   // Parsed configuration files
+    ConfStack *mimemap;  // The files don't change with keydir, 
+    ConfStack *mimeconf; // but their content may depend on it.
+    ConfStack *mimeview; // 
+    ConfStack *m_fields;
+    ConfSimple            *m_ptrans; // Paths translations
+    map  m_fldtotraits; // Field to field params
+    map  m_aliastocanon;
+    map  m_aliastoqcanon;
+    set          m_storedFields;
+    map  m_xattrtofld;
+
+    void        *m_stopsuffixes;
+    unsigned int m_maxsufflen;
+    ParamStale   m_oldstpsuffstate; // Values from user mimemap, now obsolete
+    ParamStale   m_stpsuffstate;
+
+    ParamStale   m_skpnstate;
+    vector m_skpnlist;
+
+    // Original current working directory. Set once at init before we do any
+    // chdir'ing and used for converting user args to absolute paths.
+    static string o_origcwd;
+
+    // Parameters auto-fetched on setkeydir
+    string m_defcharset;
+    static string o_localecharset;
+    // Limiting set of mime types to be processed. Normally empty.
+    ParamStale    m_rmtstate;
+    STD_UNORDERED_SET   m_restrictMTypes; 
+    // Exclusion set of mime types. Normally empty
+    ParamStale    m_xmtstate;
+    STD_UNORDERED_SET   m_excludeMTypes; 
+
+    vector > m_thrConf;
+
+    // Same idea with the metadata-gathering external commands,
+    // (e.g. used to reap tagging info: "tmsu tags %f")
+    ParamStale    m_mdrstate;
+    vector m_mdreapers;
+
+    /** Create initial user configuration */
+    bool initUserConfig();
+    /** Copy from other */
+    void initFrom(const RclConfig& r);
+    /** Init pointers to 0 */
+    void zeroMe();
+    /** Free data then zero pointers */
+    void freeAll();
+    bool readFieldsConfig(const string& errloc);
+};
+
+// This global variable defines if we are running with an index
+// stripped of accents and case or a raw one. Ideally, it should be
+// constant, but it needs to be initialized from the configuration, so
+// there is no way to do this. It never changes after initialization
+// of course. Changing the value on a given index imposes a
+// reset. When using multiple indexes, all must have the same value
+extern bool o_index_stripchars;
+
+// This global variable defines if we use mtime instead of ctime for
+// up-to-date tests. This is mostly incompatible with xattr indexing,
+// in addition to other issues. See recoll.conf comments. 
+extern bool o_uptodate_test_use_mtime;
+
+#endif /* _RCLCONFIG_H_INCLUDED_ */
diff --git a/src/common/rclinit.cpp b/src/common/rclinit.cpp
new file mode 100644
index 00000000..f568cc9d
--- /dev/null
+++ b/src/common/rclinit.cpp
@@ -0,0 +1,282 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#include "autoconfig.h"
+
+#include 
+#ifdef _WIN32
+#include "safewindows.h"
+#endif
+#include 
+#include 
+#include 
+#include 
+#if !defined(PUTENV_ARG_CONST)
+#include 
+#endif
+
+#include "debuglog.h"
+#include "rclconfig.h"
+#include "rclinit.h"
+#include "pathut.h"
+#include "unac.h"
+#include "smallut.h"
+#include "execmd.h"
+
+static pthread_t mainthread_id;
+
+static void siglogreopen(int)
+{
+    if (recoll_ismainthread())
+	DebugLog::reopen();
+}
+
+#ifndef _WIN32
+// We would like to block SIGCHLD globally, but we can't because
+// QT uses it. Have to block it inside execmd.cpp
+static const int catchedSigs[] = {SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2};
+void initAsyncSigs(void (*sigcleanup)(int))
+{
+    // We ignore SIGPIPE always. All pieces of code which can write to a pipe
+    // must check write() return values.
+#ifndef _WIN32
+    signal(SIGPIPE, SIG_IGN);
+#endif
+
+    // Install app signal handler
+    if (sigcleanup) {
+	struct sigaction action;
+	action.sa_handler = sigcleanup;
+	action.sa_flags = 0;
+	sigemptyset(&action.sa_mask);
+	for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++)
+	    if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) {
+		if (sigaction(catchedSigs[i], &action, 0) < 0) {
+		    perror("Sigaction failed");
+		}
+	    }
+    }
+
+    // Install log rotate sig handler
+    {
+	struct sigaction action;
+	action.sa_handler = siglogreopen;
+	action.sa_flags = 0;
+	sigemptyset(&action.sa_mask);
+	if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
+	    if (sigaction(SIGHUP, &action, 0) < 0) {
+		perror("Sigaction failed");
+	    }
+	}
+    }
+}
+#else
+
+// Windows signals etc.
+//
+// ^C can be caught by the signal() emulation, but not ^Break
+// apparently, which is why we use the native approach too
+//
+// When a keyboard interrupt occurs, windows creates a thread inside
+// the process and calls the handler. The process exits when the
+// handler returns or after at most 10S
+//
+// In practise, only recollindex sets sigcleanup(), and the routine
+// just sets a global termination flag. So we just call it and sleep,
+// hoping that cleanup does not take more than what Windows will let
+// us live.
+
+static void (*l_sigcleanup)(int);
+
+static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
+{
+    if (l_sigcleanup == 0)
+        return FALSE;
+
+    switch(fdwCtrlType) { 
+    case CTRL_C_EVENT: 
+    case CTRL_CLOSE_EVENT: 
+    case CTRL_BREAK_EVENT: 
+    case CTRL_LOGOFF_EVENT: 
+    case CTRL_SHUTDOWN_EVENT:
+        l_sigcleanup(SIGINT);
+        Sleep(10000);
+        return TRUE;
+    default: 
+        return FALSE; 
+    } 
+} 
+ 
+static const int catchedSigs[] = {SIGINT, SIGTERM};
+void initAsyncSigs(void (*sigcleanup)(int))
+{
+    // Install app signal handler
+    if (sigcleanup) {
+        l_sigcleanup = sigcleanup;
+	for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) {
+	    if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) {
+		signal(catchedSigs[i], sigcleanup);
+	    }
+        }
+    }
+    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
+}
+
+#endif
+
+RclConfig *recollinit(RclInitFlags flags, 
+		      void (*cleanup)(void), void (*sigcleanup)(int), 
+		      string &reason, const string *argcnf)
+{
+    if (cleanup)
+	atexit(cleanup);
+
+    // Make sure the locale is set. This is only for converting file names 
+    // to utf8 for indexing.
+    setlocale(LC_CTYPE, "");
+
+    DebugLog::getdbl()->setloglevel(DEBDEB1);
+    DebugLog::setfilename("stderr");
+    if (getenv("RECOLL_LOGDATE"))
+        DebugLog::getdbl()->logdate(1);
+
+    initAsyncSigs(sigcleanup);
+    
+    RclConfig *config = new RclConfig(argcnf);
+    if (!config || !config->ok()) {
+	reason = "Configuration could not be built:\n";
+	if (config)
+	    reason += config->getReason();
+	else
+	    reason += "Out of memory ?";
+	return 0;
+    }
+
+    // Retrieve the log file name and level
+    string logfilename, loglevel;
+    if (flags & RCLINIT_DAEMON) {
+	config->getConfParam(string("daemlogfilename"), logfilename);
+	config->getConfParam(string("daemloglevel"), loglevel);
+    }
+    if (logfilename.empty())
+	config->getConfParam(string("logfilename"), logfilename);
+    if (loglevel.empty())
+	config->getConfParam(string("loglevel"), loglevel);
+
+    // Initialize logging
+    if (!logfilename.empty()) {
+	logfilename = path_tildexpand(logfilename);
+	// If not an absolute path or , compute relative to config dir
+	if (!path_isabsolute(logfilename) && 
+	    !DebugLog::DebugLog::isspecialname(logfilename.c_str())) {
+	    logfilename = path_cat(config->getConfDir(), logfilename);
+	}
+	DebugLog::setfilename(logfilename.c_str());
+    }
+    if (!loglevel.empty()) {
+	int lev = atoi(loglevel.c_str());
+	DebugLog::getdbl()->setloglevel(lev);
+    }
+
+    // Make sure the locale charset is initialized (so that multiple
+    // threads don't try to do it at once).
+    config->getDefCharset();
+
+    mainthread_id = pthread_self();
+
+    // Init unac locking
+    unac_init_mt();
+    // Init smallut and pathut static values
+    pathut_init_mt();
+    smallut_init_mt();
+    // Init execmd.h static PATH and PATHELT splitting
+    {string bogus;
+        ExecCmd::which("nosuchcmd", bogus);
+    }
+    
+    // Init Unac translation exceptions
+    string unacex;
+    if (config->getConfParam("unac_except_trans", unacex) && !unacex.empty()) 
+	unac_set_except_translations(unacex.c_str());
+
+#ifndef IDX_THREADS
+#ifndef _WIN32
+    ExecCmd::useVfork(true);
+#endif
+#else
+    // Keep threads init behind log init, but make sure it's done before
+    // we do the vfork choice ! The latter is not used any more actually, 
+    // we always use vfork except if forbidden by config.
+    config->initThrConf();
+
+    bool novfork;
+    config->getConfParam("novfork", &novfork);
+    if (novfork) {
+#ifndef _WIN32
+	LOGDEB0(("rclinit: will use fork() for starting commands\n"));
+        ExecCmd::useVfork(false);
+#endif
+    } else {
+#ifndef _WIN32
+	LOGDEB0(("rclinit: will use vfork() for starting commands\n"));
+	ExecCmd::useVfork(true);
+#endif
+    }
+#endif
+
+    int flushmb;
+    if (config->getConfParam("idxflushmb", &flushmb) && flushmb > 0) {
+	LOGDEB1(("rclinit: idxflushmb=%d, set XAPIAN_FLUSH_THRESHOLD to 10E6\n",
+		 flushmb));
+	static const char *cp = "XAPIAN_FLUSH_THRESHOLD=1000000";
+#ifdef PUTENV_ARG_CONST
+	::putenv(cp);
+#else
+	::putenv(strdup(cp));
+#endif
+    }
+
+    return config;
+}
+
+// Signals are handled by the main thread. All others should call this
+// routine to block possible signals
+void recoll_threadinit()
+{
+#ifndef _WIN32
+    sigset_t sset;
+    sigemptyset(&sset);
+
+    for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++)
+	sigaddset(&sset, catchedSigs[i]);
+    sigaddset(&sset, SIGHUP);
+    pthread_sigmask(SIG_BLOCK, &sset, 0);
+#else
+    // Not sure that this is needed at all or correct under windows.
+    for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) {
+        if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) {
+            signal(catchedSigs[i], SIG_IGN);
+        }
+    }
+#endif
+}
+
+bool recoll_ismainthread()
+{
+    return pthread_equal(pthread_self(), mainthread_id);
+}
+
+
diff --git a/src/common/rclinit.h b/src/common/rclinit.h
new file mode 100644
index 00000000..82916f94
--- /dev/null
+++ b/src/common/rclinit.h
@@ -0,0 +1,60 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _RCLINIT_H_INCLUDED_
+#define _RCLINIT_H_INCLUDED_
+
+#include 
+#ifndef NO_NAMESPACES
+using std::string;
+#endif
+
+class RclConfig;
+/**
+ * Initialize by reading configuration, opening log file, etc.
+ * 
+ * This must be called from the main thread before starting any others. It sets
+ * up the global signal handling. other threads must call recoll_threadinit()
+ * when starting.
+ *
+ * @param flags   misc modifiers
+ * @param cleanup function to call before exiting (atexit)
+ * @param sigcleanup function to call on terminal signal (INT/HUP...) This 
+ *       should typically set a flag which tells the program (recoll, 
+ *       recollindex etc.. to exit as soon as possible (after closing the db, 
+ *       etc.). cleanup will then be called by exit().
+ * @param reason in case of error: output string explaining things
+ * @param argcnf Configuration directory name from the command line (overriding
+ *               default and environment
+ * @return the parsed configuration.
+ */
+enum RclInitFlags {RCLINIT_NONE=0, RCLINIT_DAEMON=1};
+extern RclConfig *recollinit(RclInitFlags flags,
+			     void (*cleanup)(void), void (*sigcleanup)(int), 
+			     string &reason, const string *argcnf = 0);
+inline RclConfig *recollinit(void (*cleanup)(void), void (*sigcleanup)(int), 
+			     string &reason, const string *argcnf = 0) {
+    return recollinit(RCLINIT_NONE, cleanup, sigcleanup, reason, argcnf);
+}
+
+// Threads need to call this to block signals.  
+// The main thread handles all signals.
+extern void recoll_threadinit();
+
+// Check if main thread
+extern bool recoll_ismainthread();
+
+#endif /* _RCLINIT_H_INCLUDED_ */
diff --git a/src/common/rclversion.h.in b/src/common/rclversion.h.in
new file mode 100644
index 00000000..4b8fe507
--- /dev/null
+++ b/src/common/rclversion.h.in
@@ -0,0 +1 @@
+static const char *rclversionstr = "@RCLVERSION@";
diff --git a/src/common/syngroups.cpp b/src/common/syngroups.cpp
new file mode 100644
index 00000000..65ec2593
--- /dev/null
+++ b/src/common/syngroups.cpp
@@ -0,0 +1,248 @@
+/* Copyright (C) 2014 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef TEST_SYNGROUPS
+#include "autoconfig.h"
+
+#include "syngroups.h"
+
+#include "debuglog.h"
+#include "smallut.h"
+
+#include 
+#include UNORDERED_MAP_INCLUDE
+#include 
+#include 
+#include 
+
+using namespace std;
+
+// Note that we are storing each term twice. I don't think that the
+// size could possibly be a serious issue, but if it was, we could
+// reduce the storage a bit by storing (short hash)-> vector
+// correspondances in the direct map, and then checking all the
+// resulting groups for the input word.
+//
+// As it is, a word can only index one group (the last it is found
+// in). It can be part of several groups though (appear in
+// expansions). I really don't know what we should do with multiple
+// groups anyway
+class SynGroups::Internal {
+public:
+    Internal() : ok(false) {
+    }
+    bool ok;
+    // Term to group num 
+    STD_UNORDERED_MAP terms;
+    // Group num to group
+    STD_UNORDERED_MAP > groups;
+};
+
+bool SynGroups::ok() 
+{
+    return m && m->ok;
+}
+
+SynGroups::~SynGroups()
+{
+    delete m;
+}
+
+const int LL = 1024;
+
+SynGroups::SynGroups()
+    : m(new Internal)
+{
+}
+
+bool SynGroups::setfile(const string& fn)
+{
+    LOGDEB(("SynGroups::setfile(%s)\n", fn.c_str()));
+    if (!m) {
+	LOGERR(("SynGroups:setfile:: new Internal failed: no mem ?\n"));
+	return false;
+    }
+
+    // Don't set ok to true.
+    if (fn.empty())
+	return true;
+
+    ifstream input;
+    input.open(fn.c_str(), ios::in);
+    if (!input.is_open()) {
+	LOGERR(("SynGroups:setfile:: could not open %s errno %d\n",
+		fn.c_str(), errno));
+	return false;
+    }	    
+
+    char cline[LL];
+    bool appending = false;
+    string line;
+    bool eof = false;
+    int lnum = 0;
+
+    for (;;) {
+        cline[0] = 0;
+	input.getline(cline, LL-1);
+	if (!input.good()) {
+	    if (input.bad()) {
+                LOGDEB(("Parse: input.bad()\n"));
+		return false;
+	    }
+	    // Must be eof ? But maybe we have a partial line which
+	    // must be processed. This happens if the last line before
+	    // eof ends with a backslash, or there is no final \n
+            eof = true;
+	}
+	lnum++;
+
+        {
+            size_t ll = strlen(cline);
+            while (ll > 0 && (cline[ll-1] == '\n' || cline[ll-1] == '\r')) {
+                cline[ll-1] = 0;
+                ll--;
+            }
+        }
+
+	if (appending)
+	    line += cline;
+	else
+	    line = cline;
+
+	// Note that we trim whitespace before checking for backslash-eol
+	// This avoids invisible whitespace problems.
+	trimstring(line);
+	if (line.empty() || line.at(0) == '#') {
+            if (eof)
+                break;
+	    continue;
+	}
+	if (line[line.length() - 1] == '\\') {
+	    line.erase(line.length() - 1);
+	    appending = true;
+	    continue;
+	}
+	appending = false;
+
+	vector words;
+	if (!stringToStrings(line, words)) {
+	    LOGERR(("SynGroups:setfile: %s: bad line %d: %s\n",
+		    fn.c_str(), lnum, line.c_str()));
+	    continue;
+	}
+
+	if (words.empty())
+	    continue;
+	if (words.size() == 1) {
+	    LOGDEB(("SynGroups:setfile: single term group at line %d ??\n",
+		    lnum));
+	    continue;
+	}
+
+	m->groups[lnum] = words;
+	for (vector::const_iterator it = words.begin();
+	     it != words.end(); it++) {
+	    m->terms[*it] = lnum;
+	}
+	LOGDEB(("SynGroups::setfile: group: [%s]\n", 
+		stringsToString(m->groups[lnum]).c_str()));
+    }
+    m->ok = true;
+    return true;
+}
+
+vector SynGroups::getgroup(const string& term)
+{
+    vector ret;
+    if (!ok())
+	return ret;
+
+    STD_UNORDERED_MAP::const_iterator it1 = m->terms.find(term);
+    if (it1 == m->terms.end()) {
+	LOGDEB1(("SynGroups::getgroup: [%s] not found in direct map\n", 
+		 term.c_str()));
+	return ret;
+    }
+
+    // Group num to group
+    STD_UNORDERED_MAP >::const_iterator it2 = 
+	m->groups.find(it1->second);
+    
+    if (it2 == m->groups.end()) {
+	LOGERR(("SynGroups::getgroup: %s found in direct map but no group\n",
+		term.c_str()));
+	return ret;
+    }
+    return it2->second;
+}
+
+#else
+
+#include "syngroups.h"
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+using namespace std;
+
+static char *thisprog;
+
+static char usage [] =
+    "syngroups  \n"
+    "  \n\n"
+    ;
+static void Usage(void)
+{
+    fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_MOINS 0x1
+#define OPT_s     0x2
+#define OPT_b     0x4
+
+int main(int argc, char **argv)
+{
+    thisprog = argv[0];
+    argc--; argv++;
+
+    if (argc != 2) {
+        Usage();
+    }
+    string fn = *argv++;argc--;
+    string word = *argv++;argc--;
+
+    SynGroups syns(fn);
+    if (!syns.ok()) {
+	cerr << "Initialization failed\n";
+	return 1;
+    }
+
+    vector group = syns.getgroup(word);
+    cout << group.size() << " terms in group\n";
+    for (vector::const_iterator it = group.begin();
+	 it != group.end(); it++) {
+	cout << "[" << *it << "] ";
+    }
+    cout << endl;
+    return 0;
+}
+
+#endif
diff --git a/src/common/syngroups.h b/src/common/syngroups.h
new file mode 100644
index 00000000..62a71523
--- /dev/null
+++ b/src/common/syngroups.h
@@ -0,0 +1,41 @@
+/* Copyright (C) 2015 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef _SYNGROUPS_H_INCLUDED_
+#define _SYNGROUPS_H_INCLUDED_
+
+#include 
+#include 
+
+// Manage synonym groups. This is very different from stemming and
+// case/diac expansion because there is no reference form: all terms
+// in a group are equivalent.
+class SynGroups {
+public:
+    SynGroups();
+    ~SynGroups();
+    bool setfile(const std::string& fname);
+    std::vector getgroup(const std::string& term);
+    bool ok();
+private:
+    class Internal;
+    Internal *m;
+    SynGroups(const SynGroups&);
+    SynGroups& operator=(const SynGroups&);
+};
+
+#endif /* _SYNGROUPS_H_INCLUDED_ */
diff --git a/src/common/textsplit.cpp b/src/common/textsplit.cpp
new file mode 100644
index 00000000..df9b151f
--- /dev/null
+++ b/src/common/textsplit.cpp
@@ -0,0 +1,1239 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef TEST_TEXTSPLIT
+#include "autoconfig.h"
+
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include UNORDERED_SET_INCLUDE
+
+#include "textsplit.h"
+#include "debuglog.h"
+//#define UTF8ITER_CHECK
+#include "utf8iter.h"
+#include "uproplist.h"
+
+using namespace std;
+
+/**
+ * Splitting a text into words. The code in this file works with utf-8
+ * in a semi-clean way (see uproplist.h). Ascii still gets special
+ * treatment in the sense that many special characters can only be
+ * ascii (e.g. @, _,...). However, this compromise works quite well
+ * while being much more light-weight than a full-blown Unicode
+ * approach (ICU...)
+ */
+
+// Ascii character classes: we have three main groups, and then some chars
+// are their own class because they want special handling.
+// 
+// We have an array with 256 slots where we keep the character types. 
+// The array could be fully static, but we use a small function to fill it 
+// once.
+// The array is actually a remnant of the original version which did no utf8.
+// Only the lower 127 slots are  now used, but keep it at 256
+// because it makes some tests in the code simpler.
+const unsigned int charclasses_size = 256;
+enum CharClass {LETTER=256, SPACE=257, DIGIT=258, WILD=259, 
+                A_ULETTER=260, A_LLETTER=261, SKIP=262};
+static int charclasses[charclasses_size];
+
+// Non-ascii UTF-8 characters are handled with sets holding all
+// characters with interesting properties. This is far from full-blown
+// management of Unicode properties, but seems to do the job well
+// enough in most common cases
+static vector vpuncblocks;
+static STD_UNORDERED_SET spunc;
+static STD_UNORDERED_SET visiblewhite;
+static STD_UNORDERED_SET sskip;
+
+class CharClassInit {
+public:
+    CharClassInit() 
+    {
+	unsigned int i;
+
+	// Set default value for all: SPACE
+	for (i = 0 ; i < 256 ; i ++)
+	    charclasses[i] = SPACE;
+
+	char digits[] = "0123456789";
+	for (i = 0; i  < strlen(digits); i++)
+	    charclasses[int(digits[i])] = DIGIT;
+
+	char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+	for (i = 0; i  < strlen(upper); i++)
+	    charclasses[int(upper[i])] = A_ULETTER;
+
+	char lower[] = "abcdefghijklmnopqrstuvwxyz";
+	for (i = 0; i  < strlen(lower); i++)
+	    charclasses[int(lower[i])] = A_LLETTER;
+
+	char wild[] = "*?[]";
+	for (i = 0; i  < strlen(wild); i++)
+	    charclasses[int(wild[i])] = WILD;
+
+        // Characters with special treatment:
+        //
+        // The first ones are mostly span-constructing "glue"
+        // characters, for example those typically allowing us to
+        // search for an email address as a whole (bob@isp.org instead
+        // of as a phrase "bob isp org"
+        //
+        // The case of the minus sign is a complicated one. It went
+        // from glue to non-glue to glue along Recoll versions. 
+        // See minus-hyphen-dash.txt in doc/notes
+	char special[] = ".@+-#'_\n\r\f";
+	for (i = 0; i  < strlen(special); i++)
+	    charclasses[int(special[i])] = special[i];
+
+	for (i = 0; i < sizeof(unipunc) / sizeof(int); i++) {
+	    spunc.insert(unipunc[i]);
+	}
+	spunc.insert((unsigned int)-1);
+
+	for (i = 0; i < sizeof(unipuncblocks) / sizeof(int); i++) {
+	    vpuncblocks.push_back(unipuncblocks[i]);
+	}
+	assert((vpuncblocks.size() % 2) == 0);
+
+	for (i = 0; i < sizeof(avsbwht) / sizeof(int); i++) {
+	    visiblewhite.insert(avsbwht[i]);
+	}
+	for (i = 0; i < sizeof(uniskip) / sizeof(int); i++) {
+	    sskip.insert(uniskip[i]);
+	}
+    }
+};
+static const CharClassInit charClassInitInstance;
+
+static inline int whatcc(unsigned int c)
+{
+    if (c <= 127) {
+	return charclasses[c]; 
+    } else {
+        if (c == 0x2010) {
+            // Special treatment for hyphen: handle as ascii minus. See
+            // doc/notes/minus-hyphen-dash.txt
+            return 0x2010;
+        } else if (sskip.find(c) != sskip.end()) {
+	    return SKIP;
+	} else if (spunc.find(c) != spunc.end()) {
+	    return SPACE;
+	} else {
+	    vector::iterator it = 
+		lower_bound(vpuncblocks.begin(), vpuncblocks.end(), c);
+		if (it == vpuncblocks.end())
+			return LETTER;
+	    if (c == *it)
+		return SPACE;
+	    if ((it - vpuncblocks.begin()) % 2 == 1) {
+		return SPACE;
+	    } else {
+		return LETTER;
+	    }
+	} 
+    }
+}
+
+// testing whatcc...
+#if 0
+  unsigned int testvalues[] = {'a', '0', 0x80, 0xbf, 0xc0, 0x05c3, 0x1000, 
+			       0x2000, 0x2001, 0x206e, 0x206f, 0x20d0, 0x2399, 
+			       0x2400, 0x2401, 0x243f, 0x2440, 0xff65};
+  int ntest = sizeof(testvalues) / sizeof(int);
+  for (int i = 0; i < ntest; i++) {
+      int ret = whatcc(testvalues[i]);
+      printf("Tested value 0x%x, returned value %d %s\n",
+	     testvalues[i], ret, ret == LETTER ? "LETTER" : 
+	     ret == SPACE ? "SPACE" : "OTHER");
+  }
+#endif
+
+// CJK Unicode character detection:
+//
+// 2E80..2EFF; CJK Radicals Supplement
+// 3000..303F; CJK Symbols and Punctuation
+// 3040..309F; Hiragana
+// 30A0..30FF; Katakana
+// 3100..312F; Bopomofo
+// 3130..318F; Hangul Compatibility Jamo
+// 3190..319F; Kanbun
+// 31A0..31BF; Bopomofo Extended
+// 31C0..31EF; CJK Strokes
+// 31F0..31FF; Katakana Phonetic Extensions
+// 3200..32FF; Enclosed CJK Letters and Months
+// 3300..33FF; CJK Compatibility
+// 3400..4DBF; CJK Unified Ideographs Extension A
+// 4DC0..4DFF; Yijing Hexagram Symbols
+// 4E00..9FFF; CJK Unified Ideographs
+// A700..A71F; Modifier Tone Letters
+// AC00..D7AF; Hangul Syllables
+// F900..FAFF; CJK Compatibility Ideographs
+// FE30..FE4F; CJK Compatibility Forms
+// FF00..FFEF; Halfwidth and Fullwidth Forms
+// 20000..2A6DF; CJK Unified Ideographs Extension B
+// 2F800..2FA1F; CJK Compatibility Ideographs Supplement
+// Note: the p > 127 test is not necessary, but optimizes away the ascii case
+#define UNICODE_IS_CJK(p)						\
+    ((p) > 127 &&							\
+     (((p) >= 0x2E80 && (p) <= 0x2EFF) ||				\
+      ((p) >= 0x3000 && (p) <= 0x9FFF) ||				\
+      ((p) >= 0xA700 && (p) <= 0xA71F) ||				\
+      ((p) >= 0xAC00 && (p) <= 0xD7AF) ||				\
+      ((p) >= 0xF900 && (p) <= 0xFAFF) ||				\
+      ((p) >= 0xFE30 && (p) <= 0xFE4F) ||				\
+      ((p) >= 0xFF00 && (p) <= 0xFFEF) ||				\
+      ((p) >= 0x20000 && (p) <= 0x2A6DF) ||				\
+      ((p) >= 0x2F800 && (p) <= 0x2FA1F)))
+
+bool TextSplit::isCJK(int c)
+{
+    return UNICODE_IS_CJK(c);
+}
+
+bool          TextSplit::o_processCJK = true;
+unsigned int  TextSplit::o_CJKNgramLen = 2;
+bool          TextSplit::o_noNumbers = false;
+bool          TextSplit::o_deHyphenate = false;
+
+// Final term checkpoint: do some checking (the kind which is simpler
+// to do here than in the main loop), then send term to our client.
+inline bool TextSplit::emitterm(bool isspan, string &w, int pos, 
+				size_t btstart, size_t btend)
+{
+    LOGDEB2(("TextSplit::emitterm: [%s] pos %d\n", w.c_str(), pos));
+
+    int l = int(w.length());
+
+#ifdef TEXTSPLIT_STATS
+    // Update word length statistics. Do this before we filter out
+    // long words because stats are used to detect bad text
+    if (!isspan || m_wordLen == m_span.length())
+	m_stats.newsamp(m_wordChars);
+#endif
+
+    if (l > 0 && l < m_maxWordLength) {
+	// 1 byte word: we index single ascii letters and digits, but
+	// nothing else. We might want to turn this into a test for a
+	// single utf8 character instead ?
+	if (l == 1) {
+	    unsigned int c = ((unsigned int)w[0]) & 0xff;
+	    if (charclasses[c] != A_ULETTER && charclasses[c] != A_LLETTER && 
+                charclasses[c] != DIGIT &&
+		(!(m_flags & TXTS_KEEPWILD) || charclasses[c] != WILD)
+		) {
+		//cerr << "ERASING single letter term " << c << endl;
+		return true;
+	    }
+	}
+	if (pos != m_prevpos || l != m_prevlen) {
+	    bool ret = takeword(w, pos, int(btstart), int(btend));
+	    m_prevpos = pos;
+	    m_prevlen = int(w.length());
+	    return ret;
+	}
+	LOGDEB2(("TextSplit::emitterm:dup: [%s] pos %d\n", w.c_str(), pos));
+    }
+    return true;
+}
+
+// Check for an acronym/abbreviation ie I.B.M. This only works with
+// ascii (no non-ascii utf-8 acronym are possible)
+bool TextSplit::span_is_acronym(string *acronym)
+{
+    bool acron = false;
+
+    if (m_wordLen != m_span.length() && 
+        m_span.length() > 2 && m_span.length() <= 20) {
+        acron = true;
+        // Check odd chars are '.'
+        for (unsigned int i = 1 ; i < m_span.length(); i += 2) {
+            if (m_span[i] != '.') {
+                acron = false;
+                break;
+            }
+        }
+        if (acron) {
+            // Check that even chars are letters
+            for (unsigned int i = 0 ; i < m_span.length(); i += 2) {
+                int c = m_span[i];
+                if (!((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z'))) {
+                    acron = false;
+                    break;
+                }
+            }
+        }
+    }
+    if (acron) {
+        for (unsigned int i = 0; i < m_span.length(); i += 2) {
+            *acronym += m_span[i];
+        }
+    }
+    return acron;
+}
+
+
+// Generate terms from span. Have to take into account the
+// flags: ONLYSPANS, NOSPANS, noNumbers
+bool TextSplit::words_from_span(size_t bp)
+{
+#if 0
+    cerr << "Span: [" << m_span << "] " << " w_i_s size: " << 
+        m_words_in_span.size() <<  " : ";
+    for (unsigned int i = 0; i < m_words_in_span.size(); i++) {
+        cerr << " [" << m_words_in_span[i].first << " " <<
+            m_words_in_span[i].second << "] ";
+                
+    }
+    cerr << endl;
+#endif
+    int spanwords = int(m_words_in_span.size());
+    int pos = m_spanpos;
+    // Byte position of the span start
+    size_t spboffs = bp - m_span.size();
+
+    if (o_deHyphenate && spanwords == 2 && 
+	m_span[m_words_in_span[0].second] == '-') {
+	unsigned int s0 = m_words_in_span[0].first;
+	unsigned int l0 = m_words_in_span[0].second - m_words_in_span[0].first;
+	unsigned int s1 = m_words_in_span[1].first;
+	unsigned int l1 = m_words_in_span[1].second - m_words_in_span[1].first;
+	string word = m_span.substr(s0, l0) + m_span.substr(s1, l1);
+	if (l0 && l1) 
+	    emitterm(false, word,
+		     m_spanpos, spboffs, spboffs + m_words_in_span[1].second);
+    }
+
+    for (int i = 0; 
+         i < ((m_flags&TXTS_ONLYSPANS) ? 1 : spanwords); 
+         i++, pos++) {
+
+        int deb = m_words_in_span[i].first;
+
+        for (int j = ((m_flags&TXTS_ONLYSPANS) ? spanwords-1 : i);
+             j < ((m_flags&TXTS_NOSPANS) ? i+1 : spanwords);
+             j++) {
+
+            int fin = m_words_in_span[j].second;
+            //cerr << "i " << i << " j " << j << " deb " << deb << 
+            // " fin " << fin << endl;
+            if (fin - deb > int(m_span.size()))
+                break;
+            string word(m_span.substr(deb, fin-deb));
+            if (!emitterm(j != i+1, word, pos, spboffs+deb, spboffs+fin))
+                return false;
+        }
+    }
+    return true;
+}
+
+/**
+ * A method called at word boundaries (different places in
+ * text_to_words()), to adjust the current state of the parser, and
+ * possibly generate term(s). While inside a span (words linked by
+ * glue characters), we just keep track of the word boundaries. Once
+ * actual white-space is reached, we get called with spanerase set to
+ * true, and we process the span, calling the emitterm() routine for
+ * each generated term.
+ * 
+ * The object flags can modify our behaviour, deciding if we only emit
+ * single words (bill, recoll, org), only spans (bill@recoll.org), or
+ * words and spans (bill@recoll.org, recoll.org, jf, recoll...)
+ * 
+ * @return true if ok, false for error. Splitting should stop in this case.
+ * @param spanerase Set if the current span is at its end. Process it.
+ * @param bp        The current BYTE position in the stream
+ */
+inline bool TextSplit::doemit(bool spanerase, size_t bp)
+{
+    LOGDEB2(("TextSplit::doemit: sper %d bp %d spp %d spanwords %u wS %d wL %d "
+            "inn %d span [%s]\n",
+             spanerase, int(bp), m_spanpos, m_words_in_span.size(), 
+            m_wordStart, m_wordLen, m_inNumber, m_span.c_str()));
+
+    if (m_wordLen) {
+        // We have a current word. Remember it
+
+        // Limit max span word count
+        if (m_words_in_span.size() >= 6) {
+            spanerase = true;
+        } 
+
+        m_words_in_span.push_back(pair(m_wordStart, 
+                                                m_wordStart + m_wordLen));
+	m_wordpos++;
+	m_wordLen = m_wordChars = 0;
+    }
+
+    if (spanerase) {
+        // We encountered a span-terminating character. Produce terms.
+
+        string acronym;
+        if (span_is_acronym(&acronym)) {
+            if (!emitterm(false, acronym, m_spanpos, bp - m_span.length(), bp))
+                return false;
+        }
+
+	// Maybe trim at end. These are chars that we might keep
+	// inside a span, but not at the end.
+	while (m_span.length() > 0) {
+	    switch (*(m_span.rbegin())) {
+	    case '.':
+	    case '-':
+	    case ',':
+	    case '@':
+	    case '_':
+	    case '\'':
+		m_span.resize(m_span.length()-1);
+                if (m_words_in_span.size() &&
+                    m_words_in_span.back().second > int(m_span.size()))
+                    m_words_in_span.back().second = int(m_span.size());
+		if (--bp < 0) 
+		    bp = 0;
+		break;
+	    default:
+		goto breaktrimloop;
+	    }
+	}
+    breaktrimloop:
+
+        if (!words_from_span(bp)) {
+            return false;
+        }
+	discardspan();
+
+    } else {
+    
+	m_wordStart = int(m_span.length());
+
+    }
+
+    return true;
+}
+
+void TextSplit::discardspan()
+{
+    m_words_in_span.clear();
+    m_span.erase();
+    m_spanpos = m_wordpos;
+    m_wordStart = 0;
+    m_wordLen = m_wordChars = 0;
+}
+
+static inline bool isalphanum(int what, unsigned int flgs)
+{
+    return what == A_LLETTER || what == A_ULETTER ||
+	what == DIGIT || what == LETTER ||
+	((flgs & TextSplit::TXTS_KEEPWILD) && what == WILD);
+}
+static inline bool isdigit(int what, unsigned int flgs)
+{
+    return what == DIGIT || ((flgs & TextSplit::TXTS_KEEPWILD) && what == WILD);
+}
+
+#ifdef TEXTSPLIT_STATS
+#define STATS_INC_WORDCHARS ++m_wordChars
+#else
+#define STATS_INC_WORDCHARS
+#endif
+
+/** 
+ * Splitting a text into terms to be indexed.
+ * We basically emit a word every time we see a separator, but some chars are
+ * handled specially so that special cases, ie, c++ and jfd@recoll.com etc, 
+ * are handled properly,
+ */
+bool TextSplit::text_to_words(const string &in)
+{
+    LOGDEB1(("TextSplit::text_to_words: docjk %d (%d) %s%s%s [%s]\n", 
+	     o_processCJK, o_CJKNgramLen,
+	     m_flags & TXTS_NOSPANS ? " nospans" : "",
+	     m_flags & TXTS_ONLYSPANS ? " onlyspans" : "",
+	     m_flags & TXTS_KEEPWILD ? " keepwild" : "",
+	     in.substr(0,50).c_str()));
+
+    if (in.empty())
+	return true;
+
+    m_span.erase();
+    m_inNumber = false;
+    m_wordStart = m_wordLen = m_wordChars = m_prevpos = m_prevlen = m_wordpos 
+	= m_spanpos = 0;
+    bool pagepending = false;
+    bool softhyphenpending = false;
+
+    // Running count of non-alphanum chars. Reset when we see one;
+    int nonalnumcnt = 0;
+
+    Utf8Iter it(in);
+
+    for (; !it.eof(); it++) {
+	unsigned int c = *it;
+	nonalnumcnt++;
+
+	if (c == (unsigned int)-1) {
+	    LOGERR(("Textsplit: error occured while scanning UTF-8 string\n"));
+	    return false;
+	}
+
+	if (o_processCJK && UNICODE_IS_CJK(c)) {
+	    // CJK character hit. 
+	    // Do like at EOF with the current non-cjk data.
+	    if (m_wordLen || m_span.length()) {
+		if (!doemit(true, it.getBpos()))
+		    return false;
+	    }
+
+	    // Hand off situation to the cjk routine.
+	    if (!cjk_to_words(&it, &c)) {
+		LOGERR(("Textsplit: scan error in cjk handler\n"));
+		return false;
+	    }
+
+	    // Check for eof, else c contains the first non-cjk
+	    // character after the cjk sequence, just go on.
+	    if (it.eof())
+		break;
+	}
+
+	int cc = whatcc(c);
+
+	switch (cc) {
+	case SKIP:
+	    // Special-case soft-hyphen. To work, this depends on the
+	    // fact that only SKIP calls "continue" inside the
+	    // switch. All the others will do the softhyphenpending
+	    // reset after the switch
+	    if (c == 0xad) {
+		softhyphenpending = true;
+	    } else {
+		softhyphenpending = false;
+	    }
+	    // Skips the softhyphenpending reset
+	    continue;
+
+	case DIGIT:
+	    nonalnumcnt = 0;
+	    if (m_wordLen == 0)
+		m_inNumber = true;
+	    m_wordLen += it.appendchartostring(m_span);
+	    STATS_INC_WORDCHARS;
+	    break;
+
+	case SPACE:
+	    nonalnumcnt = 0;
+	SPACE:
+	    if (m_wordLen || m_span.length()) {
+		if (!doemit(true, it.getBpos()))
+		    return false;
+		m_inNumber = false;
+	    }
+	    if (pagepending) {
+		pagepending = false;
+		newpage(m_wordpos);
+	    }
+	    break;
+
+	case WILD:
+	    if (m_flags & TXTS_KEEPWILD)
+		goto NORMALCHAR;
+	    else
+		goto SPACE;
+	    break;
+
+	case '-':
+	case '+':
+	    if (m_wordLen == 0) {
+		// + or - don't start a term except if this looks like
+		// it's going to be to be a number
+		if (isdigit(whatcc(it[it.getCpos()+1]), m_flags)) {
+		    // -10
+		    m_inNumber = true;
+		    m_wordLen += it.appendchartostring(m_span);
+		    STATS_INC_WORDCHARS;
+                    break;
+		} 
+	    } else if (m_inNumber) {
+                if ((m_span[m_span.length() - 1] == 'e' ||
+				      m_span[m_span.length() - 1] == 'E')) {
+                    if (isdigit(whatcc(it[it.getCpos()+1]), m_flags)) {
+                        m_wordLen += it.appendchartostring(m_span);
+                        STATS_INC_WORDCHARS;
+                        break;
+                    }
+                }
+	    } else {
+                if (cc == '+') {
+                    int nextc = it[it.getCpos()+1];
+                    if (nextc == '+' || nextc == -1 || visiblewhite.find(nextc) 
+                        != visiblewhite.end()) {
+                        // someword++[+...] !
+                        m_wordLen += it.appendchartostring(m_span);
+                        STATS_INC_WORDCHARS;
+                        break;
+                    }
+                } else {
+                    // Treat '-' inside span as glue char
+                    if (!doemit(false, it.getBpos()))
+                        return false;
+                    m_inNumber = false;
+                    m_wordStart += it.appendchartostring(m_span);
+                    break;
+                }
+	    }
+            goto SPACE;
+	    break;
+
+	case 0x2010:
+            // Hyphen is replaced with ascii minus
+	    if (m_wordLen != 0) {
+                // Treat '-' inside span as glue char
+                if (!doemit(false, it.getBpos()))
+                    return false;
+                m_inNumber = false;
+                m_span += '-';
+                m_wordStart++;
+                break;
+            }
+            goto SPACE;
+
+	case '.':
+	{
+	    // Need a little lookahead here. At worse this gets the end null
+	    int nextc = it[it.getCpos()+1];
+	    int nextwhat = whatcc(nextc);
+	    if (m_inNumber) {
+		if (!isdigit(nextwhat, m_flags))
+		    goto SPACE;
+                m_wordLen += it.appendchartostring(m_span);
+                STATS_INC_WORDCHARS;
+		break;
+	    } else {
+		// Found '.' while not in number
+
+		// Only letters and digits make sense after
+		if (!isalphanum(nextwhat, m_flags))
+		    goto SPACE;
+
+		// Keep an initial '.' for catching .net, and .34 (aka
+		// 0.34) but this adds quite a few spurious terms !
+                if (m_span.length() == 0) {
+                    // Check for number like .1
+                    if (isdigit(nextwhat, m_flags)) {
+                        m_inNumber = true;
+                    }
+                    m_wordLen += it.appendchartostring(m_span);
+                    STATS_INC_WORDCHARS;
+                    break;
+                }
+
+                // '.' between words: span glue
+                if (m_wordLen) {
+                    if (!doemit(false, it.getBpos()))
+                        return false;
+                    m_wordStart += it.appendchartostring(m_span);
+                }
+	    }
+	}
+        break;
+
+	case '@':
+	case '_':
+	case '\'':
+	    // If in word, potential span: o'brien, jf@dockes.org,
+	    // else just ignore
+	    if (m_wordLen) {
+		if (!doemit(false, it.getBpos()))
+		    return false;
+		m_inNumber = false;
+                m_wordStart += it.appendchartostring(m_span);
+	    }
+	    break;
+
+	case '#':  {
+	    int w = whatcc(it[it.getCpos()+1]);
+	    // Keep it only at the beginning of a word (hashtag), 
+            if (m_wordLen == 0 && isalphanum(w, m_flags)) {
+                m_wordLen += it.appendchartostring(m_span);
+                STATS_INC_WORDCHARS;
+                break;
+            }
+            // or at the end (special case for c# ...)
+	    if (m_wordLen > 0) {
+		if (w == SPACE || w == '\n' || w == '\r') {
+		    m_wordLen += it.appendchartostring(m_span);
+		    STATS_INC_WORDCHARS;
+		    break;
+		}
+	    }
+	    goto SPACE;
+	}
+	    break;
+
+	case '\n':
+	case '\r':
+	    if (m_span.length() && *m_span.rbegin() == '-') {
+                // if '-' is the last char before end of line, we
+                // strip it.  We have no way to know if this is added
+                // because of the line split or if it was part of an
+                // actual compound word (would need a dictionary to
+                // check).  As soft-hyphen *should* be used if the '-'
+                // is not part of the text, it is better to properly
+                // process a real compound word, and produce wrong
+                // output from wrong text. The word-emitting routine
+                // will strip the trailing '-'.
+                goto SPACE;
+            } else if (softhyphenpending) {
+		// Don't reset soft-hyphen
+		continue;
+	    } else {
+		// Normal case: EOL is white space
+		goto SPACE;
+	    }
+	    break;
+
+	case '\f':
+	    pagepending = true;
+	    goto SPACE;
+	    break;
+
+#ifdef RCL_SPLIT_CAMELCASE
+            // Camelcase handling. 
+            // If we get uppercase ascii after lowercase ascii, emit word.
+            // This emits "camel" when hitting the 'C' of camelCase
+            // Not enabled by defaults as this makes phrase searches quite 
+            // confusing. 
+            // ie "MySQL manual" is matched by "MySQL manual" and 
+            // "my sql manual" but not "mysql manual"
+
+            // A possibility would be to emit both my and sql at the
+            // same position. All non-phrase searches would work, and
+            // both "MySQL manual" and "mysql manual" phrases would
+            // match too. "my sql manual" would not match, but this is
+            // not an issue.
+	case A_ULETTER:
+	    if (m_span.length() && 
+                charclasses[(unsigned char)m_span[m_span.length() - 1]] == 
+                A_LLETTER) {
+                if (m_wordLen) {
+                    if (!doemit(false, it.getBpos()))
+                        return false;
+                }
+            }
+            goto NORMALCHAR;
+
+            // CamelCase handling.
+            // If we get lowercase after uppercase and the current
+            // word length is bigger than one, it means we had a
+            // string of several upper-case letters:  an
+            // acronym (readHTML) or a single letter article (ALittleHelp).
+            // Emit the uppercase word before proceeding
+        case A_LLETTER:
+	    if (m_span.length() && 
+                charclasses[(unsigned char)m_span[m_span.length() - 1]] == 
+                A_ULETTER && m_wordLen > 1) {
+                // Multiple upper-case letters. Single letter word
+                // or acronym which we want to emit now
+                m_wordLen--;
+                if (!doemit(false, it.getBpos()))
+                    return false;
+                // m_wordstart could be 0 here if the span was reset
+                // for excessive length
+                if (m_wordStart)
+                    m_wordStart--;
+                m_wordLen++;
+            }
+            goto NORMALCHAR;
+#endif /* CAMELCASE */
+
+	default:
+	NORMALCHAR:
+	    nonalnumcnt = 0;
+            if (m_inNumber && c != 'e' && c != 'E') {
+                m_inNumber = false;
+            }
+	    m_wordLen += it.appendchartostring(m_span);
+	    STATS_INC_WORDCHARS;
+	    break;
+	}
+	softhyphenpending = false;
+    }
+    if (m_wordLen || m_span.length()) {
+	if (!doemit(true, it.getBpos()))
+	    return false;
+    }
+    return true;
+}
+
+// Using an utf8iter pointer just to avoid needing its definition in
+// textsplit.h
+//
+// We output ngrams for exemple for char input a b c and ngramlen== 2, 
+// we generate: a ab b bc c as words
+//
+// This is very different from the normal behaviour, so we don't use
+// the doemit() and emitterm() routines
+//
+// The routine is sort of a mess and goes to show that we'd probably
+// be better off converting the whole buffer to utf32 on entry...
+bool TextSplit::cjk_to_words(Utf8Iter *itp, unsigned int *cp)
+{
+    LOGDEB1(("cjk_to_words: m_wordpos %d\n", m_wordpos));
+    Utf8Iter &it = *itp;
+
+    // We use an offset buffer to remember the starts of the utf-8
+    // characters which we still need to use.
+    assert(o_CJKNgramLen < o_CJKMaxNgramLen);
+    unsigned int boffs[o_CJKMaxNgramLen+1];
+
+    // Current number of valid offsets;
+    unsigned int nchars = 0;
+    unsigned int c = 0;
+    for (; !it.eof(); it++) {
+	c = *it;
+	if (!UNICODE_IS_CJK(c)) {
+	    // Return to normal handler
+	    break;
+	}
+	if (whatcc(c) == SPACE) {
+	    // Flush the ngram buffer and go on
+	    nchars = 0;
+	    continue;
+	}
+	if (nchars == o_CJKNgramLen) {
+	    // Offset buffer full, shift it. Might be more efficient
+	    // to have a circular one, but things are complicated
+	    // enough already...
+	    for (unsigned int i = 0; i < nchars-1; i++) {
+		boffs[i] = boffs[i+1];
+	    }
+	}  else {
+	    nchars++;
+	}
+
+	// Take note of byte offset for this character.
+	boffs[nchars-1] = int(it.getBpos());
+
+	// Output all new ngrams: they begin at each existing position
+	// and end after the new character. onlyspans->only output
+	// maximum words, nospans=> single chars
+	if (!(m_flags & TXTS_ONLYSPANS) || nchars == o_CJKNgramLen) {
+	    int btend = int(it.getBpos() + it.getBlen());
+	    int loopbeg = (m_flags & TXTS_NOSPANS) ? nchars-1 : 0;
+	    int loopend = (m_flags & TXTS_ONLYSPANS) ? 1 : nchars;
+	    for (int i = loopbeg; i < loopend; i++) {
+		if (!takeword(it.buffer().substr(boffs[i], 
+						       btend-boffs[i]),
+				m_wordpos - (nchars-i-1), boffs[i], btend)) {
+		    return false;
+		}
+	    }
+
+	    if ((m_flags & TXTS_ONLYSPANS)) {
+		// Only spans: don't overlap: flush buffer
+		nchars = 0;
+	    }
+	}
+	// Increase word position by one, other words are at an
+	// existing position. This could be subject to discussion...
+	m_wordpos++;
+    }
+
+    // If onlyspans is set, there may be things to flush in the buffer
+    // first
+    if ((m_flags & TXTS_ONLYSPANS) && nchars > 0 && nchars != o_CJKNgramLen)  {
+	int btend = int(it.getBpos()); // Current char is out
+	if (!takeword(it.buffer().substr(boffs[0], btend-boffs[0]),
+			    m_wordpos - nchars,
+			    boffs[0], btend)) {
+	    return false;
+	}
+    }
+
+    m_span.erase();
+    m_inNumber = false;
+    m_wordStart = m_wordLen = m_wordChars = m_prevpos = m_prevlen = 0;
+    m_spanpos = m_wordpos;
+    *cp = c;
+    return true;
+}
+
+// Specialization for countWords 
+class TextSplitCW : public TextSplit {
+ public:
+    int wcnt;
+    TextSplitCW(Flags flags) : TextSplit(flags), wcnt(0) {}
+    bool takeword(const string &, int, int, int) {
+	wcnt++;
+	return true;
+    }
+};
+
+int TextSplit::countWords(const string& s, TextSplit::Flags flgs)
+{
+    TextSplitCW splitter(flgs);
+    splitter.text_to_words(s);
+    return splitter.wcnt;
+}
+
+bool TextSplit::hasVisibleWhite(const string &in)
+{
+    Utf8Iter it(in);
+    for (; !it.eof(); it++) {
+	unsigned int c = (unsigned char)*it;
+	LOGDEB3(("TextSplit::hasVisibleWhite: testing 0x%04x\n", c));
+	if (c == (unsigned int)-1) {
+	    LOGERR(("hasVisibleWhite: error while scanning UTF-8 string\n"));
+	    return false;
+	}
+	if (visiblewhite.find(c) != visiblewhite.end())
+	    return true;
+    }
+    return false;
+}
+
+template  bool u8stringToStrings(const string &s, T &tokens)
+{
+    Utf8Iter it(s);
+
+    string current;
+    tokens.clear();
+    enum states {SPACE, TOKEN, INQUOTE, ESCAPE};
+    states state = SPACE;
+    for (; !it.eof(); it++) {
+	unsigned int c = *it;
+	if (visiblewhite.find(c) != visiblewhite.end()) 
+	    c = ' ';
+	LOGDEB3(("TextSplit::stringToStrings: 0x%04x\n", c));
+	if (c == (unsigned int)-1) {
+	    LOGERR(("TextSplit::stringToStrings: error while "
+		    "scanning UTF-8 string\n"));
+	    return false;
+	}
+
+	switch (c) {
+	    case '"': 
+	    switch(state) {
+	    case SPACE: state = INQUOTE; continue;
+	    case TOKEN: goto push_char;
+	    case ESCAPE: state = INQUOTE; goto push_char;
+	    case INQUOTE: tokens.push_back(current);current.clear();
+		state = SPACE; continue;
+	    }
+	    break;
+	    case '\\': 
+	    switch(state) {
+	    case SPACE: 
+	    case TOKEN: state=TOKEN; goto push_char;
+	    case INQUOTE: state = ESCAPE; continue;
+	    case ESCAPE: state = INQUOTE; goto push_char;
+	    }
+	    break;
+
+	    case ' ': 
+	    case '\t': 
+	    case '\n': 
+	    case '\r': 
+	    switch(state) {
+	      case SPACE: continue;
+	      case TOKEN: tokens.push_back(current); current.clear();
+		state = SPACE; continue; 
+	    case INQUOTE: 
+	    case ESCAPE: goto push_char;
+	    }
+	    break;
+
+	    default:
+	    switch(state) {
+	      case ESCAPE: state = INQUOTE; break;
+	      case SPACE:  state = TOKEN;  break;
+	      case TOKEN: 
+	      case INQUOTE: break;
+	    }
+	push_char:
+	    it.appendchartostring(current);
+	}
+    }
+
+    // End of string. Process residue, and possible error (unfinished quote)
+    switch(state) {
+    case SPACE: break;
+    case TOKEN: tokens.push_back(current); break;
+    case INQUOTE: 
+    case ESCAPE: return false;
+    }
+    return true;
+}
+
+bool TextSplit::stringToStrings(const string &s, vector &tokens)
+{
+    return u8stringToStrings >(s, tokens);
+}
+
+#else  // TEST driver ->
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include "textsplit.h"
+#include "readfile.h"
+#include "debuglog.h"
+#include "transcode.h"
+#include "unacpp.h"
+#include "termproc.h"
+
+using namespace std;
+
+class myTermProc : public Rcl::TermProc {
+    int first;
+    bool nooutput;
+public:
+    myTermProc() : TermProc(0), first(1), nooutput(false) {}
+    void setNoOut(bool val) {nooutput = val;}
+    virtual bool takeword(const string &term, int pos, int bs, int be)
+    {
+	if (nooutput)
+	    return true;
+	FILE *fp = stdout;
+	if (first) {
+	    fprintf(fp, "%3s %-20s %4s %4s\n", "pos", "Term", "bs", "be");
+	    first = 0;
+	}
+	fprintf(fp, "%3d %-20s %4d %4d\n", pos, term.c_str(), bs, be);
+	return true;
+    }
+};
+
+#define OPT_s	  0x1 
+#define OPT_w	  0x2
+#define OPT_q	  0x4
+#define OPT_c     0x8
+#define OPT_k     0x10
+#define OPT_C     0x20
+#define OPT_n     0x40
+#define OPT_S     0x80
+#define OPT_u     0x100
+#define OPT_p     0x200
+
+bool dosplit(const string& data, TextSplit::Flags flags, int op_flags)
+{
+    myTermProc printproc;
+
+    Rcl::TermProc *nxt = &printproc;
+
+//    Rcl::TermProcCommongrams commonproc(nxt, stoplist);
+//    if (op_flags & OPT_S)
+//        nxt = &commonproc;
+
+    Rcl::TermProcPrep preproc(nxt);
+    if (op_flags & OPT_u) 
+        nxt = &preproc;
+
+    Rcl::TextSplitP splitter(nxt, flags);
+
+    if (op_flags & OPT_q)
+        printproc.setNoOut(true);
+
+    splitter.text_to_words(data);
+
+#ifdef TEXTSPLIT_STATS
+	TextSplit::Stats::Values v = splitter.getStats();
+	cout << "Average length: " 
+	     <<  v.avglen
+	     << " Standard deviation: " 
+	     << v.sigma
+	     << " Coef of variation "
+	     << v.sigma / v.avglen
+	     << endl;
+#endif
+    return true;
+}
+
+static const char *teststrings[] = {
+    "Un bout de texte \nnormal. 2eme phrase.3eme;quatrieme.\n",
+    "\"Jean-Francois Dockes\" \n",
+    "n@d @net .net net@ t@v@c c# c++ o'brien 'o'brien'",
+    "_network_ some_span",
+    "data123\n",
+    "134 +134 -14 0.1 .1 2. -1.5 +1.5 1,2 1.54e10 1,2e30 .1e10 1.e-8\n",
+    "@^#$(#$(*)\n",
+    "192.168.4.1 one\n\rtwo\r",
+    "[olala][ululu]  (valeur) (23)\n",
+    "utf-8 ucs-4© \\nodef\n",
+    "A b C 2 . +",
+    "','this\n",
+    " ,able,test-domain",
+    " -wl,--export-dynamic",
+    " ~/.xsession-errors",
+    "this_very_long_span_this_very_long_span_this_very_long_span",
+    "soft\xc2\xadhyphen",
+    "soft\xc2\xad\nhyphen",
+    "soft\xc2\xad\n\rhyphen",
+    "real\xe2\x80\x90hyphen",
+    "real\xe2\x80\x90\nhyphen",
+    "hyphen-\nminus",
+};
+const int teststrings_cnt = sizeof(teststrings)/sizeof(char *);
+
+static string teststring1 = " nouvel-an ";
+
+static string thisprog;
+
+static string usage =
+    " textsplit [opts] [filename]\n"
+    "   -q : no output\n"
+    "   -s :  only spans\n"
+    "   -w :  only words\n"
+    "   -n :  no numbers\n"
+    "   -k :  preserve wildcards (?*)\n"
+    "   -c : just count words\n"
+    "   -u : use unac\n"
+    "   -C [charset] : input charset\n"
+    "   -S [stopfile] : stopfile to use for commongrams\n"
+    " if filename is 'stdin', will read stdin for data (end with ^D)\n\n"
+    " textplit -p somephrase : display results from stringToStrings()\n"
+    "  \n"
+    ;
+
+static void
+Usage(void)
+{
+    cerr << thisprog  << ": usage:\n" << usage;
+    exit(1);
+}
+
+static int        op_flags;
+
+int main(int argc, char **argv)
+{
+    string charset, stopfile;
+
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 'c':	op_flags |= OPT_c; break;
+            case 'C':	op_flags |= OPT_C; if (argc < 2)  Usage();
+                charset = *(++argv); argc--; 
+                goto b1;
+	    case 'k':	op_flags |= OPT_k; break;
+	    case 'n':	op_flags |= OPT_n; break;
+	    case 'p':	op_flags |= OPT_p; break;
+	    case 'q':	op_flags |= OPT_q; break;
+	    case 's':	op_flags |= OPT_s; break;
+            case 'S':	op_flags |= OPT_S; if (argc < 2)  Usage();
+                stopfile = *(++argv); argc--; 
+                goto b1;
+	    case 'u':	op_flags |= OPT_u; break;
+	    case 'w':	op_flags |= OPT_w; break;
+	    default: Usage();	break;
+	    }
+    b1: argc--; argv++;
+    }
+    DebugLog::getdbl()->setloglevel(DEBDEB1);
+    DebugLog::setfilename("stderr");
+
+    TextSplit::Flags flags = TextSplit::TXTS_NONE;
+
+    if (op_flags&OPT_s)
+	flags = TextSplit::TXTS_ONLYSPANS;
+    else if (op_flags&OPT_w)
+	flags = TextSplit::TXTS_NOSPANS;
+    if (op_flags & OPT_k) 
+	flags = (TextSplit::Flags)(flags | TextSplit::TXTS_KEEPWILD); 
+    if (op_flags & OPT_n)
+	TextSplit::noNumbers();
+
+    Rcl::StopList stoplist;
+    if (op_flags & OPT_S) {
+	if (!stoplist.setFile(stopfile)) {
+	    cerr << "Can't read stopfile: " << stopfile << endl;
+	    exit(1);
+	}
+    }
+    string odata, reason;
+    if (argc == 1) {
+	const char *filename = *argv++;	argc--;
+        if (op_flags& OPT_p) {
+            vector tokens;
+            TextSplit::stringToStrings(filename, tokens);
+            for (vector::const_iterator it = tokens.begin();
+                 it != tokens.end(); it++) {
+                cout << "[" << *it << "] ";
+            }
+            cout << endl;
+            exit(0);
+        }
+	if (!strcmp(filename, "stdin")) {
+	    char buf[1024];
+	    int nread;
+	    while ((nread = read(0, buf, 1024)) > 0) {
+		odata.append(buf, nread);
+	    }
+	} else if (!file_to_string(filename, odata, &reason)) {
+            cerr << "Failed: file_to_string(" << filename << ") failed: " 
+                 << reason << endl;
+	    exit(1);
+        }
+    } else {
+        if (op_flags & OPT_p)
+            Usage();
+        for (int i = 0; i < teststrings_cnt; i++) {
+            cout << endl << teststrings[i] << endl;  
+            dosplit(teststrings[i], flags, op_flags);
+        }
+        exit(0);
+    }
+
+    string& data = odata;
+    string ndata;
+    if ((op_flags & OPT_C)) {
+        if (!transcode(odata, ndata, charset, "UTF-8")) {
+            cerr << "Failed: transcode error" << endl;
+            exit(1);
+        } else {
+            data = ndata;
+        }
+    }
+
+    if (op_flags & OPT_c) {
+	int n = TextSplit::countWords(data, flags);
+	cout << n << " words" << endl;
+    } else {
+        dosplit(data, flags, op_flags);
+    }    
+}
+#endif // TEST
diff --git a/src/common/textsplit.h b/src/common/textsplit.h
new file mode 100644
index 00000000..d408bb2e
--- /dev/null
+++ b/src/common/textsplit.h
@@ -0,0 +1,225 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _TEXTSPLIT_H_INCLUDED_
+#define _TEXTSPLIT_H_INCLUDED_
+
+#include 
+
+#include 
+#include 
+
+class Utf8Iter;
+
+/** 
+ * Split text into words. 
+ * See comments at top of .cpp for more explanations.
+ * This uses a callback function. It could be done with an iterator instead,
+ * but 'ts much simpler this way...
+ */
+class TextSplit {
+public:
+    // Should we activate special processing of Chinese characters ? This
+    // needs a little more cpu, so it can be turned off globally. This is set
+    // by rclconfig, changing it means reindexing
+    static bool o_processCJK;
+    static unsigned int  o_CJKNgramLen;
+    static const unsigned int o_CJKMaxNgramLen =  5;
+    static void cjkProcessing(bool onoff, unsigned int ngramlen = 2) 
+    {
+	o_processCJK = onoff;
+	o_CJKNgramLen = ngramlen <= o_CJKMaxNgramLen ? 
+	    ngramlen : o_CJKMaxNgramLen;
+    }
+
+    // Are we indexing numbers ? Set by rclconfig. Change needs reindex
+    static bool o_noNumbers;
+    static void noNumbers()
+    {
+	o_noNumbers = true;
+    }
+
+    // Given [co-worker] as input, do we also generate [coworker] ?
+    // Set by rclconfig
+    static bool o_deHyphenate;
+    static void deHyphenate(bool on) {
+	o_deHyphenate = on;
+    }
+
+    enum Flags {
+        // Default: will return spans and words (a_b, a, b)
+        TXTS_NONE = 0, 
+        // Only return maximum spans (a@b.com, not a, b, or com) 
+        TXTS_ONLYSPANS = 1,  
+        // Special: Only return atomic words (a, b, com).  This is not
+        // used for indexing, but for position computation during
+        // abstract generation,
+        TXTS_NOSPANS = 2,  
+        // Handle wildcards as letters. This is used with ONLYSPANS
+        // for parsing a user query (never alone).
+        TXTS_KEEPWILD = 4 
+    };
+    
+    TextSplit(Flags flags = Flags(TXTS_NONE))
+	: m_flags(flags), m_maxWordLength(40), m_prevpos(-1)
+    {
+    }
+    virtual ~TextSplit() {}
+
+    /** Split text, emit words and positions. */
+    virtual bool text_to_words(const std::string &in);
+
+    /** Process one output word: to be implemented by the actual user class */
+    virtual bool takeword(const std::string& term, 
+			  int pos,  // term pos
+			  int bts,  // byte offset of first char in term
+			  int bte   // byte offset of first char after term
+			  ) = 0; 
+
+    /** Called when we encounter formfeed \f 0x0c. Override to use the event.
+     * Mostly or exclusively used with pdftoxx output. Other filters mostly 
+     * just don't know about pages. */
+    virtual void newpage(int /*pos*/)
+    {
+    }
+
+    // Static utility functions:
+
+    /** Count words in string, as the splitter would generate them */
+    static int countWords(const std::string &in, Flags flgs = TXTS_ONLYSPANS);
+
+    /** Check if this is visibly not a single block of text */
+    static bool hasVisibleWhite(const std::string &in);
+
+    /** Split text span into strings, at white space, allowing for substrings
+     * quoted with " . Escaping with \ works as usual inside the quoted areas.
+     * This has to be kept separate from smallut.cpp's stringsToStrings, which
+     * basically works only if whitespace is ascii, and which processes 
+     * non-utf-8 input (iso-8859 config files work ok). This hopefully
+     * handles all Unicode whitespace, but needs correct utf-8 input
+     */
+    static bool stringToStrings(const std::string &s, std::vector &tokens);
+
+    /** Is char CJK ? */
+    static bool isCJK(int c);
+
+    /** Statistics about word length (average and dispersion) can
+     * detect bad data like undecoded base64 or other mis-identified
+     * pieces of data taken as text. In practise, this keeps some junk out 
+     * of the index, but does not decrease the index size much, and is
+     * probably not worth the trouble in general. Code kept because it
+     * probably can be useful in special cases. Base64 data does has
+     * word separators in it (+/) and is characterised by high average
+     * word length (>10, often close to 20) and high word length
+     * dispersion (avg/sigma > 0.8). In my tests, most natural
+     * language text has average word lengths around 5-8 and avg/sigma
+     * < 0.7
+     */
+#ifdef TEXTSPLIT_STATS
+    class Stats {
+    public:
+	Stats()
+	{
+	    reset();
+	}
+	void reset()
+	{
+	    count = 0;
+	    totlen = 0;
+	    sigma_acc = 0;
+	}
+	void newsamp(unsigned int len)
+	{
+	    ++count;
+	    totlen += len;
+	    double avglen = double(totlen) / double(count);
+	    sigma_acc += (avglen - len) * (avglen - len);
+	}
+	struct Values {
+	    int count;
+	    double avglen;
+	    double sigma;
+	};
+	Values get()
+	{
+	    Values v;
+	    v.count = count;
+	    v.avglen = double(totlen) / double(count);
+	    v.sigma = sqrt(sigma_acc / count);
+	    return v;
+	}
+    private:
+	int count;
+	int totlen;
+	double sigma_acc;
+    };
+
+    Stats::Values getStats()
+    {
+	return m_stats.get();
+    }
+    void resetStats()
+    {
+	m_stats.reset();
+    }
+#endif // TEXTSPLIT_STATS
+
+private:
+    Flags         m_flags;
+    int           m_maxWordLength;
+
+    // Current span. Might be jf.dockes@wanadoo.f
+    std::string        m_span; 
+
+    std::vector  > m_words_in_span;
+
+    // Current word: no punctuation at all in there. Byte offset
+    // relative to the current span and byte length
+    int           m_wordStart;
+    unsigned int  m_wordLen;
+
+    // Currently inside number
+    bool          m_inNumber;
+
+    // Term position of current word and span
+    int           m_wordpos; 
+    int           m_spanpos;
+
+    // It may happen that our cleanup would result in emitting the
+    // same term twice. We try to avoid this
+    int           m_prevpos;
+    int           m_prevlen;
+
+#ifdef TEXTSPLIT_STATS
+    // Stats counters. These are processed in TextSplit rather than by a 
+    // TermProc so that we can take very long words (not emitted) into
+    // account.
+    Stats         m_stats;
+#endif
+    // Word length in characters. Declared but not updated if !TEXTSPLIT_STATS
+    unsigned int  m_wordChars;
+
+    // This processes cjk text:
+    bool cjk_to_words(Utf8Iter *it, unsigned int *cp);
+
+    bool emitterm(bool isspan, std::string &term, int pos, size_t bs,size_t be);
+    bool doemit(bool spanerase, size_t bp);
+    void discardspan();
+    bool span_is_acronym(std::string *acronym);
+    bool words_from_span(size_t bp);
+};
+
+#endif /* _TEXTSPLIT_H_INCLUDED_ */
diff --git a/src/common/unacpp.cpp b/src/common/unacpp.cpp
new file mode 100644
index 00000000..837786de
--- /dev/null
+++ b/src/common/unacpp.cpp
@@ -0,0 +1,249 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef TEST_UNACPP
+#include 
+#include 
+#include 
+
+#include 
+
+#include "unacpp.h"
+#include "unac.h"
+#include "debuglog.h"
+#include "utf8iter.h"
+
+bool unacmaybefold(const string &in, string &out, 
+		   const char *encoding, UnacOp what)
+{
+    char *cout = 0;
+    size_t out_len;
+    int status = -1;
+
+    switch (what) {
+    case UNACOP_UNAC:
+	status = unac_string(encoding, in.c_str(), in.length(), 
+			     &cout, &out_len);
+	break;
+    case UNACOP_UNACFOLD:
+	status = unacfold_string(encoding, in.c_str(), in.length(), 
+				 &cout, &out_len);
+	break;
+    case UNACOP_FOLD:
+	status = fold_string(encoding, in.c_str(), in.length(), 
+			     &cout, &out_len);
+	break;
+    }
+
+    if (status < 0) {
+	if (cout)
+	    free(cout);
+	char cerrno[20];
+	sprintf(cerrno, "%d", errno);
+	out = string("unac_string failed, errno : ") + cerrno;
+	return false;
+    }
+    out.assign(cout, out_len);
+    if (cout)
+	free(cout);
+    return true;
+}
+
+// Functions to determine upper-case or accented status could be implemented
+// hugely more efficiently inside the unac c code, but there only used for
+// testing user-entered terms, so we don't really care.
+bool unaciscapital(const string& in)
+{
+    LOGDEB2(("unaciscapital: [%s]\n", in.c_str()));
+    if (in.empty())
+	return false;
+    Utf8Iter it(in);
+    string shorter;
+    it.appendchartostring(shorter);
+
+    string lower;
+    if (!unacmaybefold(shorter, lower, "UTF-8", UNACOP_FOLD)) {
+	LOGINFO(("unaciscapital: unac/fold failed for [%s]\n", in.c_str()));
+	return false;
+    } 
+    Utf8Iter it1(lower);
+    if (*it != *it1)
+	return true;
+    else
+	return false;
+}
+bool unachasuppercase(const string& in)
+{
+    LOGDEB2(("unachasuppercase: [%s]\n", in.c_str()));
+    if (in.empty())
+	return false;
+
+    string lower;
+    if (!unacmaybefold(in, lower, "UTF-8", UNACOP_FOLD)) {
+	LOGINFO(("unachasuppercase: unac/fold failed for [%s]\n", in.c_str()));
+	return false;
+    } 
+    if (lower != in)
+	return true;
+    else
+	return false;
+}
+bool unachasaccents(const string& in)
+{
+    LOGDEB2(("unachasaccents: [%s]\n", in.c_str()));
+    if (in.empty())
+	return false;
+
+    string noac;
+    if (!unacmaybefold(in, noac, "UTF-8", UNACOP_UNAC)) {
+	LOGINFO(("unachasaccents: unac/unac failed for [%s]\n", in.c_str()));
+	return false;
+    } 
+    if (noac != in)
+	return true;
+    else
+	return false;
+}
+
+#else // not testing
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+using namespace std;
+
+#include "unacpp.h"
+#include "readfile.h"
+#include "rclinit.h"
+
+static char *thisprog;
+
+static char usage [] = "\n"
+    "[-c|-C]   \n"
+    "   Default : unaccent\n"
+    "   -c : unaccent and casefold\n"
+    "   -C : casefold only\n"
+    "-t  test string as capitalized, upper-case anywhere, accents\n"
+    "   the parameter is supposedly utf-8 so this can only work in an utf-8\n"
+    "   locale\n"
+    "\n";
+;
+
+static void
+Usage(void)
+{
+    fprintf(stderr, "%s: usage: %s\n", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_c	  0x2 
+#define OPT_C	  0x4 
+#define OPT_t     0x8
+
+int main(int argc, char **argv)
+{
+    UnacOp op = UNACOP_UNAC;
+
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 'c':	op_flags |= OPT_c; break;
+	    case 'C':	op_flags |= OPT_C; break;
+	    case 't':	op_flags |= OPT_t; break;
+	    default: Usage();	break;
+	    }
+	argc--; argv++;
+    }
+
+    if (op_flags & OPT_t) {
+	if (argc != 1)
+	    Usage();
+	string in = *argv++;argc--;
+	bool capital, upper, accent;
+	capital = unaciscapital(in);
+	upper = unachasuppercase(in);
+	accent = unachasaccents(in);
+	cout << "[" << in << "] : " << 
+	    "capitalized: " << (capital ? "Yes. " : "No. ") <<
+	    "has uppercase: " << (upper ? "Yes. " : "No. ") <<
+	    "has accents: " << (accent ? "Yes. " : "No. ") << 
+	    endl;
+	return 0;
+    } else {
+	if (argc != 3)
+	    Usage();
+	if (op_flags & OPT_c) {
+	    op = UNACOP_UNACFOLD;
+	} else if (op_flags & OPT_C) {
+	    op = UNACOP_FOLD;
+	}
+
+	const char *encoding = *argv++; argc--;
+	string ifn = *argv++; argc--;
+	if (!ifn.compare("stdin"))
+	    ifn.clear();
+	const char *ofn = *argv++; argc--;
+
+	string reason;
+	(void)recollinit(RCLINIT_NONE, 0, 0, reason, 0);
+
+	string odata;
+	if (!file_to_string(ifn, odata)) {
+	    cerr << "file_to_string " << ifn << " : " << odata << endl;
+	    return 1;
+	}
+	string ndata;
+	if (!unacmaybefold(odata, ndata, encoding, op)) {
+	    cerr << "unac: " << ndata << endl;
+	    return 1;
+	}
+    
+	int fd;
+	if (strcmp(ofn, "stdout")) {
+	    fd = open(ofn, O_CREAT|O_EXCL|O_WRONLY, 0666);
+	} else {
+	    fd = 1;
+	}
+	if (fd < 0) {
+	    cerr << "Open/Create " << ofn << " failed: " << strerror(errno) 
+		 << endl;
+	    return 1;
+	}
+	if (write(fd, ndata.c_str(), ndata.length()) != (int)ndata.length()) {
+	    cerr << "Write(2) failed: " << strerror(errno)  << endl;
+	    return 1;
+	}
+	close(fd);
+	return 0;
+    }
+}
+
+#endif
diff --git a/src/common/unacpp.h b/src/common/unacpp.h
new file mode 100644
index 00000000..643b6ad3
--- /dev/null
+++ b/src/common/unacpp.h
@@ -0,0 +1,40 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _UNACPP_H_INCLUDED_
+#define _UNACPP_H_INCLUDED_
+
+#include 
+
+#ifndef NO_NAMESPACES
+using std::string;
+#endif /* NO_NAMESPACES */
+
+// A small stringified wrapper for unac.c
+enum UnacOp {UNACOP_UNAC = 1, UNACOP_FOLD = 2, UNACOP_UNACFOLD = 3};
+extern bool unacmaybefold(const string& in, string& out, 
+			  const char *encoding, UnacOp what);
+
+// Utility function to determine if string begins with capital
+extern bool unaciscapital(const string& in);
+// Utility function to determine if string has upper-case anywhere
+extern bool unachasuppercase(const string& in);
+// Utility function to determine if any character is accented. This
+// approprialey ignores the characters from unac_except_chars which
+// are really separate letters
+extern bool unachasaccents(const string& in);
+
+#endif /* _UNACPP_H_INCLUDED_ */
diff --git a/src/common/uproplist.h b/src/common/uproplist.h
new file mode 100644
index 00000000..d8254ec7
--- /dev/null
+++ b/src/common/uproplist.h
@@ -0,0 +1,202 @@
+/* Copyright (C) 2004 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+#ifndef _PROPLIST_H_INCLUDED_
+#define _PROPLIST_H_INCLUDED_
+
+
+/** 
+ * A subset of Unicode chars that we consider word breaks when we
+ * split text in words. 
+ *
+ * This is used as a quick fix to the ascii-based code, and is not correct.
+ * the correct way would be to do what http://www.unicode.org/reports/tr29/ 
+ * says. 
+*/
+
+// Punctuation chararacters blocks array.  Each block is defined by a
+// starting and ending code point (both included). MUST BE SORTED.
+static const unsigned unipuncblocks[] = {
+    // Start of latin-1 supplement block, up to capital A grave
+    0x0080, 0x00BF,
+    // General punctuation
+    0x2000, 0x206F,
+    // Superscripts and subscripts
+    0x2070, 0x209F,
+    // Currency symbols
+    0x20A0, 0x20CF,
+    // Letterlike symbols
+    0x2100, 0x214f,
+    // Number forms
+    0x2150, 0x218F,
+    // Arrows
+    0x2190, 0x21FF,
+    // Mathematical Operators
+    0x2200, 0x22FF,
+    // Miscellaneous Technical
+    0x2300, 0x23FF,
+    // Control Pictures
+    0x2400, 0x243F,
+    // Optical Character Recognition
+    0x2440, 0x245F,
+    // Enclosed Alphanumerics
+    0x2460, 0x24FF,
+    // Box Drawing
+    0x2500, 0x257F,
+    // Block Elements
+    0x2580, 0x259F,
+    // Geometric Shapes
+    0x25A0, 0x25FF,
+    // Miscellaneous Symbols
+    0x2600, 0x26FF,
+    // Dingbats
+    0x2700, 0x27BF,
+    // Miscellaneous Mathematical Symbols-A 	
+    0x27C0, 0x27EF,
+    // Supplemental Arrows-A
+    0x27F0, 0x27FF,
+    // Supplemental Arrows-B
+    0x2900, 0x297F,
+    // Miscellaneous Mathematical Symbols-B 	
+    0x2980,  0x29FF,
+    // Supplemental Mathematical Operators
+    0x2A00, 0x2AFF,
+    // Miscellaneous Symbols and Arrows
+    0x2B00, 0x2BFF,
+};
+
+// Other punctuation characters list. Not all punctuation is in a
+// separate block some is found in the middle of alphanumeric codes.
+static const unsigned int unipunc[] = {
+    0x00D7, /* MULTIPLICATION SIGN */
+    0x00F7, /* DIVISION SIGN */
+    0x037E, /* GREEK QUESTION MARK */
+    0x0387, /* GREEK ANO TELEIA */
+    0x055C, /* ARMENIAN EXCLAMATION MARK */
+    0x055E, /* ARMENIAN QUESTION MARK */
+    0x0589, /* ARMENIAN FULL STOP */
+    0x058A, /* ARMENIAN HYPHEN */
+    0x05C3, /* HEBREW PUNCTUATION SOF PASUQ */
+    0x060C, /* ARABIC COMMA */
+    0x061B, /* ARABIC SEMICOLON */
+    0x061F, /* ARABIC QUESTION MARK */
+    0x06D4, /* ARABIC FULL STOP */
+    0x0964, /* DEVANAGARI DANDA */
+    0x0965, /* DEVANAGARI DOUBLE DANDA */
+    0x166E, /* CANADIAN SYLLABICS FULL STOP */
+    0x1680, /* OGHAM SPACE MARK */
+    0x16EB, /* RUNIC SINGLE PUNCTUATION */
+    0x16EC, /* RUNIC MULTIPLE PUNCTUATION */
+    0x16ED, /* RUNIC CROSS PUNCTUATION */
+    0x1803, /* MONGOLIAN FULL STOP */
+    0x1806, /* MONGOLIAN TODO SOFT HYPHEN */
+    0x1809, /* MONGOLIAN MANCHU FULL STOP */
+    0x180E, /* MONGOLIAN VOWEL SEPARATOR */
+    0x2E2E, /* REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; */
+    0x3000, /* IDEOGRAPHIC SPACE*/
+    0x3002, /* IDEOGRAPHIC FULL STOP*/
+    0x300C, /* LEFT CORNER BRACKET*/
+    0x300D, /* RIGHT CORNER BRACKET*/
+    0x300E, /* LEFT WHITE CORNER BRACKET*/
+    0x300F, /* RIGHT WHITE CORNER BRACKET*/
+    0x301C, /* WAVE DASH*/
+    0x301D, /* REVERSED DOUBLE PRIME QUOTATION MARK*/
+    0x301E, /* LOW DOUBLE PRIME QUOTATION MARK*/
+    0x3030, /* WAVY DASH*/
+    0x30FB, /* KATAKANA MIDDLE DOT*/
+    0xC2B6, /* PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; */
+    0xC3B7, /* DIVISION SIGN;Sm;0;ON;;;;;N;;;;; */
+    0xFE31, /* PRESENTATION FORM FOR VERTICAL EM DASH*/
+    0xFE32, /* PRESENTATION FORM FOR VERTICAL EN DASH*/
+    0xFE41, /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/
+    0xFE42, /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/
+    0xFE43, /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/
+    0xFE44, /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/
+    0xFE50, /* [3] SMALL COMMA..SMALL FULL STOP*/
+    0xFE51, /* [3] SMALL COMMA..SMALL FULL STOP*/
+    0xFE52, /* STOP*/
+    0xFE52, /* [3] SMALL COMMA..SMALL FULL STOP*/
+    0xFE54, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/
+    0xFE55, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/
+    0xFE56, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/
+    0xFE57, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/
+    0xFE58, /* SMALL EM DASH */
+    0xFE63, /* SMALL HYPHEN-MINUS */
+    0xFF01, /* FULLWIDTH EXCLAMATION MARK */
+    0xFF02, /* FULLWIDTH QUOTATION MARK */
+    0xFF03, /* FULLWIDTH NUMBER SIGN */
+    0xFF04, /* FULLWIDTH DOLLAR SIGN */
+    0xFF05, /* FULLWIDTH PERCENT SIGN */
+    0xFF06, /* FULLWIDTH AMPERSAND */
+    0xFF07, /* FULLWIDTH APOSTROPHE */
+    0xFF08, /* FULLWIDTH LEFT PARENTHESIS */
+    0xFF09, /* FULLWIDTH RIGHT PARENTHESIS */
+    0xFF0A, /* FULLWIDTH ASTERISK */
+    0xFF0B, /* FULLWIDTH PLUS SIGN */
+    0xFF0C, /* FULLWIDTH COMMA */
+    0xFF0D, /* FULLWIDTH HYPHEN-MINUS */
+    0xFF0E, /* FULLWIDTH FULL STOP */
+    0xFF0F, /* FULLWIDTH SOLIDUS  */
+    0xFF1A, /* [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/
+    0xFF1B, /* [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/
+    0xFF1F, /* FULLWIDTH QUESTION MARK*/
+    0xFF61, /* HALFWIDTH IDEOGRAPHIC FULL STOP*/
+    0xFF62, /* HALFWIDTH LEFT CORNER BRACKET*/
+    0xFF63, /* HALFWIDTH RIGHT CORNER BRACKET*/
+    0xFF64, /* HALFWIDTH IDEOGRAPHIC COMMA*/
+    0xFF65, /* HALFWIDTH KATAKANA MIDDLE DOT*/
+};
+
+// Characters that should just be discarded. Some of these are in the
+// above blocks, but this array is tested first, so it's not worth
+// breaking the blocks
+static const unsigned int uniskip[] = {
+    0x00AD, /* SOFT HYPHEN */
+    0x034F, /* COMBINING GRAPHEME JOINER */
+    0x2027, /* HYPHENATION POINT */
+    0x200C, /* ZERO WIDTH NON-JOINER */
+    0x200D, /* ZERO WIDTH JOINER */
+    0x2060, /* WORD JOINER . Actually this should not be ignored but used to 
+	     * prevent a word break... */
+};
+
+/* Things that would visibly break a block of text, rendering obvious the need
+ * of quotation if a phrase search is wanted */
+static const unsigned int avsbwht[] = {
+    0x0009, /* CHARACTER TABULATION */
+    0x000A, /* LINE FEED */
+    0x000D, /* CARRIAGE RETURN */
+    0x0020, /* SPACE;Zs;0;WS */
+    0x00A0, /* NO-BREAK SPACE;Zs;0;CS */
+    0x1680, /* OGHAM SPACE MARK;Zs;0;WS */
+    0x180E, /* MONGOLIAN VOWEL SEPARATOR;Zs;0;WS */
+    0x2000, /* EN QUAD;Zs;0;WS */
+    0x2001, /* EM QUAD;Zs;0;WS */
+    0x2002, /* EN SPACE;Zs;0;WS */
+    0x2003, /* EM SPACE;Zs;0;WS */
+    0x2004, /* THREE-PER-EM SPACE;Zs;0;WS */
+    0x2005, /* FOUR-PER-EM SPACE;Zs;0;WS */
+    0x2006, /* SIX-PER-EM SPACE;Zs;0;WS */
+    0x2007, /* FIGURE SPACE;Zs;0;WS */
+    0x2008, /* PUNCTUATION SPACE;Zs;0;WS */
+    0x2009, /* THIN SPACE;Zs;0;WS */
+    0x200A, /* HAIR SPACE;Zs;0;WS */
+    0x202F, /* NARROW NO-BREAK SPACE;Zs;0;CS */
+    0x205F, /* MEDIUM MATHEMATICAL SPACE;Zs;0;WS */
+    0x3000, /* IDEOGRAPHIC SPACE;Zs;0;WS */
+};
+
+#endif // _PROPLIST_H_INCLUDED_
diff --git a/src/configure.ac b/src/configure.ac
new file mode 100644
index 00000000..01ff4056
--- /dev/null
+++ b/src/configure.ac
@@ -0,0 +1,590 @@
+AC_INIT([Recoll], m4_esyscmd_s(cat VERSION))
+AC_CONFIG_HEADERS([common/autoconfig.h])
+AH_BOTTOM([#include "conf_post.h"])
+AC_PREREQ(2.53)
+AC_CONFIG_SRCDIR(index/recollindex.cpp)
+
+AM_INIT_AUTOMAKE([1.10 no-define subdir-objects foreign])
+AC_DISABLE_STATIC
+LT_INIT
+AC_CONFIG_MACRO_DIR([m4])
+
+AC_PROG_CXX
+if test C$CXX = C ; then
+   AC_MSG_ERROR([C++ compiler needed. Please install one (ie: gnu g++)])
+fi
+
+AC_PROG_YACC
+
+AC_PROG_LIBTOOL
+AC_C_BIGENDIAN
+
+AC_SYS_LARGEFILE
+
+# OpenBSD needs sys/param.h for mount.h to compile
+AC_CHECK_HEADERS([sys/param.h, spawn.h])
+
+AC_CHECK_FUNCS([posix_spawn, setrlimit])
+
+if test "x$ac_cv_func_posix_spawn" = xyes; then :
+   AC_ARG_ENABLE(posix_spawn,
+    AC_HELP_STRING([--enable-posix_spawn],
+   [Enable the use of posix_spawn().]),
+        posixSpawnEnabled=$enableval, posixSpawnEnabled=no)
+fi
+if test X$posixSpawnEnabled = Xyes ; then
+  AC_DEFINE(USE_POSIX_SPAWN, 1, [Use posix_spawn()])
+fi
+
+# Check for where to find unordered_map etc.
+AC_LANG_PUSH([C++])
+AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1_UNORDERED],
+    [],["Have tr1"])],[])
+AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X_UNORDERED],
+    [],["Have C++0x"])],[])
+AC_TRY_COMPILE([
+    #include 
+  ],[
+    std::shared_ptr ptr;
+  ], rcl_shared_ptr_std="1", rcl_shared_ptr_std="0")
+AC_TRY_COMPILE([
+    #include 
+  ],[
+    std::tr1::shared_ptr ptr;
+  ], rcl_shared_ptr_tr1="1", rcl_shared_ptr_tr1="0")
+if test X$rcl_shared_ptr_std = X1; then 
+   AC_DEFINE(HAVE_SHARED_PTR_STD, [], [Has std::shared_ptr])
+elif test X$rcl_shared_ptr_tr1 = X1; then 
+   AC_DEFINE(HAVE_SHARED_PTR_TR1, [], [Has std::tr1::shared_ptr])
+fi
+AC_LANG_POP([C++])
+
+AC_CHECK_HEADERS([sys/mount.h sys/statfs.h sys/statvfs.h sys/vfs.h], [], [],
+[#ifdef HAVE_SYS_PARAM_H
+# include 
+#endif
+])
+
+# Use specific 'file' command ? (Useful on solaris to specify
+# /usr/local/bin/file instead of the system's which doesn't understand '-i'
+AC_ARG_WITH(file-command, 
+    AC_HELP_STRING([--with-file-command],
+   [Specify version of 'file' command (ie: --with-file-command=/usr/local/bin/file)]),
+        withFileCommand=$withval, withFileCommand=file)
+case $withFileCommand in
+  file)
+    AC_PATH_PROG(fileProg, file);;
+  *) 
+    fileProg=$withFileCommand;;
+esac
+
+if test ! -x "$fileProg"; then
+   AC_MSG_ERROR([$fileProg does not exist or is not executable])
+fi
+AC_DEFINE_UNQUOTED(FILE_PROG, "$fileProg", [Path to the file program])
+
+# Can't use Solaris standard 'file' command, it doesn't support -i
+if test X$sys != XSunOS -o X$fileProg != X/usr/bin/file; then
+   AC_DEFINE(USE_SYSTEM_FILE_COMMAND, 1, [Enable using the system's 'file' command to id mime if we fail internally])
+fi
+
+
+# Use aspell to provide spelling expansions ?
+# The default is yes. If we do find an aspell installation, we use it. Else
+# we do compile the aspell module using an internal copy of aspell.h
+# Only --with-aspell=no will completely disable aspell support
+AC_ARG_WITH(aspell, 
+    AC_HELP_STRING([--without-aspell],
+   [Disable use of aspell spelling package to provide term expansion to other spellings]),
+        withAspell=$withval, withAspell=yes)
+case $withAspell in
+     no);;
+     yes)
+     AC_PATH_PROG(aspellProg, aspell)
+     ;;
+     *) # The argument should be the path to the aspell program
+     aspellProg=$withAspell
+     ;;
+esac
+
+if test X$withAspell != Xno ; then
+   AC_DEFINE(RCL_USE_ASPELL, 1, [Compile the aspell interface])
+   if test X$aspellProg != X ; then
+      aspellBase=`dirname $aspellProg`
+      aspellBase=`dirname $aspellBase`
+      AC_DEFINE_UNQUOTED(ASPELL_PROG, "$aspellProg",
+	[Path to the aspell program])
+      if test -f $aspellBase/include/aspell.h ; then	
+          AC_DEFINE_UNQUOTED(ASPELL_INCLUDE, "$aspellBase/include/aspell.h",
+	    [Path to the aspell api include file])
+      else
+	AC_MSG_NOTICE([aspell support enabled but aspell package not found. Compiling with internal aspell interface file])
+	 AC_DEFINE(ASPELL_INCLUDE, ["aspell-local.h"])
+      fi
+   else
+     # aspell support enabled but no aspell install yet
+	AC_MSG_NOTICE([aspell support enabled but aspell package not found. Compiling with internal aspell interface file])
+	AC_DEFINE(ASPELL_INCLUDE, ["aspell-local.h"])
+   fi
+fi
+
+if test -f /usr/include/sys/inotify.h -o -f /usr/include/linux/inotify.h; then
+   inot_default=yes
+else
+   inot_default=no
+fi
+
+# Real time monitoring with inotify
+AC_ARG_WITH(inotify, 
+    AC_HELP_STRING([--with-inotify],
+   [Use inotify for almost real time indexing of modified files (the default
+    is yes on Linux).]),
+        withInotify=$withval, withInotify=$inot_default)
+
+if test X$withInotify != Xno ; then
+   AC_MSG_NOTICE([enabled support for inotify monitoring])
+   AC_DEFINE(RCL_MONITOR, 1, [Real time monitoring option])
+   AC_DEFINE(RCL_USE_INOTIFY, 1, [Compile the inotify interface])
+else
+   AC_MSG_NOTICE([inotify not found, inotify monitoring disabled])
+fi
+
+# Real time monitoring with FAM
+AC_ARG_WITH(fam, 
+    AC_HELP_STRING([--with-fam],
+   [Use File Alteration Monitor for almost real time indexing of modified files. Give the fam/gamin library as argument (ie: /usr/lib/libfam.so) if configure does not find the right one.]),
+        withFam=$withval, withFam=yes)
+
+if test X$withFam != Xno -a X$withInotify != Xno ; then
+   AC_MSG_NOTICE([FAM support enabled but inotify support also enabled. Disabling FAM support and using inotify])
+   withFam=no
+fi
+
+famLib=""
+case $withFam in
+     no);;
+     yes)
+	for dir in /usr/local/lib ${libdir};do 
+	 if test -f $dir/libfam.so ; then famLib=$dir/libfam.so;break;fi
+	done
+        if test X$famLib = X ; then
+	  AC_MSG_NOTICE([FAM library not found, disabling FAM and real time indexing support])
+	  withFam=no
+        fi
+     ;;
+     *) # The argument should be the path to the fam library
+     famLib=$withFam
+     ;;
+esac
+
+if test X$withFam != Xno ; then
+   AC_DEFINE(RCL_MONITOR, 1, [Real time monitoring option])
+   AC_DEFINE(RCL_USE_FAM, 1, [Compile the fam interface])
+   if test X$famLib != X ; then
+      famLibDir=`dirname $famLib`
+      famBase=`dirname $famLibDir`
+      famBLib=`basename $famLib .so | sed -e s/lib//`
+      if test ! -f $famBase/include/fam.h ; then
+	 AC_MSG_ERROR([fam.h not found in $famBase/include. Specify --with-fam=no to disable fam support])
+      fi
+      LIBFAM="-L$famLibDir -l$famBLib"
+      AC_MSG_NOTICE([fam library directive: $LIBFAM])
+      AC_DEFINE_UNQUOTED(FAM_INCLUDE, "$famBase/include/fam.h",
+	[Path to the fam api include file])
+   else
+	AC_MSG_ERROR([fam library not found])
+   fi
+fi
+
+# Enable use of threads in the indexing pipeline.  
+# This is disabled by default as we usually care little about indexing 
+# absolute performance (more about impact on usability and total 
+# resources used).
+AC_ARG_ENABLE(idxthreads,
+    AC_HELP_STRING([--disable-idxthreads],
+   [Disable multithread indexing.]),
+        idxthreadsEnabled=$enableval, idxthreadsEnabled=yes)
+AM_CONDITIONAL(NOTHREADS, [test X$idxthreadsEnabled = Xno])
+if test X$idxthreadsEnabled = Xyes ; then
+  AC_DEFINE(IDX_THREADS, 1, [Use multiple threads for indexing])
+fi
+
+# Enable CamelCase word splitting. This is optional because it causes 
+# problems with phrases: with camelcase enabled, "MySQL manual"
+# will be matched by "MySQL manual" and "my sql manual" but not 
+# "mysql manual" (which would need increased slack as manual is now at pos
+# 2 instead of 1
+AC_ARG_ENABLE(camelcase,
+    AC_HELP_STRING([--enable-camelcase],
+   [Enable splitting camelCase words. This is not enabled by default as
+   this makes phrase matches more difficult: you need to use matching
+   case in the phrase query to get a match. Ie querying for 
+   "MySQL manual" and "my sql manual" are the same, but not the same as
+   "mysql manual" (in phrases only and you could raise the phrase slack to
+   get a match).]),
+        camelcaseEnabled=$enableval, camelcaseEnabled=no)
+if test X$camelcaseEnabled = Xyes ; then
+  AC_DEFINE(RCL_SPLIT_CAMELCASE, 1, [Split camelCase words])
+fi
+
+# Disable building the python module.
+if test X$sys != XDarwin ; then
+  AC_ARG_ENABLE(python-module,
+    AC_HELP_STRING([--disable-python-module],
+    [Do not build the Python module.]),
+        pythonEnabled=$enableval, pythonEnabled=yes)
+else
+  pythonEnabled=no
+fi
+
+AM_CONDITIONAL(MAKEPYTHON, [test X$pythonEnabled = Xyes])
+
+
+AC_CHECK_FUNCS(mkdtemp)
+AC_CHECK_LIB([pthread], [pthread_create], [], [])
+AC_CHECK_LIB([dl], [dlopen], [], [])
+AC_CHECK_LIB([z], [zlibVersion], [], [])
+
+##### Look for iconv. This can exist in either libc (ie: Linux, solaris) or
+##### libiconv. We'd need a --with-libiconv= option
+AC_LANG(C++)
+LIBICONV=""
+S_LIBS=$LIBS
+S_CPPFLAGS=$CPPFLAGS
+for dir in ${libdir} /opt/local/lib /usr/local/lib;do
+  CPPFLAGS="$S_CPPFLAGS -I$dir/../include"
+
+  LIBS="$S_LIBS -L$dir"
+  AC_TRY_LINK([#include 
+#include ],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      LIBICONV="-L$dir";INCICONV=-I$dir/../include)
+  if test A"$LIBICONV" != A ; then
+     break
+  fi
+
+  LIBS="$S_LIBS -L$dir -liconv"
+  AC_TRY_LINK([#include 
+#include ],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      LIBICONV="-L$dir -liconv";INCICONV=-I$dir/../include)
+  if test A"$LIBICONV" != A ; then
+     break
+  fi
+
+done
+
+LIBS=$S_LIBS
+CPPFLAGS=$S_CPPFLAGS
+
+if test A"$LIBICONV" = A ; then
+   AC_MSG_ERROR([Cannot find iconv_open anywhere. Please install iconv])
+   exit 1
+fi
+#echo LIBICONV $LIBICONV
+#echo INCICONV $INCICONV
+
+CPPFLAGS="$CPPFLAGS $INCICONV"
+AC_MSG_CHECKING(for type of inbuf parameter to iconv)
+AC_TRY_COMPILE([
+    #include 
+    #include 
+  ],[
+    iconv(0,(const char **)0,(size_t *)0,(char **)0,(size_t *)0);
+  ], rcl_iconv_inbuf_const="1", rcl_iconv_inbuf_const="0")
+if test X$rcl_iconv_inbuf_const = X1 ; then
+  AC_DEFINE(RCL_ICONV_INBUF_CONST, 1, [iconv parameter 2 is const char**])
+fi
+
+
+############# Putenv
+AC_MSG_CHECKING(for type of string parameter to putenv)
+AC_TRY_COMPILE([
+    #include 
+  ],[
+    putenv((const char *)0);
+  ], rcl_putenv_string_const="1", rcl_putenv_string_const="0")
+if test X$rcl_putenv_string_const = X1 ; then
+  AC_DEFINE(PUTENV_ARG_CONST, 1, [putenv parameter is const])
+fi
+
+
+#### Look for Xapian. Done in a strange way to work around autoconf
+# cache
+XAPIAN_CONFIG=no
+if test "$XAPIAN_CONFIG" = "no"; then 
+    AC_PATH_PROG(XAPIAN_CONFIG0, [xapian-config], no)
+    XAPIAN_CONFIG=$XAPIAN_CONFIG0
+fi
+if test "$XAPIAN_CONFIG" = "no"; then 
+   AC_PATH_PROG(XAPIAN_CONFIG1, [xapian-config-1.3], no)
+   XAPIAN_CONFIG=$XAPIAN_CONFIG1
+fi
+if test "$XAPIAN_CONFIG" = "no"; then 
+   AC_PATH_PROG(XAPIAN_CONFIG2, [xapian-config-1.1], no)
+   XAPIAN_CONFIG=$XAPIAN_CONFIG2
+fi
+
+if test "$XAPIAN_CONFIG" = "no" ; then
+   AC_MSG_ERROR([Cannot find xapian-config command in $PATH. Is
+xapian-core installed ?])
+   exit 1
+fi
+LIBXAPIAN=`$XAPIAN_CONFIG --libs`
+# The --static thing fails with older Xapians. Happily enough they don't
+# need it either (because there are no needed libraries (no uuid and we
+# deal explicitely with libz)
+LIBXAPIANSTATICEXTRA=`$XAPIAN_CONFIG --static --libs 2> /dev/null`
+# Workaround for problem in xapian-config in some versions: wrongly lists
+# libstdc++.la in the lib list
+for i in $LIBXAPIAN ; do
+    case $i in
+    *stdc++*|-lm|-lgcc_s|-lc);;
+    *) tmpxaplib="$tmpxaplib $i";;
+    esac
+done
+LIBXAPIAN=$tmpxaplib
+LIBXAPIANDIR=`$XAPIAN_CONFIG --libs | awk '{print $1}'`
+case A"$LIBXAPIANDIR" in
+  A-L*) LIBXAPIANDIR=`echo $LIBXAPIANDIR | sed -e 's/-L//'`;;
+  *) LIBXAPIANDIR="";;
+esac
+XAPIANCXXFLAGS=`$XAPIAN_CONFIG --cxxflags`
+
+#echo XAPIAN_CONFIG: $XAPIAN_CONFIG 
+#echo LIBXAPIAN: $LIBXAPIAN
+#echo LIBXAPIANDIR: $LIBXAPIANDIR
+#echo LIBXAPIANSTATICEXTRA: $LIBXAPIANSTATICEXTRA
+#echo XAPIANCXXFLAGS: $XAPIANCXXFLAGS
+
+AC_ARG_ENABLE(xadump, 
+    AC_HELP_STRING([--enable-xadump],
+   [Enable building the xadump low level Xapian access program.]),
+        enableXADUMP=$enableval, enableXADUMP="no")
+AM_CONDITIONAL(MAKEXADUMP, [test X$enableXADUMP = Xyes])
+
+AC_ARG_ENABLE(userdoc,
+    AC_HELP_STRING([--disable-userdoc],
+       [Disable building the user manual. (Avoids the need for docbook xml/xsl files and TeX tools.]),
+        enableUserdoc=$enableval, enableUserdoc="yes")
+AM_CONDITIONAL(MAKEUSERDOC, [test X$enableUserdoc = Xyes])
+
+
+
+#### QT
+# The way qt and its tools (qmake especially) are installed is very
+# different between systems (and maybe qt versions)
+#
+# In general we need QTDIR to be set, because it is used inside the
+# qmake-generated makefiles. But there are exceptions: ie on debian3.1 (at
+# least on the sourceforge compile farm), QTDIR is not needed because qmake
+# generates hard paths (and is installed in /usr/bin). We don't want to
+# force the user to set QTDIR if it is not needed.
+#
+# The logic is then to first look for qmake, possibly using QTDIR if it is
+# set.
+# 
+# If QTDIR is not set, we then generate a bogus qt project and check if
+# QTDIR is needed in the Makefile, in which case we complain.
+#
+# QMAKESPEC: on most Linux system, there is a 'default' link inside the
+# mkspecs directory, so that QMAKESPEC is not needed.
+# If QMAKESPEC is not set and needed, the qmake test at the previous test
+# will have failed, and we tell the user to check his environment.
+#
+AC_ARG_ENABLE(qtgui, 
+    AC_HELP_STRING([--disable-qtgui],
+   [Disable the QT-based graphical user interface.]),
+        enableQT=$enableval, enableQT="yes")
+AM_CONDITIONAL(MAKEQT, [test X$enableQT = Xyes])
+
+AC_ARG_ENABLE(recollq, 
+    AC_HELP_STRING([--enable-recollq],
+   [Enable building the recollq command line query tool (recoll -t without
+   need for Qt). This is done by default if --disable-qtgui is set but this
+   option enables forcing it.]),
+        enableRECOLLQ=$enableval, enableRECOLLQ="no")
+
+if test X"$enableRECOLLQ" != X ; then
+    AM_CONDITIONAL(MAKECMDLINE, [test X$enableRECOLLQ = Xyes])
+else
+    AM_CONDITIONAL(MAKECMDLINE, [test X$enableQT = Xno])
+fi
+
+if test X$enableQT = Xyes ; then
+
+  if test X$QTDIR != X ; then
+     PATH=$PATH:$QTDIR/bin
+     export PATH
+  fi
+  
+  if test X$QMAKE = X ; then
+     QMAKE=qmake
+  fi
+  case $QMAKE in
+    */*) QMAKEPATH=$QMAKE;;
+    *) AC_PATH_PROG([QMAKEPATH], $QMAKE, NOTFOUND);;
+  esac
+
+  if test X$QMAKEPATH = XNOTFOUND ; then 
+     AC_MSG_ERROR([Cannot find the qmake program. Maybe you need to install
+  qt development files and tools and/or set the QTDIR environment variable?])
+  fi
+  QMAKE=$QMAKEPATH
+  
+  # MAC OS X: we don't support this (the native search tool is more than
+  # good enough), but we make things work just enough so that the program can
+  # be compiled and roughly installed (not as a .app, but to /usr/local),
+  # basically to enable using a Macbook for development
+  if test X$sys = XDarwin ; then
+     # The default is xcode
+     QMAKE="${QMAKE} -spec macx-g++"
+  fi
+  
+  # Check Qt version
+  qmakevers="`${QMAKE} --version 2>&1`"
+  #echo "qmake version: $qmakevers"
+  v4=`expr "$qmakevers" : '.*Qt[ ][ ]*version[ ][ ]*4.*'`
+  v5=`expr "$qmakevers" : '.*Qt[ ][ ]*version[ ][ ]*5.*'`
+  if test X$v4 = X0 -a X$v5 = X0; then 
+     AC_MSG_ERROR([qmake seems to be using Qt version 3 which is not supported any more])
+  else
+    if test X$v4 != X0 ; then
+       AC_MSG_NOTICE([using qt version 4 user interface])
+    else
+       AC_MSG_NOTICE([using qt version 5 user interface])
+    fi
+    QTGUI=qtgui
+  fi
+  
+  cd $QTGUI
+  # We just want a .pro file: no problem with unsubstituted variables at 
+  # this point.
+  test -f recoll.pro && chmod +w recoll.pro
+  cp recoll.pro.in recoll.pro
+  #echo QMAKE ${QMAKE}
+  ${QMAKE} PREFIX=${prefix} recoll.pro
+  if test $? != 0 ; then
+     AC_MSG_ERROR([Cannot use qmake to generate a Makefile. Maybe you need to
+  check the QTDIR and QMAKESPEC environment variables?])
+  fi
+  # is QTDIR set and do we actually need it ?
+  if test X$QTDIR = X ; then
+     QTDIRNEEDED=`grep INCPATH Makefile | grep = | grep QTDIR`
+     if test "X$QTDIRNEEDED" != "X" ; then
+         AC_MSG_ERROR([You need to set the QTDIR variable to point to the QT
+  installation. If there is no default mkspecs, you should also set QMAKESPEC])
+     fi
+  fi
+  rm -f Makefile recoll.pro
+  cd ..
+
+
+ ##### Using Qt webkit for reslist display? Else Qt textbrowser
+  AC_ARG_ENABLE(webkit,
+    AC_HELP_STRING([--disable-webkit],
+      [Disable use of qt-webkit (only meaningful if qtgui is enabled).]),
+        enableWebkit=$enableval, enableWebkit="yes")
+
+  if test "$enableWebkit" = "yes" ; then
+   QMAKE_ENABLE_WEBKIT=""
+   QMAKE_DISABLE_WEBKIT="#"
+  else
+   QMAKE_ENABLE_WEBKIT="#"
+   QMAKE_DISABLE_WEBKIT=""
+  fi
+
+ ##### Using QZeitGeist lib ? Default no for now
+  AC_ARG_WITH(qzeitgeist,
+    AC_HELP_STRING([--with-qzeitgeist],
+      [Enable the use of the qzeitgeist library to send zeitgeist events.]),
+        withQZeitgeist=$withval, withQZeitgeist="no")
+
+  case "$withQZeitgeist" in 
+    no)  LIBQZEITGEIST=;;
+    yes) LIBQZEITGEIST=-lqzeitgeist;;
+    *)   LIBQZEITGEIST=$withQZeitgeist;;
+  esac	
+
+  if test "$withQZeitgeist" != "no" ; then
+   QMAKE_ENABLE_ZEITGEIST=""
+   QMAKE_DISABLE_ZEITGEIST="#"
+  else
+   QMAKE_ENABLE_ZEITGEIST="#"
+   QMAKE_DISABLE_ZEITGEIST=""
+  fi
+
+  AC_CONFIG_FILES($QTGUI/recoll.pro)
+
+  ##################### End QT stuff
+fi
+
+
+### X11: this is needed for the session monitoring code (in recollindex -m)
+AC_ARG_ENABLE(x11mon, 
+    AC_HELP_STRING([--disable-x11mon],
+   [Disable recollindex support for X11 session monitoring.]),
+        enableX11mon=$enableval, enableX11mon="yes")
+
+if test X$withInotify = Xno -a X$withFam = Xno ; then
+  enableX11mon=no
+fi
+
+if test "$enableX11mon" = "yes" ; then
+  AC_PATH_XTRA
+  X_LIBX11=-lX11
+else
+  AC_DEFINE(DISABLE_X11MON, 1, [No X11 session monitoring support])
+  X_LIBX11=""
+fi
+#echo X_CFLAGS "'$X_CFLAGS'" X_PRE_LIBS "'$X_PRE_LIBS'" X_LIBS \
+#      "'$X_LIBS'" X_LIBX11 "'$X_LIBX11'" X_EXTRA_LIBS "'$X_EXTRA_LIBS'"
+
+# For communicating the value of RECOLL_DATADIR to non-make-based
+# subpackages like python-recoll, we have to expand prefix in here, because
+# things like "datadir = ${prefix}/share" (which is what we'd get by
+# expanding @datadir@) don't mean a thing in Python... I guess we could
+# have a piece of shell-script text to be substituted into and executed by
+# setup.py for getting the value of pkgdatadir, but really...
+m_prefix=$prefix
+test "X$m_prefix" = "XNONE" && m_prefix=/usr/local
+m_datadir=${m_prefix}/share
+RECOLL_DATADIR=${m_datadir}/recoll
+
+RCLVERSION=$PACKAGE_VERSION
+RCLLIBVERSION=$RCLVERSION
+
+AC_SUBST(RECOLL_DATADIR)
+AC_SUBST(X_CFLAGS)
+AC_SUBST(X_PRE_LIBS)
+AC_SUBST(X_LIBS)
+AC_SUBST(X_LIBX11)
+AC_SUBST(X_EXTRA_LIBS)
+AC_SUBST(INCICONV)
+AC_SUBST(LIBICONV)
+AC_SUBST(LIBXAPIAN)
+AC_SUBST(LIBXAPIANDIR)
+AC_SUBST(LIBXAPIANSTATICEXTRA)
+AC_SUBST(LIBFAM)
+AC_SUBST(QMAKE)
+AC_SUBST(QTGUI)
+AC_SUBST(XAPIANCXXFLAGS)
+AC_SUBST(QMAKE_ENABLE_WEBKIT)
+AC_SUBST(QMAKE_DISABLE_WEBKIT)
+AC_SUBST(QMAKE_ENABLE_ZEITGEIST)
+AC_SUBST(QMAKE_DISABLE_ZEITGEIST)
+AC_SUBST(LIBQZEITGEIST)
+AC_SUBST(RCLVERSION)
+AC_SUBST(RCLLIBVERSION)
+
+# All object files depend on localdefs which has the cc flags. Avoid
+# changing it unless necessary
+AC_CONFIG_FILES(Makefile)
+AC_CONFIG_FILES(common/rclversion.h)
+AC_CONFIG_FILES(python/recoll/setup.py)
+
+AC_OUTPUT
diff --git a/src/desktop/hotrecoll.py b/src/desktop/hotrecoll.py
new file mode 100755
index 00000000..28cb7c35
--- /dev/null
+++ b/src/desktop/hotrecoll.py
@@ -0,0 +1,66 @@
+#!/usr/bin/python
+#
+# This script should be linked to a keyboard shortcut. Under gnome,
+# you can do this from the main preferences menu, or directly execute
+# "gnome-keybinding-properties"
+#
+# Make the script executable. Install it somewhere in the executable
+# path ("echo $PATH" to check what's in there), and then just enter
+# its name as the action to perform, or copy it anywhere and copy the
+# full path as the action.
+
+import gtk
+import wnck
+import os
+import sys
+from optparse import OptionParser
+
+def main():
+    parser = OptionParser()
+    parser.add_option("-m", "--move-away", action="store_true", default=False,
+                      dest="clear_workspace", 
+                      help="iconify to other workspace to avoid crowding panel")
+    (options, args) = parser.parse_args()
+
+    screen = wnck.screen_get_default()
+    while gtk.events_pending():
+        gtk.main_iteration()
+
+    recollMain = ""
+    recollwins = [];
+    for window in screen.get_windows():
+        if window.get_class_group().get_name() == "Recoll":
+            if window.get_name() == "Recoll":
+                recollMain = window
+            recollwins.append(window)
+
+    if not recollMain:
+        os.system("recoll&")
+        sys.exit(0)
+
+    # Check the main window state, and either activate or minimize all
+    # recoll windows.
+    workspace = screen.get_active_workspace()
+    if not recollMain.is_visible_on_workspace(workspace):
+        for win in recollwins:
+            win.move_to_workspace(workspace)
+            if win != recollMain:
+                win.unminimize(gtk.get_current_event_time())
+        recollMain.activate(gtk.get_current_event_time())
+    else:
+        otherworkspace = None
+        if options.clear_workspace:
+            # We try to minimize to another workspace
+            wkspcs = screen.get_workspaces()
+            for wkspc in wkspcs:
+                if wkspc.get_number() != workspace.get_number():
+                    otherworkspace = wkspc
+                    break
+        for win in recollwins:
+            if otherworkspace:
+                win.move_to_workspace(otherworkspace)
+            win.minimize()
+
+if __name__ == '__main__':
+  main()
+  
diff --git a/src/desktop/recoll-searchgui.desktop b/src/desktop/recoll-searchgui.desktop
new file mode 100644
index 00000000..28b90ece
--- /dev/null
+++ b/src/desktop/recoll-searchgui.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Categories=Utility;Filesystem;Database;
+Comment=Find documents by specifying search terms
+Exec=recoll
+GenericName=Local Text Search
+Icon=recoll
+Name=Recoll
+Terminal=false
+Type=Application
+Keywords=Search;Full Text;
diff --git a/src/desktop/recoll.appdata.xml b/src/desktop/recoll.appdata.xml
new file mode 100644
index 00000000..3a9a1ff0
--- /dev/null
+++ b/src/desktop/recoll.appdata.xml
@@ -0,0 +1,24 @@
+
+
+
+ recoll.desktop
+ CC0-1.0
+ GPL-2.0+
+ Recoll
+ Find documents by specifying search terms
+ 
+ 

Recoll finds keywords inside documents text as well as file names.

+
    +
  • It can search most document formats.
  • +
  • It can reach any storage place: files, archive members, email + attachments, transparently handling decompression.
  • +
  • One click will open the document inside a native editor or + display an even quicker text preview.
  • +
+
+ + http://www.recoll.org/files/recoll-mainwin-h-1248x702.png + + http://www.recoll.org/ + contact@recoll.org +
diff --git a/src/desktop/recoll.png b/src/desktop/recoll.png new file mode 100644 index 0000000000000000000000000000000000000000..42e7848309f8d4f9c23ad2aff78b47b8bcf27835 GIT binary patch literal 457 zcmV;)0XF`LP)6jNii`DGC+xg7zdey{{J6rAvD;cjBzx|hFS>G2C(2MzPP^rdM(C_ zC(7{X{mRY8fLkvfjf^jva2A@c#dr@os^OB=y82w}$}?QD2OZV$cqU}!*^!X#M+?T$ zf^js;hGvv8?py1FOYYNu(W}4hp-r*>3}_4)rfagy*Qj50T+_kXF8=vk_Tx5doLY?- zKkI*>Yn%H2Xf7k*AjZL#%LZMP4Z08-bZKZb$`}|J7#J_laKI(^j!W>2oDnWroaS<}W#odCRH!lU<^wj`c5wJ7dEmC=6LXjghP%0{DX zpaCQK!@}B + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/desktop/recoll.xcf b/src/desktop/recoll.xcf new file mode 100644 index 0000000000000000000000000000000000000000..3c93d9e717942ade3e046bae565de18c4b7bcbd0 GIT binary patch literal 3825 zcmd5<&2AGh5O%^}s97iiy7JAJmC{2{tG+;04v0e~BzS@C*4|hoyVdR%(p%{h^pICovkmTdB$|`(k)VcMlP;sS>Hksifz=jBc< zbI7jk+Q!tQIa8Z{`F}!FC*?_;m@JjMjV&n8<|(aiaGIG4&L=}fUQcqZOI7`GkY@j@ z`mMP=mCnOT=WD~zo?DQLAH>Orw8&4h`uMt}gU}7pP5lIVmeXZCv>XlFXmQ@+k6Juv z@h9N4RwEBU$OcLC%V_LF)irg`Uw7|7_nEQB*SGcEE5`19!P4KboA1;ors5{@01g{s z8hHSR4e=3sS{U$cCN3fm;IJWPkq2sqEp(79Aupxe6PYZ+Vz(X`p z#D&wqLo`stg*UEyf^Qz8fg&!P1sKd_dE^X&s&pCgkb!_<>vCcW)^%b~$jacWL@A?W{ TzDBHb&UbwUh8lk*_AS^i(2}&` literal 0 HcmV?d00001 diff --git a/src/desktop/recoll_index_on_ac.sh b/src/desktop/recoll_index_on_ac.sh new file mode 100755 index 00000000..751fefce --- /dev/null +++ b/src/desktop/recoll_index_on_ac.sh @@ -0,0 +1,69 @@ +#!/bin/sh + +# This is a shell script that starts and stops the recollindex daemon +# depending on whether or not the power supply is plugged in. It should be +# called from the file ~/.config/autostart/recollindex.desktop. +# +# That is: make the script executable (chmod +x) and replace in +# recollindex.desk the line: +# Exec=recollindex -w 60 -m +# With +# Exec=/path/to/recoll_index_on_ac.sh +# +# +# By: The Doctor (drwho at virtadpt dot net) +# License: GPLv3 +# +# Modifications by J.F Dockes +# - replaced "acpi" usage with "on_ac_power" which seems to be both +# more common and more universal. +# - Changed the default to be that we run recollindex if we can't determine +# power status (ie: on_ac_power not installed or not working: we're most +# probably not running on a laptop). + +INDEXER="recollindex -w 60 -m" +ACPI=`which on_ac_power` + +# If the on_ac_power script isn't installed, warn, but run anyway. Maybe +# this is not a laptop or not linux. +if test "x$ACPI" = "x" ; then + echo "on_ac_power utility not found. Starting recollindex anyway." +fi + +while true; do + # Determine whether or not the power supply is plugged in. + if test "x$ACPI" != "x" ; then + on_ac_power + STATUS=$? + else + STATUS=0 + fi + + # Get the PID of the indexing daemon. + if test -f ~/.recoll/index.pid ; then + PID=`cat ~/.recoll/index.pid` + # Make sure that this is recollindex running. pid could have + # been reallocated + ps ax | egrep "^[ \t]*$PID " | grep -q recollindex || PID="" + fi +# echo "Recollindex pid is $PID" + + if test $STATUS -eq 1 ; then + # The power supply is not plugged in. See if the indexing daemon is + # running, and if it is, kill it. The indexing daemon will not be + # started. + if test x"$PID" != x; then + kill $PID + fi + else + # The power supply is plugged in or we just don't know. + # See if the indexing daemon is running, and if it's not start it. + if test -z "$PID" ; then + $INDEXER + fi + fi + + # Go to sleep for a while. + sleep 120 + continue +done diff --git a/src/desktop/recollindex.desktop b/src/desktop/recollindex.desktop new file mode 100644 index 00000000..ef75ea26 --- /dev/null +++ b/src/desktop/recollindex.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Name=Recoll real time indexer +Comment=Runs in background to extract and index text from modified documents +Icon=system-run +Exec=recollindex -w 60 -m +Terminal=false +TerminalOptions= +Type=Application +Categories=Utility;Filesystem;Database; +NoDisplay=true +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel +X-KDE-UniqueApplet=true diff --git a/src/desktop/xdg-utils-1.0.1/LICENSE b/src/desktop/xdg-utils-1.0.1/LICENSE new file mode 100644 index 00000000..1edf08c3 --- /dev/null +++ b/src/desktop/xdg-utils-1.0.1/LICENSE @@ -0,0 +1,18 @@ +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/desktop/xdg-utils-1.0.1/scripts/xdg-desktop-menu b/src/desktop/xdg-utils-1.0.1/scripts/xdg-desktop-menu new file mode 100755 index 00000000..a252ba01 --- /dev/null +++ b/src/desktop/xdg-utils-1.0.1/scripts/xdg-desktop-menu @@ -0,0 +1,1261 @@ +#!/bin/sh +#--------------------------------------------- +# xdg-desktop-menu +# +# Utility script to install menu items on a Linux desktop. +# Refer to the usage() function below for usage. +# +# Copyright 2006, Kevin Krammer +# Copyright 2006, Jeremy White +# +# LICENSE: +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +#--------------------------------------------- + +manualpage() +{ +cat << _MANUALPAGE +Name + +xdg-desktop-menu - command line tool for (un)installing desktop menu items + +Synopsis + +xdg-desktop-menu install [--noupdate] [--novendor] [--mode mode] directory-file +(s) desktop-file(s) + +xdg-desktop-menu uninstall [--noupdate] [--mode mode] directory-file(s) +desktop-file(s) + +xdg-desktop-menu forceupdate [--mode mode] + +xdg-desktop-menu { --help | --manual | --version } + +Description + +The xdg-desktop-menu program can be used to install new menu entries to the +desktop's application menu. + +The application menu works according to the XDG Desktop Menu Specification at +http://www.freedesktop.org/Standards/menu-spec + +Commands + +install + + Install one or more applications in a submenu of the desktop menu system. + + desktop-file: A desktop file represents a single menu entry in the menu. + Desktop files are defined by the freedesktop.org Desktop Entry + Specification. The most important aspects of *.desktop files are summarized + below. + + Menu entries can be added to the menu system in two different ways. They + can either be added to a predefined submenu in the menu system based on one + or more category keywords, or they can be added to a new submenu. + + To add a menu entry to a predefined submenu the desktop file that + represents the menu entry must have a Categories= entry that lists one or + more keywords. The menu item will be included in an appropriate submenu + based on the included keywords. + + To add menu items to a new submenu the desktop-files must be preceded by a + directory-file that describes the submenu. If multiple desktop-files are + specified, all entries will be added to the same menu. If entries are + installed to a menu that has been created with a previous call to + xdg-desktop-menu the entries will be installed in addition to any already + existing entries. + + directory-file: The *.directory file indicated by directory-file represents + a submenu. The directory file provides the name and icon for a submenu. The + name of the directory file is used to identify the submenu. + + If multiple directory files are provided each file will represent a submenu + within the menu that preceeds it, creating a nested menu hierarchy + (sub-sub-menus). The menu entries themselves will be added to the last + submenu. + + Directory files follow the syntax defined by the freedesktop.org Desktop + Entry Specification. + +uninstall + + Remove applications or submenus from the desktop menu system previously + installed with xdg-desktop-menu install. + + A submenu and the associated directory file is only removed when the + submenu no longer contains any menu entries. + +forceupdate + + Force an update of the menu system. + + This command is only useful if the last call to xdg-desktop-menu included + the --noupdate option. + +Options + +--noupdate + Postpone updating the menu system. If multiple updates to the menu system + are made in sequence this flag can be used to indicate that additional + changes will follow and that it is not necassery to update the menu system + right away. +--novendor + + Normally, xdg-desktop-menu checks to ensure that any *.directory and + *.desktop files to be installed has a vendor prefix. This option can be + used to disable that check. + + A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated + with a dash ("-"). Companies and organizations are encouraged to use a word + or phrase, preferably the organizations name, for which they hold a + trademark as their vendor prefix. The purpose of the vendor prefix is to + prevent name conflicts. + +--mode mode + + mode can be user or system. In user mode the file is (un)installed for the + current user only. In system mode the file is (un)installed for all users + on the system. Usually only root is allowed to install in system mode. + + The default is to use system mode when called by root and to use user mode + when called by a non-root user. + +--help + Show command synopsis. +--manual + Show this manualpage. +--version + Show the xdg-utils version information. + +Desktop Files + +An application item in the application menu is represented by a *.desktop file. +A *.desktop file consists of a [Desktop Entry] header followed by several Key= +Value lines. + +A *.desktop file can provide a name and description for an application in +several different languages. This is done by adding a language code as used by +LC_MESSAGES in square brackets behind the Key. This way one can specify +different values for the same Key depending on the currently selected language. + +The following keys are often used: + +Value=1.0 + This is a mandatory field to indicate that the *.desktop file follows the + 1.0 version of the specification. +Type=Application + This is a mandatory field that indicates that the *.desktop file describes + an application launcher. +Name=Application Name + The name of the application. For example Mozilla +GenericName=Generic Name + A generic description of the application. For example Web Browser +Comment=Comment + Optional field to specify a tooltip for the application. For example Visit + websites on the Internet +Icon=Icon File + The icon to use for the application. This can either be an absolute path to + an image file or an icon-name. If an icon-name is provided an image lookup + by name is done in the user's current icon theme. The xdg-icon-resource + command can be used to install image files into icon themes. The advantage + of using an icon-name instead of an absolute path is that with an icon-name + the application icon can be provided in several different sizes as well as + in several differently themed styles. +Exec=Command Line + The command line to start the application. If the application can open + files the %f placeholder should be specified. When a file is dropped on the + application launcher the %f is replaced with the file path of the dropped + file. If multiple files can be specified on the command line the %F + placeholder should be used instead of %f. If the application is able to + open URLs in addition to local files then %u or %U can be used instead of + %f or %F. +Categories=Categories + + A list of categories separated by semi-colons. A category is a keyword that + describes and classifies the application. By default applications are + organized in the application menu based on category. When menu entries are + explicitly assigned to a new submenu it is not necassery to list any + categories. + + When using categories it is recommended to include one of the following + categories: AudioVideo, Development, Education, Game, Graphics, Network, + Office, Settings, System, Utility. + + See Appendix A of the XDG Desktop Menu Specification for information about + additional categories. http://standards.freedesktop.org/menu-spec/ + menu-spec-1.0.html + +MimeType=Mimetypes + A list of mimetypes separated by semi-colons. This field is used to + indicate which file types the application is able to open. + +For a complete oveview of the *.desktop file format please visit http:// +www.freedesktop.org/wiki/Standards/desktop-entry-spec + +Directory Files + +The appearance of submenu in the application menu is provided by a *.directory +file. In particular it provides the title of the submenu and a possible icon. A +*.directory file consists of a [Desktop Entry] header followed by several Key= +Value lines. + +A *.directory file can provide a title (name) for the submenu in several +different languages. This is done by adding a language code as used by +LC_MESSAGES in square brackets behind the Key. This way one can specify +different values for the same Key depending on the currently selected language. + +The following keys are relevqnt for submenus: + +Value=1.0 + This is a mandatory field to indicate that the *.directory file follows the + 1.0 version of the Desktop Entry specification. +Type=Directory + This is a mandatory field that indicates that the *.directory file + describes a submenu. +Name=Menu Name + The title of submenu. For example Mozilla +Comment=Comment + Optional field to specify a tooltip for the submenu. +Icon=Icon File + The icon to use for the submenu. This can either be an absolute path to an + image file or an icon-name. If an icon-name is provided an image lookup by + name is done in the user's current icon theme. The xdg-icon-resource + command can be used to install image files into icon themes. The advantage + of using an icon-name instead of an absolute path is that with an icon-name + the submenu icon can be provided in several different sizes as well as in + several differently themed styles. + +Environment Variables + +xdg-desktop-menu honours the following environment variables: + +XDG_UTILS_DEBUG_LEVEL + Setting this environment variable to a non-zero numerical value makes + xdg-desktop-menu do more verbose reporting on stderr. Setting a higher + value increases the verbosity. +XDG_UTILS_INSTALL_MODE + This environment variable can be used by the user or administrator to + override the installation mode. Valid values are user and system. + +Exit Codes + +An exit code of 0 indicates success while a non-zero exit code indicates +failure. The following failure codes can be returned: + +1 + Error in command line syntax. +2 + One of the files passed on the command line did not exist. +3 + A required tool could not be found. +4 + The action failed. +5 + No permission to read one of the files passed on the command line. + +See Also + +xdg-desktop-icon(1), xdg-icon-resource(1), xdg-mime(1) + +Examples + +The company ShinyThings Inc. has developed an application named "WebMirror" and +would like to add it to the application menu. The company will use +"shinythings" as its vendor id. In order to add the application to the menu +there needs to be a .desktop file with a suitable Categories entry: + +shinythings-webmirror.desktop: + + [Desktop Entry] + Encoding=UTF-8 + Type=Application + + Exec=webmirror + Icon=webmirror + + Name=WebMirror + Name[nl]=WebSpiegel + + Categories=Network;WebDevelopment; + +Now the xdg-desktop-menu tool can be used to add the +shinythings-webmirror.desktop file to the desktop application menu: + +xdg-desktop-menu install ./shinythings-webmirror.desktop + +Note that for the purpose of this example the menu items are available in two +languages, English and Dutch. The language code for Dutch is nl. + +In the next example the company ShinyThings Inc. will add its own submenu to +the desktop application menu consisting of a "WebMirror" menu item and a +"WebMirror Admin Tool" menu item. + +First the company needs to create two .desktop files that describe the two menu +items. Since the items are to be added to a new submenu it is not necassery to +include a Categories= line: + +shinythings-webmirror.desktop: + + [Desktop Entry] + Encoding=UTF-8 + Type=Application + + Exec=webmirror + Icon=shinythings-webmirror + + Name=WebMirror + Name[nl]=WebSpiegel + + +shinythings-webmirror-admin.desktop: + + [Desktop Entry] + Encoding=UTF-8 + Type=Application + + Exec=webmirror-admintool + Icon=shinythings-webmirror-admintool + + Name=WebMirror Admin Tool + Name[nl]=WebSpiegel Administratie Tool + +In addition a .directory file needs to be created to provide a title and icon +for the sub-menu itself: + +shinythings-webmirror.directory: + + [Desktop Entry] + Encoding=UTF-8 + + Icon=shinythings-webmirror-menu + + Name=WebMirror + Name[nl]=WebSpiegel + +These file can now be installed with: + +xdg-desktop-menu install ./shinythings-webmirror.directory \ + ./shinythings-webmirror.desktop ./shinythings-webmirror-admin.desktop + +The menu entries could also be installed one by one: + +xdg-desktop-menu install --noupdate ./shinythings-webmirror.directory \ + ./shinythings-webmirror.desktop +xdg-desktop-menu install --noupdate ./shinythings-webmirror.directory \ + ./shinythings-webmirror-admin.desktop +xdg-desktop-menu forceupdate + +Although the result is the same it is slightly more efficient to install all +files at the same time. + +The *.desktop and *.directory files reference icons with the names webmirror, +webmirror-admin and webmirror-menu which should also be installed. In this +example the icons are installed in two different sizes, once with a size of +22x22 pixels and once with a size of 64x64 pixels: + +xdg-icon-resource install --size 22 ./wmicon-22.png shinythings-webmirror +xdg-icon-resource install --size 22 ./wmicon-menu-22.png shinythings-webmirror-menu +xdg-icon-resource install --size 22 ./wmicon-admin-22.png shinythings-webmirror-admin +xdg-icon-resource install --size 64 ./wmicon-64.png shinythings-webmirror +xdg-icon-resource install --size 64 ./wmicon-menu-64.png shinythings-webmirror-menu +xdg-icon-resource install --size 64 ./wmicon-admin-64.png shinythings-webmirror-admin + +_MANUALPAGE +} + +usage() +{ +cat << _USAGE +xdg-desktop-menu - command line tool for (un)installing desktop menu items + +Synopsis + +xdg-desktop-menu install [--noupdate] [--novendor] [--mode mode] directory-file +(s) desktop-file(s) + +xdg-desktop-menu uninstall [--noupdate] [--mode mode] directory-file(s) +desktop-file(s) + +xdg-desktop-menu forceupdate [--mode mode] + +xdg-desktop-menu { --help | --manual | --version } + +_USAGE +} + +#@xdg-utils-common@ + +#---------------------------------------------------------------------------- +# Common utility functions included in all XDG wrapper scripts +#---------------------------------------------------------------------------- + +DEBUG() +{ + [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; + [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; + shift + echo "$@" >&2 +} + +#------------------------------------------------------------- +# Exit script on successfully completing the desired operation + +exit_success() +{ + if [ $# -gt 0 ]; then + echo "$@" + echo + fi + + exit 0 +} + + +#----------------------------------------- +# Exit script on malformed arguments, not enough arguments +# or missing required option. +# prints usage information + +exit_failure_syntax() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + echo "Try 'xdg-desktop-menu --help' for more information." >&2 + else + usage + echo "Use 'man xdg-desktop-menu' or 'xdg-desktop-menu --manual' for additional info." + fi + + exit 1 +} + +#------------------------------------------------------------- +# Exit script on missing file specified on command line + +exit_failure_file_missing() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + fi + + exit 2 +} + +#------------------------------------------------------------- +# Exit script on failure to locate necessary tool applications + +exit_failure_operation_impossible() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + fi + + exit 3 +} + +#------------------------------------------------------------- +# Exit script on failure returned by a tool application + +exit_failure_operation_failed() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + fi + + exit 4 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_read() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + fi + + exit 5 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_write() +{ + if [ $# -gt 0 ]; then + echo "xdg-desktop-menu: $@" >&2 + fi + + exit 6 +} + +check_input_file() +{ + if [ ! -e "$1" ]; then + exit_failure_file_missing "file '$1' does not exist" + fi + if [ ! -r "$1" ]; then + exit_failure_file_permission_read "no permission to read file '$1'" + fi +} + +check_vendor_prefix() +{ + file_label="$2" + [ -n "$file_label" ] || file_label="filename" + file=`basename "$1"` + case "$file" in + [a-zA-Z]*-*) + return + ;; + esac + + echo "xdg-desktop-menu: $file_label '$file' does not have a proper vendor prefix" >&2 + echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2 + echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2 + echo "Use --novendor to override or 'xdg-desktop-menu --manual' for additional info." >&2 + exit 1 +} + +check_output_file() +{ + # if the file exists, check if it is writeable + # if it does not exists, check if we are allowed to write on the directory + if [ -e "$1" ]; then + if [ ! -w "$1" ]; then + exit_failure_file_permission_write "no permission to write to file '$1'" + fi + else + DIR=`dirname "$1"` + if [ ! -w "$DIR" -o ! -x "$DIR" ]; then + exit_failure_file_permission_write "no permission to create file '$1'" + fi + fi +} + +#---------------------------------------- +# Checks for shared commands, e.g. --help + +check_common_commands() +{ + while [ $# -gt 0 ] ; do + parm="$1" + shift + + case "$parm" in + --help) + usage + echo "Use 'man xdg-desktop-menu' or 'xdg-desktop-menu --manual' for additional info." + exit_success + ;; + + --manual) + manualpage + exit_success + ;; + + --version) + echo "xdg-desktop-menu 1.0.1" + exit_success + ;; + esac + done +} + +check_common_commands "$@" + +[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL; +if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then + # Be silent + xdg_redirect_output=" > /dev/null 2> /dev/null" +else + # All output to stderr + xdg_redirect_output=" >&2" +fi + +#-------------------------------------- +# Checks for known desktop environments +# set variable DE to the desktop environments name, lowercase + +detectDE() +{ + if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde; + elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome; + elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce; + fi +} + +#---------------------------------------------------------------------------- +# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4 +# It also always returns 1 in KDE 3.4 and earlier +# Simply return 0 in such case + +kfmclient_fix_exit_code() +{ + version=`kde-config --version 2>/dev/null | grep KDE` + major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'` + minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'` + release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` + test "$major" -gt 3 && return $1 + test "$minor" -gt 5 && return $1 + test "$release" -gt 4 && return $1 + return 0 +} + +update_desktop_database() +{ +# echo Update desktop database: $mode + if [ "$mode" = "system" ] ; then + for x in `echo $PATH | sed 's/:/ /g'` /opt/gnome/bin; do + if [ -x $x/update-desktop-database ] ; then + DEBUG 1 "Running $x/update-desktop-database" + eval '$x/update-desktop-database'$xdg_redirect_output + return + fi + done + fi +} + +fixup_mandriva_categories() +{ + DEBUG 1 "fixup_mandriva_categories $1" + awk ' +BEGIN { + xlat["AudioVideo"]="X-Mandrakelinux-Multimedia;X-MandrivaLinux-Multimedia" + xlat["Development"]="X-Mandrakelinux-MoreApplications-Development;X-MandrivaLinux-MoreApplications-Development" + xlat["Education"]="X-Mandrakelinux-MoreApplications;X-MandrivaLinux-MoreApplications-Education" + xlat["Game"]="X-Mandrakelinux-MoreApplications;X-MandrivaLinux-MoreApplications-Games" + xlat["Graphics"]="X-Mandrakelinux-Multimedia-Graphics" + xlat["Network"]="X-Mandrakelinux-Internet;X-MandrivaLinux-Internet" + xlat["Office"]="X-Mandrakelinux-Office;X-MandrivaLinux-Office" + xlat["System"]="X-Mandrakelinux-System;X-MandrivaLinux-System" + xlat["Utility"]="X-Mandrakelinux-Office-Accessories;X-MandrivaLinux-Office-Accessories" +} +{ + if (match($0,/Categories=/)) { + split(substr($0,RSTART+11),categories,";") + result="" + for (n in categories) + { + if (categories[n] in xlat) + categories[n]=categories[n] ";" xlat[categories[n]] + if (categories[n]) + result=result categories[n] ";" + } + print "Categories=" result + } + else + { + print $0 + } +}' $1 > $1.new + mv $1.new $1 +} + +# Make application $1/$2 the default for all the mimetypes it support, +# iff such mimetype didn't had a default application already. +# $1 Install dir for desktop file +# $2 base name of desktop file +make_lazy_default() +{ + local mimetypes + local xdg_user_dir + local xdg_default_dirs + + DEBUG 1 "make_lazy_default $1/$2" + mimetypes=`awk ' +{ + if (match($0,/MimeType=/)) { + split(substr($0,RSTART+9),mimetypes,";") + for (n in mimetypes) + { + if (mimetypes[n]) + print mimetypes[n] + } + } +}' "$1/$2" 2> /dev/null` + + for MIME in $mimetypes ; do + xdg_default_dirs="$XDG_DATA_DIRS" + [ -n "$xdg_default_dirs" ] || xdg_default_dirs=/usr/local/share/:/usr/share/ + if [ x"$mode" = x"user" ] ; then + xdg_user_dir="$XDG_DATA_HOME" + [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share" + xdg_default_dirs="$xdg_user_dir:$xdg_default_dirs" + fi + local default_app + for x in `echo "$xdg_default_dirs" | sed 's/:/ /g'`; do + DEBUG 2 "Checking $x/applications/defaults.list" + default_app=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2` + if [ -n "$default_app" ] ; then + DEBUG 2 "Found default apps for $MIME: $default_app" + default_app="$default_app;" + break; + fi + done + DEBUG 2 "Current default apps for $MIME: $default_app" + if echo "$default_app" | grep "$2" > /dev/null 2> /dev/null; then + # App already listed as default + continue; + fi + default_file="$1/defaults.list" + DEBUG 1 "Updating $default_file" + grep -v "$MIME=" $default_file > ${default_file}.new 2> /dev/null + if ! grep "[Default Applications]" ${default_file}.new > /dev/null; then + echo "[Default Applications]" >> ${default_file}.new + fi + echo $MIME="$default_app$2" >> ${default_file}.new + mv ${default_file}.new $default_file + done +} + +update_submenu() +{ + DEBUG 1 "update_submenu $1" + menu_file="$1" + + xdg_dir_name=menus + xdg_user_dir="$XDG_CONFIG_HOME" + [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.config" + xdg_user_dir="$xdg_user_dir/$xdg_dir_name" + + xdg_system_dirs="$XDG_CONFIG_DIRS" + [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/etc/xdg + xdg_global_dir= + for x in `echo $xdg_system_dirs | sed 's/:/ /g'` ; do + if [ -w $x/$xdg_dir_name ] ; then + xdg_global_dir="$x/$xdg_dir_name" + break + fi + done + xdg_user_dir="$xdg_user_dir/applications-merged" + xdg_global_dir="$xdg_global_dir/applications-merged" + + DEBUG 3 "Install locations for *.menu file:" + DEBUG 3 "xdg_user_dir: $xdg_user_dir" + DEBUG 3 "xdg_global_dir: $xdg_global_dir" + DEBUG 3 "kde_user_dir: $kde_user_dir" + DEBUG 3 "kde_global_dir: $kde_global_dir" + DEBUG 3 "gnome_user_dir: $gnome_user_dir" + DEBUG 3 "gnome_global_dir: $gnome_global_dir" + + if [ x"$mode" = x"user" ] ; then + xdg_dir="$xdg_user_dir" + kde_dir="$kde_user_dir" + gnome_dir="$gnome_user_dir" + my_umask=077 + my_chmod=0600 + else + xdg_dir="$xdg_global_dir" + kde_dir="$kde_global_dir" + gnome_dir="$gnome_global_dir" + my_umask=022 + my_chmod=0644 + if [ -z "${xdg_dir}${kde_dir}${gnome_dir}" ] ; then + exit_failure_operation_impossible "No writable system menu directory found." + fi + fi + + if [ -z "$menu_file" ] ; then + # Work around for SUSE/gnome 2.12 to pick up new ~/.local/share/applications + save_umask=`umask` + umask $my_umask + + mkdir -p $xdg_dir + touch $xdg_dir/xdg-desktop-menu-dummy.menu + + umask $save_umask + return + fi + + if [ $action = "install" -a -f "/etc/xdg/menus/gnome-applications.menu" ] ; then + # Work around for Debian Gnome + gnome_xdg_dir=`echo "$xdg_dir" | sed -e 's^/applications-merged^/gnome-applications-merged^'` + if [ ! -e "$gnome_xdg_dir" ] ; then + DEBUG 1 "Debian Workaround: Link '$xdg_dir' to '$gnome_xdg_dir'" + mkdir -p `dirname "$gnome_xdg_dir"` + eval 'ln -s "applications-merged" "$gnome_xdg_dir"'$xdg_redirect_output + fi + fi + if [ $action = "install" -a -f "/etc/mandrake-release" ] ; then + # Work around for Mandriva 2006 + mandrake_xdg_dir=`echo "$xdg_dir" | sed -e 's^/applications-merged^/applications-mdk-merged^'` + if [ ! -e "$mandrake_xdg_dir" ] ; then + DEBUG 1 "Mandriva Workaround: Link '$xdg_dir' to '$mandrake_xdg_dir'" + mkdir -p `dirname "$mandrake_xdg_dir"` + eval 'ln -s "applications-merged" "$mandrake_xdg_dir"'$xdg_redirect_output + fi + fi + if [ $action = "install" -a x"$mode" = x"user" -a -d "/etc/xdg/menus/kde-applications-merged" ] ; then + # Work around for Fedora Core 5 + patched KDE + kde_xdg_dir=`echo "$xdg_dir" | sed -e 's^/applications-merged^/kde-applications-merged^'` + if [ ! -e "$kde_xdg_dir" ] ; then + DEBUG 1 "Fedora Workaround: Link '$xdg_dir' to '$kde_xdg_dir'" + mkdir -p `dirname "$kde_xdg_dir"` + eval 'ln -s "applications-merged" "$kde_xdg_dir"'$xdg_redirect_output + fi + fi + if [ $action = "install" -a x"$mode" = x"system" -a -d "/etc/xdg/menus/kde-applications-merged" -a ! -d "/etc/xdg/menus/applications-merged" ] ; then + # Work around for Kubuntu 6.06 + kde_xdg_dir=`echo "$xdg_dir" | sed -e 's^/applications-merged^/kde-applications-merged^'` + DEBUG 1 "Kubuntu Workaround: Link '$xdg_dir' to 'kde-applications-merged'" + eval 'ln -s "kde-applications-merged" "$xdg_dir"'$xdg_redirect_output + fi + + orig_menu_file=$xdg_dir/$menu_file + + DEBUG 1 "Updating $orig_menu_file ($action)" + + tmpfile=`mktemp` + orig_desktop_files= + if [ -r "$orig_menu_file" ] ; then + awk ' +# List all files within tags +BEGIN { + RS="<" +} +/^Filename/ { + if (match($0,/>/)) { + print substr($0,RSTART+1) + } +}' $orig_menu_file > $tmpfile + fi + + orig_desktop_files=`cat $tmpfile` + new_desktop_files= + if [ $action = "install" ] ; then + for desktop_file in $desktop_files; do + basefile=`basename $desktop_file` + if ! grep '^'$basefile'$' $tmpfile > /dev/null 2> /dev/null ; then + # Append + echo "$basefile" >> $tmpfile + fi + done + new_desktop_files=`cat $tmpfile` + fi + if [ $action = "uninstall" ] ; then + echo > $tmpfile + for desktop_file in $desktop_files; do + echo "$desktop_file" >> $tmpfile + done + # Files to uninstall are listed in $tmpfile + # Existing files are in $orig_desktop_files + for desktop_file in $orig_desktop_files; do + if ! grep '^'$desktop_file'$' $tmpfile > /dev/null 2> /dev/null; then + # Keep this file, it's not in the uninstall list + new_desktop_files="$new_desktop_files $desktop_file" + fi + done + fi + rm -f "$tmpfile" + + DEBUG 3 "Files to list in $menu_file: $new_desktop_files" + + if [ -n "$new_desktop_files" ] ; then + # Install/update + tmpfile=`mktemp` + ( + echo '' + echo '' + echo '' + echo ' Applications' + + for desktop_file in $directory_files; do + basefile=`basename $desktop_file` + basefilename=`echo "$basefile"|cut -d '.' -f 1` + echo "" + echo " $basefilename" + echo " $basefile" + done + + echo " " + for desktop_file in $new_desktop_files; do + echo " $desktop_file" + done + echo " " + + for desktop_file in $directory_files; do + echo "" + done + + echo '' + ) > $tmpfile + chmod $my_chmod $tmpfile + + save_umask=`umask` + umask $my_umask + + mkdir -p $xdg_dir + eval 'cp $tmpfile $xdg_dir/$menu_file'$xdg_redirect_output + + umask $save_umask + rm -f "$tmpfile" + else + # Uninstall + rm -f $xdg_dir/$menu_file + fi + + # Uninstall .directory files only if no longer referenced + if [ $action = "uninstall" ] ; then + tmpfile=`mktemp` + for menu_file in $xdg_dir/*; do + if grep 'generated and managed by xdg-desktop-menu' $menu_file > /dev/null 2> /dev/null; then + awk ' +# List all files within tags +BEGIN { + RS="<" +} +/^Directory/ { + if (match($0,/>/)) { + print substr($0,RSTART+1) + } +}' $menu_file >> $tmpfile + fi + done + orig_directory_files="$directory_files" + directory_files= + for desktop_file in $orig_directory_files; do + if ! grep '^'$desktop_file'$' $tmpfile > /dev/null 2> /dev/null; then + # No longer in use, safe to delete + directory_files="$directory_files $desktop_file" + fi + done + rm -f "$tmpfile" + fi +} + + +[ x"$1" != x"" ] || exit_failure_syntax + +mode= +action= +update=yes +desktop_files= +directory_files= + +case $1 in + install) + action=install + ;; + + uninstall) + action=uninstall + ;; + + forceupdate) + action=forceupdate + ;; + + *) + exit_failure_syntax "unknown command '$1'" + ;; +esac + +shift + +vendor=true +while [ $# -gt 0 ] ; do + parm="$1" + shift + + case "$parm" in + --noupdate) + update=no + ;; + + --mode) + if [ -z "$1" ] ; then + exit_failure_syntax "mode argument missing for --mode" + fi + case "$1" in + user) + mode="user" + ;; + + system) + mode="system" + ;; + + *) + exit_failure_syntax "unknown mode '$1'" + ;; + esac + shift + ;; + + --novendor) + vendor=false + ;; + + -*) + exit_failure_syntax "unexpected option '$parm'" + ;; + + *) + if [ "$action" = "install" ] ; then + check_input_file "$parm" + fi + case "$parm" in + *.directory) + if [ -n "$desktop_files" ] ; then + exit_failure_syntax "'$parm' must preceed any *.desktop file" + fi + directory_files="$directory_files $parm" + ;; + *.desktop) + desktop_files="$desktop_files $parm" + ;; + *) + exit_failure_syntax "file to $action must be a *.directory or *.desktop file" + ;; + esac + ;; + esac +done + +# Shouldn't happen +if [ -z "$action" ] ; then + exit_failure_syntax "command argument missing" +fi + +if [ -n "$XDG_UTILS_INSTALL_MODE" ] ; then + if [ "$XDG_UTILS_INSTALL_MODE" = "system" ] ; then + mode="system" + elif [ "$XDG_UTILS_INSTALL_MODE" = "user" ] ; then + mode="user" + fi +fi + +if [ -z "$mode" ] ; then + if [ `whoami` = "root" ] ; then + mode="system" + else + mode="user" + fi +fi + +if [ x"$action" = x"forceupdate" ] ; then + update_desktop_database + exit_success +fi + +if [ -z "$desktop_files" ] ; then + exit_failure_syntax "desktop-file argument missing" +fi + +menu_name= +for desktop_file in $directory_files; do + if [ "$vendor" = "true" -a "$action" = "install" ] ; then + check_vendor_prefix "$desktop_file" + fi + + basefilename=`basename "$desktop_file"|cut -d '.' -f 1` + if [ -z "$menu_name" ] ; then + menu_name="$basefilename" + else + menu_name="$menu_name-$basefilename" + fi +done + +if [ -n "$menu_name" ] ; then + if [ x"$mode" = x"user" ] ; then + update_submenu "user-$menu_name.menu" + else + update_submenu "$menu_name.menu" + fi +else + # Work around for SUSE/gnome 2.12 to pick up new ~/.local/share/applications + if [ x"$mode" = x"user" ] ; then + update_submenu + fi +fi + +# Install *.directory files + +xdg_dir_name=desktop-directories + +xdg_user_dir="$XDG_DATA_HOME" +[ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share" +xdg_user_dir="$xdg_user_dir/$xdg_dir_name" + +xdg_system_dirs="$XDG_DATA_DIRS" +[ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/ +xdg_global_dir= +for x in `echo $xdg_system_dirs | sed 's/:/ /g'` ; do + if [ -w $x/$xdg_dir_name ] ; then + xdg_global_dir="$x/$xdg_dir_name" + break + fi +done + +DEBUG 3 "Install locations for *.directory files:" +DEBUG 3 "xdg_user_dir: $xdg_user_dir" +DEBUG 3 "xdg_global_dir: $xdg_global_dir" +DEBUG 3 "kde_user_dir: $kde_user_dir" +DEBUG 3 "kde_global_dir: $kde_global_dir" +DEBUG 3 "gnome_user_dir: $gnome_user_dir" +DEBUG 3 "gnome_global_dir: $gnome_global_dir" + +if [ x"$mode" = x"user" ] ; then + xdg_dir="$xdg_user_dir" + kde_dir="$kde_user_dir" + gnome_dir="$gnome_user_dir" + my_umask=077 +else + xdg_dir="$xdg_global_dir" + kde_dir="$kde_global_dir" + gnome_dir="$gnome_global_dir" + my_umask=022 + if [ -z "${xdg_dir}${kde_dir}${gnome_dir}" ] ; then + exit_failure_operation_impossible "No writable system menu directory found." + fi +fi + +for desktop_file in $directory_files; do + basefile=`basename $desktop_file` + + DEBUG 1 "$action $desktop_file in $xdg_dir $kde_dir $gnome_dir" + + case $action in + install) + save_umask=`umask` + umask $my_umask + + for x in $xdg_dir $kde_dir $gnome_dir ; do + mkdir -p $x + eval 'cp $desktop_file $x/$basefile'$xdg_redirect_output + done + + umask $save_umask + ;; + + uninstall) + for x in $xdg_dir $kde_dir $gnome_dir ; do + rm -f $x/$basefile + done + + ;; + esac +done + +# Install *.desktop files +xdg_dir_name=applications + +xdg_user_dir="$XDG_DATA_HOME" +[ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share" +xdg_user_dir="$xdg_user_dir/$xdg_dir_name" + +xdg_system_dirs="$XDG_DATA_DIRS" +[ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/ +xdg_global_dir= +for x in `echo $xdg_system_dirs | sed 's/:/ /g'` ; do + if [ -w $x/$xdg_dir_name ] ; then + xdg_global_dir="$x/$xdg_dir_name" + break + fi +done + +kde_user_dir="$HOME/.kde/share/applnk" +kde_global_dir="/usr/share/applnk" +[ -w $kde_global_dir ] || kde_global_dir= + +gnome_user_dir="$HOME/.gnome/apps" +gnome_global_dir="/usr/share/gnome/apps" +[ -w $gnome_global_dir ] || gnome_global_dir= + +[ -f /etc/mandriva-release ] && need_mandriva_fix=true +[ -n "$need_mandriva_fix" ] && DEBUG 1 "Fixing up .desktop categories (Mandriva work around)" + +DEBUG 3 "Install locations for *.desktop files:" +DEBUG 3 "xdg_user_dir: $xdg_user_dir" +DEBUG 3 "xdg_global_dir: $xdg_global_dir" +DEBUG 3 "kde_user_dir: $kde_user_dir" +DEBUG 3 "kde_global_dir: $kde_global_dir" +DEBUG 3 "gnome_user_dir: $gnome_user_dir" +DEBUG 3 "gnome_global_dir: $gnome_global_dir" + +if [ x"$mode" = x"user" ] ; then + xdg_dir="$xdg_user_dir" + kde_dir="$kde_user_dir" + gnome_dir="$gnome_user_dir" + my_umask=077 +else + xdg_dir="$xdg_global_dir" + kde_dir="$kde_global_dir" + gnome_dir="$gnome_global_dir" + my_umask=022 + if [ -z "${xdg_dir}${kde_dir}${gnome_dir}" ] ; then + exit_failure_operation_impossible "No writable system menu directory found." + fi +fi + +for desktop_file in $desktop_files; do + if [ "$vendor" = "true" -a "$action" = "install" ] ; then + check_vendor_prefix "$desktop_file" + fi + + basefile=`basename $desktop_file` + + DEBUG 1 "$action $desktop_file in $xdg_dir $kde_dir $gnome_dir" + + case $action in + install) + save_umask=`umask` + umask $my_umask + + for x in $xdg_dir $kde_dir $gnome_dir ; do + mkdir -p $x + eval 'cp $desktop_file $x/$basefile'$xdg_redirect_output + done + + if [ -n "$need_mandriva_fix" ] ; then + fixup_mandriva_categories $xdg_dir/$basefile + fi + + if [ -f $kde_dir/$basefile ] ; then + echo "OnlyShowIn=Old;" >> $kde_dir/$basefile + fi + + if [ -f $gnome_dir/$basefile ] ; then + echo "OnlyShowIn=Old;" >> $gnome_dir/$basefile + fi + + make_lazy_default "$xdg_dir" "$basefile" + + umask $save_umask + ;; + + uninstall) + for x in $xdg_dir $kde_dir $gnome_dir ; do + rm -f $x/$basefile + done + + ;; + esac +done + +if [ x"$update" = x"yes" ] ; then + update_desktop_database +fi + +exit_success diff --git a/src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource b/src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource new file mode 100755 index 00000000..df34ccaf --- /dev/null +++ b/src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource @@ -0,0 +1,837 @@ +#!/bin/sh +#--------------------------------------------- +# xdg-icon-resource +# +# Utility script to install icons on a Linux desktop. +# +# Refer to the usage() function below for usage. +# +# Copyright 2006, Kevin Krammer +# Copyright 2006, Jeremy White +# +# LICENSE: +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +#--------------------------------------------- + +manualpage() +{ +cat << _MANUALPAGE +Name + +xdg-icon-resource - command line tool for (un)installing icon resources + +Synopsis + +xdg-icon-resource install [--noupdate] [--novendor] [--theme theme] [--context +context] [--mode mode] --size size icon-file [icon-name] + +xdg-icon-resource uninstall [--noupdate] [--theme theme] [--context context] +[--mode mode] --size size icon-name + +xdg-icon-resource forceupdate [--theme theme] [--mode mode] + +xdg-icon-resource { --help | --manual | --version } + +Description + +The xdg-icon-resource program can be used to install icon resources into the +desktop icon system in order to illustrate menu entries, to depict desktop +icons or to graphically represent file types. + +The desktop icon system identifies icons by name. Depending on the required +size, the choice of icon theme and the context in which the icon is used, the +desktop icon system locates an appropriate icon resource to depict an icon. +Icon resources can be XPM files, PNG files or SVG files. + +The desktop icon system works according to the XDG Icon Theme Specification at +http://www.freedesktop.org/Standards/icon-theme-spec + +Commands + +install + Installs the icon file indicated by icon-file to the desktop icon system + under the name icon-name. Icon names do not have an extension. If icon-name + is not provided the name is derived from icon-file. The icon file must have + .png or .xpm as extension. If a corresponding .icon file exists in the same + location as icon-file it will be installed as well. +uninstall + Removes the icon indicated by icon-name from the desktop icon system. Note + that icon names do not have an extension. +forceupdate + Force an update of the desktop icon system. This is only useful if the last + call to xdg-icon-resource included the --noupdate option. + +Options + +--noupdate + Postpone updating the desktop icon system. If multiple icons are added in + sequence this flag can be used to indicate that additional changes will + follow and that it is not necassery to update the desktop icon system right + away. +--novendor + + Normally, xdg-icon-resource checks to ensure that an icon file to be + installed in the apps context has a proper vendor prefix. This option can + be used to disable that check. + + A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated + with a dash ("-"). Companies and organizations are encouraged to use a word + or phrase, preferably the organizations name, for which they hold a + trademark as their vendor prefix. The purpose of the vendor prefix is to + prevent name conflicts. + +--theme theme + Installs or removes the icon file as part of theme. If no theme is + specified the icons will be installed as part of the default hicolor theme. + Applications may install icons under multiple themes but should at least + install icons for the default hicolor theme. +--context context + Specifies the context for the icon. Icons to be used in the application + menu and as desktop icon should use apps as context which is the default + context. Icons to be used as file icons should use mimetypes as context. + Other common contexts are actions, devices, emblems, filesystems and stock. +--size size + Specifies the size of the icon. All icons must be square. Common sizes for + icons in the apps context are: 16, 22, 32, 48, 64 and 128. Common sizes for + icons in the mimetypes context are: 16, 22, 32, 48, 64 and 128 +--mode mode + + mode can be user or system. In user mode the file is (un)installed for the + current user only. In system mode the file is (un)installed for all users + on the system. Usually only root is allowed to install in system mode. + + The default is to use system mode when called by root and to use user mode + when called by a non-root user. + +--help + Show command synopsis. +--manual + Show this manualpage. +--version + Show the xdg-utils version information. + +Environment Variables + +xdg-icon-resource honours the following environment variables: + +XDG_UTILS_DEBUG_LEVEL + Setting this environment variable to a non-zero numerical value makes + xdg-icon-resource do more verbose reporting on stderr. Setting a higher + value increases the verbosity. +XDG_UTILS_INSTALL_MODE + This environment variable can be used by the user or administrator to + override the installation mode. Valid values are user and system. + +Exit Codes + +An exit code of 0 indicates success while a non-zero exit code indicates +failure. The following failure codes can be returned: + +1 + Error in command line syntax. +2 + One of the files passed on the command line did not exist. +3 + A required tool could not be found. +4 + The action failed. +5 + No permission to read one of the files passed on the command line. + +See Also + +xdg-desktop-icon(1), xdg-desktop-menu(1), xdg-mime(1) + +Examples + +To install an icon resource to depict a launcher for the application myfoobar, +the company ShinyThings Inc. can use: + +xdg-icon-resource install --size 64 shinythings-myfoobar.png + +To install an icon for a new application/x-foobar file type one can use: + +xdg-icon-resource install --context mimetypes --size 48 ./mime-foobar-48.png application-x-foobar +xdg-icon-resource install --context mimetypes --size 64 ./mime-foobar-64.png application-x-foobar + +This will install two icons with the name application-x-foobar but with +different sizes. + +_MANUALPAGE +} + +usage() +{ +cat << _USAGE +xdg-icon-resource - command line tool for (un)installing icon resources + +Synopsis + +xdg-icon-resource install [--noupdate] [--novendor] [--theme theme] [--context +context] [--mode mode] --size size icon-file [icon-name] + +xdg-icon-resource uninstall [--noupdate] [--theme theme] [--context context] +[--mode mode] --size size icon-name + +xdg-icon-resource forceupdate [--theme theme] [--mode mode] + +xdg-icon-resource { --help | --manual | --version } + +_USAGE +} + +#@xdg-utils-common@ + +#---------------------------------------------------------------------------- +# Common utility functions included in all XDG wrapper scripts +#---------------------------------------------------------------------------- + +DEBUG() +{ + [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; + [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; + shift + echo "$@" >&2 +} + +#------------------------------------------------------------- +# Exit script on successfully completing the desired operation + +exit_success() +{ + if [ $# -gt 0 ]; then + echo "$@" + echo + fi + + exit 0 +} + + +#----------------------------------------- +# Exit script on malformed arguments, not enough arguments +# or missing required option. +# prints usage information + +exit_failure_syntax() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + echo "Try 'xdg-icon-resource --help' for more information." >&2 + else + usage + echo "Use 'man xdg-icon-resource' or 'xdg-icon-resource --manual' for additional info." + fi + + exit 1 +} + +#------------------------------------------------------------- +# Exit script on missing file specified on command line + +exit_failure_file_missing() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + fi + + exit 2 +} + +#------------------------------------------------------------- +# Exit script on failure to locate necessary tool applications + +exit_failure_operation_impossible() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + fi + + exit 3 +} + +#------------------------------------------------------------- +# Exit script on failure returned by a tool application + +exit_failure_operation_failed() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + fi + + exit 4 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_read() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + fi + + exit 5 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_write() +{ + if [ $# -gt 0 ]; then + echo "xdg-icon-resource: $@" >&2 + fi + + exit 6 +} + +check_input_file() +{ + if [ ! -e "$1" ]; then + exit_failure_file_missing "file '$1' does not exist" + fi + if [ ! -r "$1" ]; then + exit_failure_file_permission_read "no permission to read file '$1'" + fi +} + +check_vendor_prefix() +{ + file_label="$2" + [ -n "$file_label" ] || file_label="filename" + file=`basename "$1"` + case "$file" in + [a-zA-Z]*-*) + return + ;; + esac + + echo "xdg-icon-resource: $file_label '$file' does not have a proper vendor prefix" >&2 + echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2 + echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2 + echo "Use --novendor to override or 'xdg-icon-resource --manual' for additional info." >&2 + exit 1 +} + +check_output_file() +{ + # if the file exists, check if it is writeable + # if it does not exists, check if we are allowed to write on the directory + if [ -e "$1" ]; then + if [ ! -w "$1" ]; then + exit_failure_file_permission_write "no permission to write to file '$1'" + fi + else + DIR=`dirname "$1"` + if [ ! -w "$DIR" -o ! -x "$DIR" ]; then + exit_failure_file_permission_write "no permission to create file '$1'" + fi + fi +} + +#---------------------------------------- +# Checks for shared commands, e.g. --help + +check_common_commands() +{ + while [ $# -gt 0 ] ; do + parm="$1" + shift + + case "$parm" in + --help) + usage + echo "Use 'man xdg-icon-resource' or 'xdg-icon-resource --manual' for additional info." + exit_success + ;; + + --manual) + manualpage + exit_success + ;; + + --version) + echo "xdg-icon-resource 1.0.1" + exit_success + ;; + esac + done +} + +check_common_commands "$@" + +[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL; +if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then + # Be silent + xdg_redirect_output=" > /dev/null 2> /dev/null" +else + # All output to stderr + xdg_redirect_output=" >&2" +fi + +#-------------------------------------- +# Checks for known desktop environments +# set variable DE to the desktop environments name, lowercase + +detectDE() +{ + if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde; + elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome; + elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce; + fi +} + +#---------------------------------------------------------------------------- +# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4 +# It also always returns 1 in KDE 3.4 and earlier +# Simply return 0 in such case + +kfmclient_fix_exit_code() +{ + version=`kde-config --version 2>/dev/null | grep KDE` + major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'` + minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'` + release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` + test "$major" -gt 3 && return $1 + test "$minor" -gt 5 && return $1 + test "$release" -gt 4 && return $1 + return 0 +} + +# Set GTK_UPDATE_ICON_CACHE to gtk-update-icon-cache executable path or +# to "-" if not found. +GTK_UPDATE_ICON_CACHE= +find_gtk_update_icon_cache() +{ + [ -n "$GTK_UPDATE_ICON_CACHE" ] && return; + + GTK_UPDATE_ICON_CACHE="-" + for x in `echo "$PATH:/opt/gnome/bin" | sed 's/:/ /g'`; do + DEBUG 3 "Checking $x for gtk-update-icon-cache" + if [ -x "$x/gtk-update-icon-cache" ] ; then + DEBUG 1 "Found $x/gtk-update-icon-cache" + GTK_UPDATE_ICON_CACHE="$x/gtk-update-icon-cache" + return + fi + done +} + +# Start GNOME legacy workaround section +need_dot_icon_path() +{ + # GTK < 2.6 uses ~/.icons but not XDG_DATA_HOME/icons + # The availability of gtk-update-icon-cache is used as indication + # of whether the system is using GTK 2.6 or later + find_gtk_update_icon_cache + [ "$GTK_UPDATE_ICON_CACHE" != "-" ] && return 1; + return 0; +} + +update_icon_database() +{ + # Touch me, I'm dirty + touch "$1/.xdg-icon-resource-dummy" + rm -f "$1/.xdg-icon-resource-dummy" + + # Don't create a cache if there wan't one already + if [ -f "$1/icon-theme.cache" ] ; then + find_gtk_update_icon_cache + if [ "$GTK_UPDATE_ICON_CACHE" != "-" ] ; then + DEBUG 1 "Running $GTK_UPDATE_ICON_CACHE -f -t \"$1\"" + eval '$GTK_UPDATE_ICON_CACHE -f -t "$1"'$xdg_redirect_output + return + fi + fi +} + +[ x"$1" != x"" ] || exit_failure_syntax + +mode= +action= +update=yes +size= +theme=hicolor +context=apps +icon_file= +icon_name= + +case $1 in + install) + action=install + ;; + + uninstall) + action=uninstall + ;; + + forceupdate) + action=forceupdate + ;; + + *) + exit_failure_syntax "unknown command '$1'" + ;; +esac + +shift + +vendor=true +while [ $# -gt 0 ] ; do + parm="$1" + shift + + case $parm in + --noupdate) + update=no + ;; + + --mode) + if [ -z "$1" ] ; then + exit_failure_syntax "mode argument missing for --mode" + fi + case "$1" in + user) + mode="user" + ;; + + system) + mode="system" + ;; + + *) + exit_failure_syntax "unknown mode '$1'" + ;; + esac + shift + ;; + + --theme) + if [ -z "$1" ] ; then + exit_failure_syntax "theme argument missing for --theme" + fi + theme="$1" + shift + ;; + + --size) + if [ -z "$1" ] ; then + exit_failure_syntax "size argument missing for --size" + fi + if echo "$1" | grep '[^0-9]' > /dev/null 2> /dev/null; then + exit_failure_syntax "size argument must be numeric" + fi + size="$1" + shift + ;; + + --context) + if [ -z "$1" ] ; then + exit_failure_syntax "context argument missing for --context" + fi + context="$1" + shift + ;; + + --novendor) + vendor=false + ;; + + -*) + exit_failure_syntax "unexpected option '$parm'" + ;; + + *) + if [ -n "$icon_name" ] ; then + exit_failure_syntax "unexpected argument '$parm'" + elif [ -n "$icon_file" ] ; then + icon_name="$parm" + else + if [ "$action" = "install" ] ; then + check_input_file "$parm" + fi + icon_file="$parm" + fi + ;; + esac +done + +# Shouldn't happen +if [ -z "$action" ] ; then + exit_failure_syntax "command argument missing" +fi + +# Shouldn't happen +if [ -z "$context" ] ; then + exit_failure_syntax "context argument missing" +fi + +if [ -n "$XDG_UTILS_INSTALL_MODE" ] ; then + if [ "$XDG_UTILS_INSTALL_MODE" = "system" ] ; then + mode="system" + elif [ "$XDG_UTILS_INSTALL_MODE" = "user" ] ; then + mode="user" + fi +fi + +if [ -z "$mode" ] ; then + if [ `whoami` = "root" ] ; then + mode="system" + else + mode="user" + fi +fi + +xdg_dir_name="icons/$theme" + +xdg_user_dir="$XDG_DATA_HOME" +[ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share" +xdg_user_prefix="$xdg_user_dir/icons" +xdg_user_dir="$xdg_user_dir/$xdg_dir_name" + +xdg_global_dir= +xdg_global_prefix= +xdg_system_dirs="$XDG_DATA_DIRS" +[ -n "$xdg_system_dirs" ] || xdg_system_dirs="/usr/local/share/:/usr/share/" +for x in `echo "$xdg_system_dirs" | sed 's/:/ /g'`; do + if [ -w $x/$xdg_dir_name ] ; then + xdg_global_prefix="$x/icons" + xdg_global_dir="$x/$xdg_dir_name" + break + fi +done +[ -w $xdg_global_dir ] || xdg_global_dir= + +dot_icon_dir= +dot_base_dir= +if [ x"$mode" = x"user" ] ; then + xdg_base_dir="$xdg_user_dir" + #Gnome 2.8 supports ~/.icons but not XDG_DATA_HOME + if need_dot_icon_path ; then + dot_icon_dir="$HOME/.icons" + dot_base_dir="$dot_icon_dir/$theme" + fi +else + xdg_base_dir="$xdg_global_dir" + if [ -z "$xdg_base_dir" ] ; then + exit_failure_operation_impossible "No writable system icon directory found." + fi +fi + +if [ x"$action" = x"forceupdate" ] ; then + if [ -n "$icon_file" ] ; then + exit_failure_syntax "unexpected argument '$icon_file'" + fi + update_icon_database $xdg_base_dir + if [ -n "$dot_icon_dir" ] ; then + if [ -d "$dot_icon_dir/" -a ! -L "$dot_icon_dir" ] ; then + update_icon_database $dot_base_dir + fi + fi + exit_success +fi + +if [ -z "$icon_file" ] ; then + if [ x"$action" = x"install" ] ; then + exit_failure_syntax "icon-file argument missing" + else + exit_failure_syntax "icon-name argument missing" + fi +fi + +xdg_size_name= +extension= + +if [ -z "$size" ] ; then + exit_failure_syntax "the icon size must be specified with --size" +fi +xdg_size_name="${size}x${size}" + +if [ x"$action" = x"install" ] ; then + case $icon_file in + *.xpm) + extension="xpm" + ;; + *.png) + extension="png" + ;; + *) + exit_failure_syntax "icon file to install must be a *.png or *.xpm file" + ;; + esac +fi + +if [ -n "$icon_name" ] ; then + case $icon_name in + *.png) + exit_failure_syntax "icon name should not include an extension" + ;; + *.xpm) + exit_failure_syntax "icon name should not include an extension" + ;; + esac +fi + +# Start KDE legacy workaround section +need_kde_icon_path() +{ + local path + path=`readlink -f "$1" 2> /dev/null` # Normalize path + DEBUG 2 "need_kde_icon_path $path" + if [ -z "$path" ] ; then + DEBUG 2 "need_kde_icon_path RETURN 1 (not needed, no xdg icon dir)" + return 1; # Not needed + fi + + # if kde-config not found... return 0 + kde_icon_dirs=`kde-config --path icon 2> /dev/null |sed 's/:/ /g'` + DEBUG 3 "kde_icon_dirs: $kde_icon_dirs" + if [ -z "$kde_icon_dirs" ] ; then + DEBUG 3 "no result from kde-config --path icon" + DEBUG 2 "need_kde_icon_path RETURN 1 (not needed, no kde icon path)" + return 1; # Not needed + fi + needed=0 # Needed + for y in $kde_icon_dirs ; do + x=`readlink -f "$y"` # Normalize path + DEBUG 3 "Normalize $y --> $x" + if [ -n "$x" ] ; then + if [ "$x" = "$path" ] ; then + needed=1 # Not needed + fi + if [ -w "$x" ] ; then + kde_global_prefix="$x" + # Take last writable dir + fi + fi + done + DEBUG 2 "kde_global_prefix: $kde_global_prefix" + [ $needed -eq "1" ] && DEBUG 2 "need_kde_icon_path RETURN $needed (not needed)" + [ $needed -eq "0" ] && DEBUG 2 "need_kde_icon_path RETURN $needed (needed)" + return $needed +} + +kde_dir= +if [ x"$mode" = x"user" ] ; then + xdg_dir="$xdg_base_dir/$xdg_size_name/$context" + #KDE 3.x doesn't support XDG_DATA_HOME for icons + #Check if xdg_dir prefix is listed by kde-config --path icon + #If not, install additional symlink to kdedir + if need_kde_icon_path "$xdg_user_prefix" ; then + kde_user_dir="$HOME/.kde/share/icons/$theme" + kde_dir="$kde_user_dir/$xdg_size_name/$context" + fi + #Gnome 2.8 supports ~/.icons but not XDG_DATA_HOME + if [ -n "$dot_icon_dir" ] ; then + if [ -L "$dot_icon_dir" ] ; then + # Don't do anything + dot_icon_dir= + elif [ ! -d "$dot_icon_dir/" ] ; then + # Symlink if it doesn't exist + eval 'ln -s ".local/share/icons" "$dot_icon_dir"'$xdg_redirect_output + dot_icon_dir= + else + dot_icon_dir="$dot_icon_dir/$theme/$xdg_size_name/$context" + fi + fi + my_umask=077 +else + xdg_dir="$xdg_base_dir/$xdg_size_name/$context" + #KDE 3.x doesn't support XDG_DATA_DIRS for icons + #Check if xdg_dir prefix is listed by kde-config --path icon + #If not, install additional symlink to kdedir + if need_kde_icon_path "$xdg_global_prefix" ; then + kde_global_dir="$kde_global_prefix/$theme" + kde_dir="$kde_global_dir/$xdg_size_name/$context" + fi + my_umask=022 +fi +# End KDE legacy workaround section + +# Start GNOME legacy workaround section +need_gnome_mime= +[ $context = "mimetypes" ] && need_gnome_mime=true +# End GNOME legacy workaround section + +[ -n "$icon_name" ] || icon_name=`basename $icon_file | sed 's/\.[a-z][a-z][a-z]$//'` + +if [ "$vendor" = "true" -a "$action" = "install" -a "$context" = "apps" ] ; then + check_vendor_prefix "$icon_name" "icon name" +fi + +icon_icon_file=`echo "$icon_file" | sed 's/\.[a-z][a-z][a-z]$/.icon/'` +icon_icon_name="$icon_name.icon" + +DEBUG 1 "$action icon in $xdg_dir" +[ $action = "install" -a -f $icon_icon_file ] && DEBUG 1 "install $icon_icon_name meta file in $xdg_dir" +[ -n "$kde_dir" ] && DEBUG 1 "$action symlink in $kde_dir (KDE 3.x support)" +[ -n "$need_gnome_mime" ] && DEBUG 1 "$action gnome-mime-$icon_name symlink (GNOME 2.x support)" +[ $action = "install" -a -n "$dot_icon_dir" ] && DEBUG 1 "$action ~/.icons symlink (GNOME 2.8 support)" + +case $action in + install) + save_umask=`umask` + umask $my_umask + + for icon_dir in $xdg_dir $dot_icon_dir; do + mkdir -p $icon_dir + eval 'cp "$icon_file" "$icon_dir/$icon_name.$extension"'$xdg_redirect_output + if [ -f "$icon_icon_file" ] ; then + eval 'cp "$icon_icon_file" "$icon_dir/$icon_icon_name"'$xdg_redirect_output + fi + if [ -n "$need_gnome_mime" ] ; then + eval 'ln -s "$icon_name.$extension" "$icon_dir/gnome-mime-$icon_name.$extension"'$xdg_redirect_output + fi + done + if [ -n "$kde_dir" ] ; then + mkdir -p $kde_dir + eval 'ln -s "$xdg_dir/$icon_name.$extension" "$kde_dir/$icon_name.$extension"'$xdg_redirect_output + fi + + umask $save_umask + ;; + + uninstall) + for icon_dir in $xdg_dir $dot_icon_dir; do + rm -f "$icon_dir/$icon_name.xpm" "$icon_dir/$icon_name.png" + rm -f "$icon_dir/$icon_icon_name" + if [ -n "$need_gnome_mime" ] ; then + rm -f "$icon_dir/gnome-mime-$icon_name.xpm" + rm -f "$icon_dir/gnome-mime-$icon_name.png" + fi + done + if [ -n "$kde_dir" ] ; then + rm -f "$kde_dir/$icon_name.xpm" "$kde_dir/$icon_name.png" + fi + + ;; +esac + +if [ x"$update" = x"yes" ] ; then + update_icon_database "$xdg_base_dir" + if [ -n "$dot_icon_dir" ] ; then + if [ -d "$dot_icon_dir/" -a ! -L "$dot_icon_dir" ] ; then + update_icon_database $dot_base_dir + fi + fi +fi + +exit_success diff --git a/src/desktop/xdg-utils-1.0.1/scripts/xdg-open b/src/desktop/xdg-utils-1.0.1/scripts/xdg-open new file mode 100755 index 00000000..4cc18a84 --- /dev/null +++ b/src/desktop/xdg-utils-1.0.1/scripts/xdg-open @@ -0,0 +1,436 @@ +#!/bin/sh +#--------------------------------------------- +# xdg-open +# +# Utility script to open a URL in the registered default application. +# +# Refer to the usage() function below for usage. +# +# Copyright 2006, Kevin Krammer +# Copyright 2006, Jeremy White +# +# LICENSE: +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +#--------------------------------------------- + +manualpage() +{ +cat << _MANUALPAGE +Name + +xdg-open - opens a file or URL in the user's preferred application + +Synopsis + +xdg-open { file | URL } + +xdg-open { --help | --manual | --version } + +Description + +xdg-open opens a file or URL in the user's preferred application. If a URL is +provided the URL will be opened in the user's preferred web browser. If a file +is provided the file will be opened in the preferred application for files of +that type. xdg-open supports file, ftp, http and https URLs. + +xdg-open is for use inside a desktop session only. It is not recommended to use +xdg-open as root. + +Options + +--help + Show command synopsis. +--manual + Show this manualpage. +--version + Show the xdg-utils version information. + +Exit Codes + +An exit code of 0 indicates success while a non-zero exit code indicates +failure. The following failure codes can be returned: + +1 + Error in command line syntax. +2 + One of the files passed on the command line did not exist. +3 + A required tool could not be found. +4 + The action failed. + +Examples + +xdg-open 'http://www.freedesktop.org/' + +Opens the Freedesktop.org website in the user's default browser + +xdg-open /tmp/foobar.png + +Opens the PNG image file /tmp/foobar.png in the user's default image viewing +application. + +_MANUALPAGE +} + +usage() +{ +cat << _USAGE +xdg-open - opens a file or URL in the user's preferred application + +Synopsis + +xdg-open { file | URL } + +xdg-open { --help | --manual | --version } + +_USAGE +} + +#@xdg-utils-common@ + +#---------------------------------------------------------------------------- +# Common utility functions included in all XDG wrapper scripts +#---------------------------------------------------------------------------- + +DEBUG() +{ + [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; + [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; + shift + echo "$@" >&2 +} + +#------------------------------------------------------------- +# Exit script on successfully completing the desired operation + +exit_success() +{ + if [ $# -gt 0 ]; then + echo "$@" + echo + fi + + exit 0 +} + + +#----------------------------------------- +# Exit script on malformed arguments, not enough arguments +# or missing required option. +# prints usage information + +exit_failure_syntax() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + echo "Try 'xdg-open --help' for more information." >&2 + else + usage + echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info." + fi + + exit 1 +} + +#------------------------------------------------------------- +# Exit script on missing file specified on command line + +exit_failure_file_missing() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + fi + + exit 2 +} + +#------------------------------------------------------------- +# Exit script on failure to locate necessary tool applications + +exit_failure_operation_impossible() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + fi + + exit 3 +} + +#------------------------------------------------------------- +# Exit script on failure returned by a tool application + +exit_failure_operation_failed() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + fi + + exit 4 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_read() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + fi + + exit 5 +} + +#------------------------------------------------------------ +# Exit script on insufficient permission to read a specified file + +exit_failure_file_permission_write() +{ + if [ $# -gt 0 ]; then + echo "xdg-open: $@" >&2 + fi + + exit 6 +} + +check_input_file() +{ + if [ ! -e "$1" ]; then + exit_failure_file_missing "file '$1' does not exist" + fi + if [ ! -r "$1" ]; then + exit_failure_file_permission_read "no permission to read file '$1'" + fi +} + +check_vendor_prefix() +{ + file_label="$2" + [ -n "$file_label" ] || file_label="filename" + file=`basename "$1"` + case "$file" in + [a-zA-Z]*-*) + return + ;; + esac + + echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2 + echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2 + echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2 + echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2 + exit 1 +} + +check_output_file() +{ + # if the file exists, check if it is writeable + # if it does not exists, check if we are allowed to write on the directory + if [ -e "$1" ]; then + if [ ! -w "$1" ]; then + exit_failure_file_permission_write "no permission to write to file '$1'" + fi + else + DIR=`dirname "$1"` + if [ ! -w "$DIR" -o ! -x "$DIR" ]; then + exit_failure_file_permission_write "no permission to create file '$1'" + fi + fi +} + +#---------------------------------------- +# Checks for shared commands, e.g. --help + +check_common_commands() +{ + while [ $# -gt 0 ] ; do + parm="$1" + shift + + case "$parm" in + --help) + usage + echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info." + exit_success + ;; + + --manual) + manualpage + exit_success + ;; + + --version) + echo "xdg-open 1.0.1" + exit_success + ;; + esac + done +} + +check_common_commands "$@" + +[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL; +if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then + # Be silent + xdg_redirect_output=" > /dev/null 2> /dev/null" +else + # All output to stderr + xdg_redirect_output=" >&2" +fi + +#-------------------------------------- +# Checks for known desktop environments +# set variable DE to the desktop environments name, lowercase + +detectDE() +{ + if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde; + elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome; + elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce; + fi +} + +#---------------------------------------------------------------------------- +# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4 +# It also always returns 1 in KDE 3.4 and earlier +# Simply return 0 in such case + +kfmclient_fix_exit_code() +{ + version=`kde-config --version 2>/dev/null | grep KDE` + major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'` + minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'` + release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` + test "$major" -gt 3 && return $1 + test "$minor" -gt 5 && return $1 + test "$release" -gt 4 && return $1 + return 0 +} + +open_kde() +{ + kfmclient exec "$1" + kfmclient_fix_exit_code $? + + if [ $? -eq 0 ]; then + exit_success + else + exit_failure_operation_failed + fi +} + +open_gnome() +{ + gnome-open "$1" + + if [ $? -eq 0 ]; then + exit_success + else + exit_failure_operation_failed + fi +} + +open_xfce() +{ + exo-open "$1" + + if [ $? -eq 0 ]; then + exit_success + else + exit_failure_operation_failed + fi +} + +open_generic() +{ + IFS=":" + for browser in $BROWSER; do + if [ x"$browser" != x"" ]; then + + browser_with_arg=`echo "$browser" | sed s#%s#"$1"#` + + if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1"; + else $browser_with_arg; + fi + + if [ $? -eq 0 ]; then exit_success; + fi + fi + done + + exit_failure_operation_impossible "no method available for opening '$1'" +} + +[ x"$1" != x"" ] || exit_failure_syntax + +url= +while [ $# -gt 0 ] ; do + parm="$1" + shift + + case "$parm" in + -*) + exit_failure_syntax "unexpected option '$parm'" + ;; + + *) + if [ -n "$url" ] ; then + exit_failure_syntax "unexpected argument '$parm'" + fi + url="$parm" + ;; + esac +done + +if [ -z "${url}" ] ; then + exit_failure_syntax "file or URL argument missing" +fi + +detectDE + +if [ x"$DE" = x"" ]; then + # if BROWSER variable is not set, check some well known browsers instead + if [ x"$BROWSER" = x"" ]; then + BROWSER=firefox:mozilla:netscape + fi + DE=generic +fi + +case "$DE" in + kde) + open_kde "$url" + ;; + + gnome) + open_gnome "$url" + ;; + + xfce) + open_xfce "$url" + ;; + + generic) + open_generic "$url" + ;; + + *) + exit_failure_operation_impossible "no method available for opening '$url'" + ;; +esac diff --git a/src/doc/man/recoll.1 b/src/doc/man/recoll.1 new file mode 100644 index 00000000..36174625 --- /dev/null +++ b/src/doc/man/recoll.1 @@ -0,0 +1,99 @@ +.\" $Id: recoll.1,v 1.3 2007-11-13 18:42:18 dockes Exp $ (C) 2005 J.F.Dockes\$ +.TH RECOLL 1 "8 January 2006" +.SH NAME +recoll \- user interface for the Recoll full text search system +.SH SYNOPSIS +.B recoll +[ +.B \-c + +] +[ +.B \-o +| +.B \-l +| +.B \-f +| +.B \-a +] +[ +.B \-t +] +[ +.B \-q + +] + +.B recoll +[ +.B \-c + +] + +.SH DESCRIPTION +In the first form, the +.B recoll +command will start the graphical user interface for querying the +.B Recoll +database. +.PP +On the first run, +.B recoll +will create the user configuration which can be customized +before starting the first indexation. +.PP +The +.B \-c +option specifies the configuration directory name, overriding the +default or $RECOLL_CONFDIR. +.PP +The +.B \-q +option can be used to specify an initial query on the command line. This +query will be interpreted by default as a query language string. +If +.B \-a +is specified, the query string will be interpreted as an +.I all words +simple search query. If +.B \-o +is specified, the query string will be interpreted as an +.I any word +simple search query. If +.B \-f +is specified, the query string will be interpreted as a +.I file name +simple search query. If +.B \-l +is specified, the query string will be interpreted as a +.I query language +simple search query. +.PP +If +.B \-t +is specified, the Graphical User Interface will not be started, and results +will be printed to the standard output. Additional options understood by +the +.B recollq +command may be specified in this case. These can control the output format +and the maximum number of results to be printed. +.PP +Please refer to online help for a full description. +.PP +In the second form, the +.B recoll +command can be used to start a native viewer for a document indexed by +Recoll. It will understand a final URL fragment (separated by a '#' +character) to indicate an +.I ipath +, the specifier for the part of the Recoll document access path which is is +internal to a container such as a mbox folder or a zip archive, and will, +if needed, create a temporary file to let a normal system utility display +the document. +.PP +The second form is mostly used for opening embedded documents from the +Ubuntu Unity Recoll lens. +.SH SEE ALSO +.PP +recollindex(1) recollq(1) recoll.conf(5) diff --git a/src/doc/man/recoll.conf.5 b/src/doc/man/recoll.conf.5 new file mode 100644 index 00000000..7cdc8216 --- /dev/null +++ b/src/doc/man/recoll.conf.5 @@ -0,0 +1,369 @@ +.TH RECOLL.CONF 5 "14 November 2012" +.SH NAME +recoll.conf \- main personal configuration file for Recoll +.SH DESCRIPTION +This file defines the index configuration for the Recoll full-text search +system. +.LP +The system-wide configuration file is normally located inside +/usr/[local]/share/recoll/examples. Any parameter set in the common file +may be overridden by setting it in the personal configuration file, by default: +.IR $HOME/.recoll/recoll.conf +.LP +Please note while we try to keep this manual page reasonably up to date, it +will frequently lag the current state of the software. The best source of +information about the configuration are the comments in the system-wide +configuration file. + +.LP +A short extract of the file might look as follows: +.IP +.nf + +# Space-separated list of directories to index. +topdirs = ~/docs /usr/share/doc + +[~/somedirectory-with-utf8-txt-files] +defaultcharset = utf-8 + +.fi +.LP +There are three kinds of lines: +.RS +.IP \(bu +Comment or empty +.IP \(bu +Parameter affectation +.IP \(bu +Section definition +.RE +.LP +Empty lines or lines beginning with # are ignored. +.LP +Affectation lines are in the form 'name = value'. +.LP +Section lines allow redefining a parameter for a directory subtree. Some of +the parameters used for indexing are looked up hierarchically from the +more to the less specific. Not all parameters can be meaningfully +redefined, this is specified for each in the next section. +.LP +The tilde character (~) is expanded in file names to the name of the user's +home directory. +.LP +Where values are lists, white space is used for separation, and elements with +embedded spaces can be quoted with double-quotes. +.SH OPTIONS +.TP +.BI "topdirs = " directories +Specifies the list of directories to index (recursively). +.TP +.BI "skippedNames = " patterns +A space-separated list of patterns for names of files or directories that +should be completely ignored. The list defined in the default file is: +.sp +.nf +*~ #* bin CVS Cache caughtspam tmp + +.fi +The list can be redefined for subdirectories, but is only actually changed +for the top level ones in +.I topdirs +.TP +.BI "skippedPaths = " patterns +A space-separated list of patterns for paths the indexer should not descend +into. Together with topdirs, this allows pruning the indexed tree to one's +content. +.B daemSkippedPaths +can be used to define a specific value for the real time indexing monitor. +.TP +.BI "skippedPathsFnmPathname = " 0/1 +The values in the *skippedPaths variables are matched by default with +fnmatch(3), with the FNM_PATHNAME and FNM_LEADING_DIR flags. This means +that '/' characters must be matched explicitly. You can set +skippedPathsFnmPathname to 0 to disable the use of FNM_PATHNAME (meaning +that /*/dir3 will match /dir1/dir2/dir3). +.TP +.BI "followLinks = " boolean +Specifies if the indexer should follow +symbolic links while walking the file tree. The default is +to ignore symbolic links to avoid multiple indexing of +linked files. No effort is made to avoid duplication when +this option is set to true. This option can be set +individually for each of the +.I topdirs +members by using sections. It can not be changed below the +.I topdirs +level. +.TP +.BI "indexedmimetypes = " list +Recoll normally indexes any file which it knows how to read. This list lets +you restrict the indexed mime types to what you specify. If the variable is +unspecified or the list empty (the default), all supported types are +processed. +.TP +.BI "compressedfilemaxkbs = " value +Size limit for compressed (.gz or .bz2) files. These need to be +decompressed in a temporary directory for identification, which can be very +wasteful if 'uninteresting' big compressed files are present. Negative +means no limit, 0 means no processing of any compressed file. Defaults +to \-1. +.TP +.BI "textfilemaxmbs = " value +Maximum size for text files. Very big text files are often uninteresting +logs. Set to \-1 to disable (default 20MB). +.TP +.BI "textfilepagekbs = " value +If this is set to other than \-1, text files will be indexed as multiple +documents of the given page size. This may be useful if you do want to +index very big text files as it will both reduce memory usage at index time +and help with loading data to the preview window. A size of a few megabytes +would seem reasonable (default: 1000 : 1MB). +.TP +.BI "membermaxkbs = " "value in kilobytes" +This defines the maximum size for an archive member (zip, tar or rar at +the moment). Bigger entries will be skipped. Current default: 50000 (50 MB). +.TP +.BI "indexallfilenames = " boolean +Recoll indexes file names into a special section of the database to allow +specific file names searches using wild cards. This parameter decides if +file name indexing is performed only for files with mime types that would +qualify them for full text indexing, or for all files inside +the selected subtrees, independent of mime type. +.TP +.BI "usesystemfilecommand = " boolean +Decide if we use the +.B "file \-i" +system command as a final step for determining the mime type for a file +(the main procedure uses suffix associations as defined in the +.B mimemap +file). This can be useful for files with suffixless names, but it will +also cause the indexing of many bogus "text" files. +.TP +.BI "processbeaglequeue = " 0/1 +If this is set, process the directory where Beagle Web browser plugins copy +visited pages for indexing. Of course, Beagle MUST NOT be running, else +things will behave strangely. +.TP +.BI "beaglequeuedir = " directory path +The path to the Beagle indexing queue. This is hard-coded in the Beagle +plugin as ~/.beagle/ToIndex so there should be no need to change it. +.TP +.BI "indexStripChars = " 0/1 +Decide if we strip characters of diacritics and convert them to lower-case +before terms are indexed. If we don't, searches sensitive to case and +diacritics can be performed, but the index will be bigger, and some +marginal weirdness may sometimes occur. The default is a stripped index +(indexStripChars = 1) for now. When using multiple indexes for a search, +this parameter must be defined identically for all. Changing the value +implies an index reset. +.TP +.BI "maxTermExpand = " value +Maximum expansion count for a single term (e.g.: when using wildcards). The +default of 10000 is reasonable and will avoid queries that appear frozen +while the engine is walking the term list. +.TP +.BI "maxXapianClauses = " value +Maximum number of elementary clauses we can add to a single Xapian +query. In some cases, the result of term expansion can be multiplicative, +and we want to avoid using excessive memory. The default of 100 000 should +be both high enough in most cases and compatible with current typical +hardware configurations. +.TP +.BI "nonumbers = " 0/1 +If this set to true, no terms will be generated for numbers. For example +"123", "1.5e6", 192.168.1.4, would not be indexed ("value123" would still +be). Numbers are often quite interesting to search for, and this should +probably not be set except for special situations, ie, scientific documents +with huge amounts of numbers in them. This can only be set for a whole +index, not for a subtree. +.TP +.BI "nocjk = " boolean +If this set to true, specific east asian (Chinese Korean Japanese) +characters/word splitting is turned off. This will save a small amount of +cpu if you have no CJK documents. If your document base does include such +text but you are not interested in searching it, setting +.I nocjk +may be a significant time and space saver. +.TP +.BI "cjkngramlen = " value +This lets you adjust the size of n-grams used for indexing CJK text. The +default value of 2 is probably appropriate in most cases. A value of 3 +would allow more precision and efficiency on longer words, but the index +will be approximately twice as large. +.TP +.BI "indexstemminglanguages = " languages +A list of languages for which the stem expansion databases will be +built. See recollindex(1) for possible values. +.TP +.BI "defaultcharset = " charset +The name of the character set used for files that do not contain a +character set definition (ie: plain text files). This can be redefined for +any subdirectory. +.TP +.BI "unac_except_trans = " "list of utf-8 groups" +This is a list of characters, encoded in UTF-8, which should be handled +specially when converting text to unaccented lowercase. For example, in +Swedish, the letter "a with diaeresis" has full alphabet citizenship and +should not be turned into an a. +.br +Each element in the space-separated list has the special character as first +element and the translation following. The handling of both the lowercase +and upper-case versions of a character should be specified, as appartenance +to the list will turn-off both standard accent and case processing. +.br +Note that the translation is not limited to a single character. +.br +This parameter cannot be redefined for subdirectories, it is global, +because there is no way to do otherwise when querying. If you have document +sets which would need different values, you will have to index and query +them separately. +.TP +.BI "maildefcharset = " character set name +This can be used to define the default character set specifically for email +messages which don't specify it. This is mainly useful for readpst (libpst) +dumps, which are utf-8 but do not say so. +.TP +.BI "localfields = " "fieldname = value:..." +This allows setting fields for all documents under a given +directory. Typical usage would be to set an "rclaptg" field, to be used in +mimeview to select a specific viewer. If several fields are to be set, they +should be separated with a colon (':') character (which there is currently +no way to escape). Ie: localfields= rclaptg=gnus:other = val, then select +specifier viewer with mimetype|tag=... in mimeview. +.TP +.BI "dbdir = " directory +The name of the Xapian database directory. It will be created if needed +when the database is initialized. If this is not an absolute pathname, it +will be taken relative to the configuration directory. +.TP +.BI "idxstatusfile = " "file path" +The name of the scratch file where the indexer process updates its +status. Default: idxstatus.txt inside the configuration directory. +.TP +.BI "maxfsoccuppc = " percentnumber +Maximum file system occupation before we +stop indexing. The value is a percentage, corresponding to +what the "Capacity" df output column shows. The default +value is 0, meaning no checking. +.TP +.BI "mboxcachedir = " "directory path" +The directory where mbox message offsets cache files are held. This is +normally $RECOLL_CONFDIR/mboxcache, but it may be useful to share a +directory between different configurations. +.TP +.BI "mboxcacheminmbs = " "value in megabytes" +The minimum mbox file size over which we cache the offsets. There is really no sense in caching offsets for small files. The default is 5 MB. +.TP +.BI "webcachedir = " "directory path" +This is only used by the Beagle web browser plugin indexing code, and +defines where the cache for visited pages will live. Default: +$RECOLL_CONFDIR/webcache +.TP +.BI "webcachemaxmbs = " "value in megabytes" +This is only used by the Beagle web browser plugin indexing code, and +defines the maximum size for the web page cache. Default: 40 MB. +.TP +.BI "idxflushmb = " megabytes +Threshold (megabytes of new text data) +where we flush from memory to disk index. Setting this can +help control memory usage. A value of 0 means no explicit +flushing, letting Xapian use its own default, which is +flushing every 10000 documents (or XAPIAN_FLUSH_THRESHOLD), meaning that +memory usage depends on average document size. The default value is 10. +.TP +.BI "autodiacsens = " 0/1 +IF the index is not stripped, decide if we automatically trigger diacritics +sensitivity if the search term has accented characters (not in +unac_except_trans). Else you need to use the query language and the D +modifier to specify diacritics sensitivity. Default is no. +.TP +.BI "autocasesens = " 0/1 +IF the index is not stripped, decide if we automatically trigger character +case sensitivity if the search term has upper-case characters in any but +the first position. Else you need to use the query language and the C +modifier to specify character-case sensitivity. Default is yes. +.TP +.BI "loglevel = " value +Verbosity level for recoll and recollindex. A value of 4 lists quite a lot of +debug/information messages. 3 lists only errors. +.B daemloglevel +can be used to specify a different value for the real-time indexing daemon. +.TP +.BI "logfilename = " file +Where should the messages go. 'stderr' can be used as a special value. +.B daemlogfilename +can be used to specify a different value for the real-time indexing daemon. +.TP +.BI "mondelaypatterns = " "list of patterns" +This allows specify wildcard path patterns (processed with fnmatch(3) with +0 flag), to match files which change too often and for which a delay should +be observed before re-indexing. This is a space-separated list, each entry +being a pattern and a time in seconds, separated by a colon. You can use +double quotes if a path entry contains white space. Example: +.sp +mondelaypatterns = *.log:20 "this one has spaces*:10" +.TP +.BI "monixinterval = " "value in seconds +Minimum interval (seconds) for processing the indexing queue. The real time +monitor does not process each event when it comes in, but will wait this +time for the queue to accumulate to diminish overhead and in order to +aggregate multiple events to the same file. Default 30 S. +.TP +.BI "monauxinterval = " "value in seconds +Period (in seconds) at which the real time monitor will regenerate the +auxiliary databases (spelling, stemming) if needed. The default is one +hour. +.TP +.BI "monioniceclass, monioniceclassdata" +These allow defining the ionice class and data used by the indexer (default +class 3, no data). +.TP +.BI "filtermaxseconds = " "value in seconds" +Maximum filter execution time, after which it is aborted. Some postscript +programs just loop... +.TP +.BI "filtersdir = " directory +A directory to search for the external filter scripts used to index some +types of files. The value should not be changed, except if you want to +modify one of the default scripts. The value can be redefined for any +subdirectory. +.TP +.BI "iconsdir = " directory +The name of the directory where +.B recoll +result list icons are stored. You can change this if you want different +images. +.TP +.BI "idxabsmlen = " value +Recoll stores an abstract for each indexed file inside the database. The +text can come from an actual 'abstract' section in the document or will +just be the beginning of the document. It is stored in the index so that it +can be displayed inside the result lists without decoding the original +file. The +.I idxabsmlen +parameter defines the size of the stored abstract. The default value is 250 +bytes. The search interface gives you the choice to display this stored +text or a synthetic abstract built by extracting text around the search +terms. If you always prefer the synthetic abstract, you can reduce this +value and save a little space. +.TP +.BI "aspellLanguage = " lang +Language definitions to use when creating the aspell dictionary. The value +must match a set of aspell language definition files. You can type "aspell +config" to see where these are installed (look for data-dir). The default +if the variable is not set is to use your desktop national language +environment to guess the value. +.TP +.BI "noaspell = " boolean +If this is set, the aspell dictionary generation is turned off. Useful for +cases where you don't need the functionality or when it is unusable because +aspell crashes during dictionary generation. +.TP +.BI "mhmboxquirks = " flags +This allows definining location-related quirks for the mailbox +handler. Currently only the tbird flag is defined, and it should be set for +directories which hold Thunderbird data, as their folder format is weird. + +.SH SEE ALSO +.PP +recollindex(1) recoll(1) diff --git a/src/doc/man/recollindex.1 b/src/doc/man/recollindex.1 new file mode 100644 index 00000000..1e9d618a --- /dev/null +++ b/src/doc/man/recollindex.1 @@ -0,0 +1,293 @@ +.\" $Id: recollindex.1,v 1.7 2008-09-05 10:25:54 dockes Exp $ (C) 2005 J.F.Dockes\$ +.TH RECOLLINDEX 1 "8 January 2006" +.SH NAME +recollindex \- indexing command for the Recoll full text search system +.SH SYNOPSIS +.B recollindex \-h +.br +.B recollindex +[ +.B \-c + +] +[ +.B \-z|\-Z +] +[ +.B \-k +] +.br +.B recollindex +[ +.B \-c + +] +.B \-m +[ +.B \-w + +] +[ +.B \-D +] +[ +.B \-x +] +[ +.B \-C +] +[ +.B \-n|-k +] +.br +.B recollindex +[ +.B \-c + +] +.B \-i +[ +.B \-Z +] +[ +.B \-k +] +[ +.B \-f +] +[] +.br +.B recollindex +[ +.B \-c + +] +.B \-r +[ +.B \-Z +] +[ +.B \-f +] + +.br +.B recollindex +[ +.B \-c + +] +.B \-e +[] +.br +.B recollindex +[ +.B \-c + +] +.B \-l +.br +.B recollindex +[ +.B \-c + +] +.B \-s + +.br +.B recollindex +[ +.B \-c + +] +.B \-S +.br +.B recollindex +[ +.B \-c + +] +.B \-E + +.SH DESCRIPTION +The +.B recollindex +utility allows you to perform indexing operations for the Recoll text +search system. +.PP +As indexing can sometimes take a long time, the command can be interrupted +by sending an interrupt (Ctrl-C, SIGINT) or terminate (SIGTERM) +signal. Some time may elapse before the process exits, because it needs to +properly flush and close the index. This can also be done from the recoll +GUI (menu entry: File/Stop_Indexing). After such an interruption, the index +will be somewhat inconsistent because some operations which are normally +performed at the end of the indexing pass will have been skipped (for +example, the stemming and spelling databases will be inexistant or out of +date). You just need to restart indexing at a later time to restore +consistency. The indexing will restart at the interruption point (the full +file tree will be traversed, but files that were indexed up to the +interruption and for which the index is still up to date will not need to +be reindexed). +.PP +The +.B \-c +option specifies the configuration directory name, overriding the +default or $RECOLL_CONFDIR. +.PP +There are several modes of operation. +.PP +The normal mode will index the set of files described in the configuration +file +.B recoll.conf. +This will incrementally update the database with files that changed since +the last run. If option +.B \-z +is given, the database will be erased before starting. If option +.B \-Z +is given, the database will not be reset, but all files will be considered +as needing reindexing (in place reset). +.PP +As of version 1.21, +.B recollindex +usually does not process again files which previously failed to index (for +example because of a missing helper program). If option +.B \-k +is given, +.B recollindex +will try again to process all failed files. Please note that +.B recollindex +may also decide to retry failed files if the auxiliary checking script +defined by the "checkneedretryindexscript" configuration variable indicates +that this should happen. +.PP +If option +.B +\-m +is given, recollindex is started for real time monitoring, using the +file system monitoring package it was configured for (either fam, gamin, or +inotify). This mode must have been explicitly configured when building the +package, it is not available by default. The program will normally detach +from the controlling terminal and become a daemon. If option +.B +\-D +is given, it will stay in the foreground. Option +.B +\-w + can be used to specify that the program should sleep for the +specified time before indexing begins. The default value is 60. The daemon +normally monitors the X11 session and exits when it is reset. +Option +.B +\-x +disables this X11 session monitoring (daemon will stay alive even if it +cannot connect to the X11 server). You need to use this too if you use the +daemon without an X11 context. You can use option +.B +\-n +to skip the initial incrementing pass which is normally performed before +monitoring starts. Once monitoring is started, the daemon normally monitors +the configuration and restarts from scratch if a change is made. You can +disable this with option +.B +\-C +.PP +.B recollindex \-i +will index individual files into the database. The stem expansion and +aspell databases will not be updated. The skippedPaths and skippedNames +configuration variables will be used, so that some files may be +skipped. You can tell recollindex to ignore skippedPaths and skippedNames +by setting the +.B +\-f +option. This allows fully custom file selection for a given subtree, +for which you would add the top directory to skippedPaths, and use any +custom tool to generate the file list (ie: a tool from a source code +control system). +.PP +.PP +.B recollindex \-e +will erase data for individual files from the database. The stem expansion +databases will not be updated. +.PP +With options +.B \-i +or +.B \-e +, if no file names are given on the command line, they +will be read from stdin, so that you could for example run: +.PP +find /path/to/dir \-print | recollindex \-e +.PP +followed by +.PP +find /path/to/dir \-print | recollindex \-i +.PP +to force the reindexing of a directory tree (which has to exist inside the +file system area defined by +.I topdirs +in recoll.conf). You could mostly accomplish the same thing with +.PP +.B find /path/to/dir \-print | recollindex \-f \-Z +.PP +.B recollindex \-r +mostly works like \-i, but the parameter is a single directory, which will +be recursively updated. This mostly does nothing more than +.B find topdir | recollindex \-i +but it may be more convenient to use when started from another program. +.PP +.B recollindex \-l +will list the names of available language stemmers. +.PP +.B recollindex \-s +will build the stem expansion database for a given language, which may or +may not be part of the list in the configuration file. If the language is +not part of the configuration, the stem expansion database will be deleted +at the end of the next normal indexing run. You can get the list of stemmer +names from the +.B recollindex \-l +command. Note that this is mostly for experimental use, the normal way to +add a stemming language is to set it in the configuration, either by +editing "recoll.conf" or by using the GUI indexing configuration dialog. +.br +At the time of this writing, the following languages +are recognized (out of Xapian's stem.h): +.IP \(bu +danish +.IP \(bu +dutch +.IP \(bu +english Martin Porter's 2002 revision of his stemmer +.IP \(bu +english_lovins Lovin's stemmer +.IP \(bu +english_porter Porter's stemmer as described in his 1980 paper +.IP \(bu +finnish +.IP \(bu +french +.IP \(bu +german +.IP \(bu +italian +.IP \(bu +norwegian +.IP \(bu +portuguese +.IP \(bu +russian +.IP \(bu +spanish +.IP \(bu +swedish +.PP +.B recollindex \-S +will rebuild the phonetic/orthographic index. This feature uses the +.B aspell +package, which must be installed on the system. +.PP +.B recollindex \-E +will check the configuration file for topdirs and other relevant paths +existence (to help catch typos). + +.SH SEE ALSO +.PP +recoll(1) recoll.conf(5) diff --git a/src/doc/man/recollq.1 b/src/doc/man/recollq.1 new file mode 100644 index 00000000..c698284f --- /dev/null +++ b/src/doc/man/recollq.1 @@ -0,0 +1,148 @@ +.\" $Id: recollq.1,v 1.1 2007-11-13 10:07:35 dockes Exp $ (C) 2005 J.F.Dockes\$ +.TH RECOLLQ 1 "13 November 2007" +.SH NAME +recollq \- command line / standard output Recoll query command. +.SH SYNOPSIS +.B recollq +[ +.B \-c + +] +[ +.B \-o +| +.B \-f +| +.B \-a +] +[ +.B \-b +] +[ +.B \-d +] +[ +.B \-A +] +[ +.B \-e +] +[ +.B \-m +] +[ +.B \-n +<[first-]cnt> +] +[ +.B \-Q +] +[ +.B \-s + +] +[ +.B \-S + +] +[ +.B \-D +] +[ +.B \-i + +] +[ +.B \-F + +] + + +.B recollq \-P + +.SH DESCRIPTION +The +.B recollq +command will execute the Recoll query specified on the command line and +print the results to the standard output. It is primarily designed for +diagnostics, or piping the data to some other program. The basic format and +its variations can be useful for command line querying. The \-F option +should exclusively be used for using the output data in another program, as +it is the only one for which output is guaranteed to be fully parseable. +.PP +The +.B \-c +option specifies the configuration directory name, overriding the +default or $RECOLL_CONFDIR. +.PP +The query string is built by concatenating all arguments found at the end +of the command line (after the options). It will be interpreted by default +as a query language string. Quoting should be used as needed to escape +characters that might be interpreted by the shell (ie: wildcards). +.B \-a +is specified, the query string will be interpreted as an +.I all words +simple search query. If +.B \-o +is specified, the query string will be interpreted as an +.I any word +simple search query. If +.B \-f +is specified, the query string will be interpreted as a +.I file name +simple search query. +.PP +.B \-b +(basic) can be specified to only print the result urls in the output +stream. +.PP +If +.B \-d +is set, the text for the result files contents will be dumped to stdout. +.PP +If +.B \-m +is set, the whole metadata array will be dumped for each document. +.PP +If +.B \-A +is set, the document abstracts will be printed. +.PP +.B \-S + +sorts the results according to the specified field. Use +.B \-D +for descending order. +.PP +.B \-n + +can be used to set the maximum number of results that should be +printed. The default is 2000. Use a value of 0 for no limit. +.PP +.B \-s + +selects the word stemming language. The value should match an existing +stemming database (as set in the configuration or added with recollindex \-s). +.PP +.B \-i + +adds the specified Xapian index to the set used for the query. Can be +specified multiple times. +.PP +.B \-F + +should be used for piping the data to another program. After 2 initial +lines showing the actual query and the estimated result counts, it will +print one line for each result document. Each line will have +exactly the fields requested on the command line. Fields are encoded in +base64 and separated by one space character. Empty fields are indicated by +consecutive space characters. There is one additional space character at +the end of each line. +.PP +.B recollq \-P +(Period) will print the minimum and maximum modification years for +documents in the index. + +.SH SEE ALSO +.PP +recollindex(1) recollq(1) recoll.conf(5) diff --git a/src/doc/prog/Doxyfile b/src/doc/prog/Doxyfile new file mode 100644 index 00000000..d57dced8 --- /dev/null +++ b/src/doc/prog/Doxyfile @@ -0,0 +1,1212 @@ +# Doxyfile 1.4.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Recoll + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the progam writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../src top.txt filters.txt + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = .moc .ui + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = docprog_html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/src/doc/prog/Makefile b/src/doc/prog/Makefile new file mode 100644 index 00000000..926acf16 --- /dev/null +++ b/src/doc/prog/Makefile @@ -0,0 +1,5 @@ +documentation: + doxygen Doxyfile +clean: + rm -f docprog_html/* + diff --git a/src/doc/prog/filters.txt b/src/doc/prog/filters.txt new file mode 100644 index 00000000..67cff502 --- /dev/null +++ b/src/doc/prog/filters.txt @@ -0,0 +1,47 @@ +/*!@filters + +\page filters About filters + +\section filtintro Overview + +Before a document can be processed either for indexing or previewing, it +must be translated into an internal common format. + +The MimeHandler class defines the virtual interface for filters. There are +derived classes for text, html (MimeHandlerHtml), and mail folders +(MimeHandlerMail) + +There is also a derived class (MimeHandlerExec) that will execute an +external program to translate the document to simple html (to be further +processed by MimeHandlerHtml). + +To extend Recoll for a new document type, you may either subclass the +MimeHandler class (look at one of the existing subclasses), or write an +external filter, which will probably be the simpler solution in most cases. + +\section extfilts External filters + +Filters are programs (usually shell scripts) that will turn a document of +foreign type into something that Recoll can understand. HTML was chosen as +a pivot format for its ability to carry structured information. + +The meta-information tags that Recoll will use at the moment are the +following: + + - title + - charset + - keywords + - description + +For an example, you can take a look at the rclsoff filter which translates +openoffice documents. + +The filter is executed with the input file name as a parameter and should +output the result to stdout. + +\section extassoc Associating a filter to a mime type + +This is done in the mimeconf configuration file. Take a look at the file, +the format is self-explanatory. + +*/ diff --git a/src/doc/prog/top.txt b/src/doc/prog/top.txt new file mode 100644 index 00000000..becb8c3b --- /dev/null +++ b/src/doc/prog/top.txt @@ -0,0 +1,20 @@ +/*!@mainpage Recoll: A personal/desktop text-search program +\author email address: jfd@recoll.org + +\section intro Introduction + +Home page: http://www.recoll.org + +This is the documentation for Recoll, a personal text search tool. Recoll +is written in C++, has a QT-based gui and uses the
Xapian full text search engine. + +Recoll supports a number of document types, the decoding of which is either +performed with internal code or an externally executed, program. + +It should be relatively easy to write a new filter for some yet unsupported +file type, and the documentation for this is found here: Writing input filters + +*/ + diff --git a/src/doc/user/00README.txt b/src/doc/user/00README.txt new file mode 100644 index 00000000..892a3b85 --- /dev/null +++ b/src/doc/user/00README.txt @@ -0,0 +1,30 @@ += Building the Recoll user manual + +The Recoll user manual used to be written in DocBook SGML and used the +FreeBSD doc toolchain to produce the output formats. This had the advantage +of an easy way to produce all formats including a PDF manual, but presented +two problems: + + - Dependancy on the FreeBSD platform. + - No support for UTF-8 (last I looked), only latin1. + +The manual is now compatible with XML. There is a small script that +converts the SGML (but XML-compatible) manual into XML (changes the header, +mostly). The SGML version is still the primary one. + +Beyond fixing a few missing closing tags, the main change that had to be +made was to make the anchors explicitly upper-case because the SGML +toolchain converts them to upper-case and the XML one does not, so the only +way to have compatibility is to make them upper-case in the first place. + +We initially had a problem for producing the PDF manual, which motivated +keeping the SGML version for producing the PDF with the FreeBSD SGML +toolchain. This problem is now solved with dblatex, so that the SGML +version now has little reason to persist and it will go away at some point +in the future. + +Asciidoc would also be a candidate as the source format, because it can +easily produce docbook, so the future will probably be: + +asciidoc->docbook-xml-> html + -> pdf diff --git a/src/doc/user/Makefile b/src/doc/user/Makefile new file mode 100644 index 00000000..cf7c057f --- /dev/null +++ b/src/doc/user/Makefile @@ -0,0 +1,38 @@ +# Wherever docbook.xsl and chunk.xsl live +# Fbsd +#XSLDIR="/usr/local/share/xsl/docbook/" +# Mac +#XSLDIR="/opt/local/share/xsl/docbook-xsl/" +#Linux +XSLDIR="/usr/share/xml/docbook/stylesheet/docbook-xsl/" + + +# Options common to the single-file and chunked versions +commonoptions=--stringparam section.autolabel 1 \ + --stringparam section.autolabel.max.depth 3 \ + --stringparam section.label.includes.component.label 1 \ + --stringparam autotoc.label.in.hyperlink 0 \ + --stringparam abstract.notitle.enabled 1 \ + --stringparam html.stylesheet docbook-xsl.css \ + --stringparam generate.toc "book toc,title,figure,table,example,equation" + + +all: usermanual.html index.html usermanual.pdf + +usermanual.html: usermanual.xml + xsltproc ${commonoptions} \ + -o tmpfile.html "${XSLDIR}/html/docbook.xsl" usermanual.xml + -tidy -indent tmpfile.html > usermanual.html + rm -f tmpfile.html + +index.html: usermanual.xml + xsltproc ${commonoptions} \ + --stringparam use.id.as.filename 1 \ + --stringparam root.filename index \ + "${XSLDIR}/html/chunk.xsl" usermanual.xml + +usermanual.pdf: usermanual.xml + dblatex usermanual.xml + +clean: + rm -f RCL.*.html usermanual.pdf usermanual.html index.html tmpfile.html diff --git a/src/doc/user/docbook-xsl.css b/src/doc/user/docbook-xsl.css new file mode 100644 index 00000000..8cc0a8b2 --- /dev/null +++ b/src/doc/user/docbook-xsl.css @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2001, 2003, 2010 The FreeBSD Documentation Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: doc/share/misc/docbook.css,v 1.15 2010/03/20 04:15:01 hrs Exp $ + */ + +body address { + line-height: 1.3; + margin: .6em 0; +} + +body blockquote { + margin-top: .75em; + line-height: 1.5; + margin-bottom: .75em; +} + +html body { + margin: 1em 8% 1em 10%; + line-height: 1.2; +} + +.legalnotice { + font-size: small; + font-variant: small-caps; +} + +body div { + margin: 0; +} + +dl { + margin: .8em 0; + line-height: 1.2; +} + +body form { + margin: .6em 0; +} + +h1, h2, h3, h4, h5, h6, +div.example p b, +.question, +div.table p b, +div.procedure p b { + color: #990000; +} + +body h1, body h2, body h3, body h4, body h5, body h6 { + line-height: 1.3; + margin-left: 0; +} + +body h1, body h2 { + margin: .8em 0 0 -4%; +} + +body h3, body h4 { + margin: .8em 0 0 -3%; +} + +body h5 { + margin: .8em 0 0 -2%; +} + +body h6 { + margin: .8em 0 0 -1%; +} + +body hr { + margin: .6em; + border-width: 0 0 1px 0; + border-style: solid; + border-color: #cecece; +} + +body img.navheader { + margin: 0 0 0 -4%; +} + +ol { + margin: 0 0 0 5%; + line-height: 1.2; +} + +body pre { + margin: .75em 0; + line-height: 1.0; + font-family: monospace; +} + +body td, body th { + line-height: 1.2; +} + +ul, body dir, body menu { + margin: 0 0 0 5%; + line-height: 1.2; +} + +html { + margin: 0; + padding: 0; +} + +body p b.application { + color: #000000; +} +body p span.application { + font-weight: bold; + color: #000000; +} + +.filename { + color: #007a00; +} + +.guimenu, .guimenuitem, .guisubmenu, +.guilabel, .interface, +.shortcut, .shortcut .keycap { + font-weight: bold; +} + +.guibutton { + background-color: #cfcfcf; + padding: 2px; +} + +.accel { + background-color: #f0f0f0; + text-decoration: underline; +} + +.screen { + padding: 1ex; +} + +.programlisting { + padding: 1ex; + background-color: #eee; + border: 1px solid #ccc; +} + +@media screen { /* hide from ie3 */ + a[href]:hover { background: #ffa } +} + +blockquote.note { + color: #222; + background: #eee; + border: 1px solid #ccc; + padding: 0.4em 0.4em; + width: 85%; +} + +blockquote.tip { + color: #004f00; + background: #d8ecd6; + border: 1px solid green; + padding: 0.2em 2em; + width: 85%; +} + +blockquote.important { + font-style:italic; + border: 1px solid #a00; + border-left: 12px solid #c00; + padding: 0.1em 1em; +} + +blockquote.warning { + color: #9f1313; + background: #f8e8e8; + border: 1px solid #e59595; + padding: 0.2em 2em; + width: 85%; +} + +.example { + background: #fefde6; + border: 1px solid #f1bb16; + margin: 1em 0; + padding: 0.2em 2em; + width: 90%; +} + +.informaltable table.calstable tr td { + padding-left: 1em; + padding-right: 1em; +} diff --git a/src/doc/user/docbook.css b/src/doc/user/docbook.css new file mode 100644 index 00000000..3d40fa70 --- /dev/null +++ b/src/doc/user/docbook.css @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2001, 2003, 2010 The FreeBSD Documentation Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: doc/share/misc/docbook.css,v 1.15 2010/03/20 04:15:01 hrs Exp $ + */ + +BODY ADDRESS { + line-height: 1.3; + margin: .6em 0; +} + +BODY BLOCKQUOTE { + margin-top: .75em; + line-height: 1.5; + margin-bottom: .75em; +} + +HTML BODY { + margin: 1em 8% 1em 10%; + line-height: 1.2; +} + +.LEGALNOTICE { + font-size: small; + font-variant: small-caps; +} + +BODY DIV { + margin: 0; +} + +DL { + margin: .8em 0; + line-height: 1.2; +} + +BODY FORM { + margin: .6em 0; +} + +H1, H2, H3, H4, H5, H6, +DIV.EXAMPLE P B, +.QUESTION, +DIV.TABLE P B, +DIV.PROCEDURE P B { + color: #990000; +} + +BODY H1, BODY H2, BODY H3, BODY H4, BODY H5, BODY H6 { + line-height: 1.3; + margin-left: 0; +} + +BODY H1, BODY H2 { + margin: .8em 0 0 -4%; +} + +BODY H3, BODY H4 { + margin: .8em 0 0 -3%; +} + +BODY H5 { + margin: .8em 0 0 -2%; +} + +BODY H6 { + margin: .8em 0 0 -1%; +} + +BODY HR { + margin: .6em; + border-width: 0 0 1px 0; + border-style: solid; + border-color: #cecece; +} + +BODY IMG.NAVHEADER { + margin: 0 0 0 -4%; +} + +OL { + margin: 0 0 0 5%; + line-height: 1.2; +} + +BODY PRE { + margin: .75em 0; + line-height: 1.0; + font-family: monospace; +} + +BODY TD, BODY TH { + line-height: 1.2; +} + +UL, BODY DIR, BODY MENU { + margin: 0 0 0 5%; + line-height: 1.2; +} + +HTML { + margin: 0; + padding: 0; +} + +BODY P B.APPLICATION { + color: #000000; +} + +.FILENAME { + color: #007a00; +} + +.GUIMENU, .GUIMENUITEM, .GUISUBMENU, +.GUILABEL, .INTERFACE, +.SHORTCUT, .SHORTCUT .KEYCAP { + font-weight: bold; +} + +.GUIBUTTON { + background-color: #CFCFCF; + padding: 2px; +} + +.ACCEL { + background-color: #F0F0F0; + text-decoration: underline; +} + +.SCREEN { + padding: 1ex; +} + +.PROGRAMLISTING { + padding: 1ex; + background-color: #eee; + border: 1px solid #ccc; +} + +@media screen { /* hide from IE3 */ + a[href]:hover { background: #ffa } +} + +BLOCKQUOTE.NOTE { + color: #222; + background: #eee; + border: 1px solid #ccc; + padding: 0.4em 0.4em; + width: 85%; +} + +BLOCKQUOTE.TIP { + color: #004F00; + background: #d8ecd6; + border: 1px solid green; + padding: 0.2em 2em; + width: 85%; +} + +BLOCKQUOTE.IMPORTANT { + font-style:italic; + border: 1px solid #a00; + border-left: 12px solid #c00; + padding: 0.1em 1em; +} + +BLOCKQUOTE.WARNING { + color: #9F1313; + background: #f8e8e8; + border: 1px solid #e59595; + padding: 0.2em 2em; + width: 85%; +} + +.EXAMPLE { + background: #fefde6; + border: 1px solid #f1bb16; + margin: 1em 0; + padding: 0.2em 2em; + width: 90%; +} + +.INFORMALTABLE TABLE.CALSTABLE TR TD { + padding-left: 1em; + padding-right: 1em; +} diff --git a/src/doc/user/usermanual-italian.html b/src/doc/user/usermanual-italian.html new file mode 100644 index 00000000..d9820c05 --- /dev/null +++ b/src/doc/user/usermanual-italian.html @@ -0,0 +1,3849 @@ + + + + + + + + + + + + + Recoll user manual + + + + + + + + + + + + + + + +
+
+

Recoll: +manuale utente

+ + +

Jean-Francois +Dockes

+ + +
+
+

+ + +
+ + +
+ + + + + +
+
+

Questo documento spiega le nozioni della ricerca testuale e descrive +l'installazione e l'uso di Recoll.

+ + +
+ + +
+ + +
+
+ + +
+
+ + +
Indice
+ + +
1. Introduzione
+ + +
+ +
+ + +
1.1. Per +gli impazienti
+ + +
1.2. Ricerca +a tutto testo
+ + +
1.3. Panoramica +d Recoll
+ + + +
+ + +
+ + +
2. Indicizzazione
+ + +
+ +
+ + +
2.1. Introduzione
+ + +
2.2. Salvare +l'indice
+ + +
+ +
+ + +
2.2.1. Sicurezza
+ + + +
+ + +
+ + +
2.3. Configurazione dell'indicizzazione
+ + +
2.4. Indicizzazione +periodica
+ + +
+ +
+ + +
2.4.1. Iniziare +l'indicizzazione
+ + +
2.4.2. Usare +cron per l'indicizzazione automatica
+ + + +
+ + +
+ + +
2.5. Indicizzazione in tempo +reale
+ + + +
+ + +
+ + +
3. Search
+ + +
+ +
+ + +
3.1. Ricerca +semplice
+ + +
3.2. La +lista dei risultati
+ + +
+ +
+ + +
3.2.1. Il +clic col tasto destro del mouse sulla lista dei risultati
+ + + +
+ + +
+ + +
3.3. La +finestra di preview
+ + +
3.4. Ricerca +complessa/avanzata
+ + +
3.5. Il +terminale di esplorazione
+ + +
3.6. Database +multipli
+ + +
3.7. Storia +dei documenti
+ + +
3.8. Ordinare +i risultati della ricerca
+ + +
3.9. Consigli +per la ricerca, scorciatoie
+ + +
3.10. Personalizzare +l'interfaccia di ricerca
+ + + +
+ + +
+ + +
4. Installazione
+ + +
+ +
+ + +
4.1. Installare +una copia pre-compilata
+ + +
+ +
+ + +
4.1.1. Installazione +con un programma di installazione
+ + +
4.1.2. Installare +un pacchetto Recoll +pre-compilato
+ + + +
+ + +
+ + +
4.2. Pacchetti +esterni utilizzabili
+ + +
4.3. Compilazione +da sorgente
+ + +
+ +
+ + +
4.3.1. Prerequisiti
+ + +
4.3.2. Compilazione
+ + +
4.3.3. Installazione
+ + + +
+ + +
+ + +
4.4. Panoramica +della configurazione
+ + +
+ +
+ + +
4.4.1. File +principale di configurazione
+ + +
4.4.2. Il +file mimemap
+ + +
4.4.3. Il +file mimeconf
+ + +
4.4.4. Il +file mimeview
+ + +
4.4.5. Esempio
+ + + +
+ + +
+ + + +
+ + +
+ + +
+ + +
+ + +
+
+

Capitolo +1. Introduzione

+ + +
+

1.1. Per gli impazienti

+ + +

Se non amate leggere manuali (chi lo ama?) e vorreste provare +subito Recoll, eseguite +allora l'installazione +e lanciate recoll, +che per default inizierà ad indicizzare la vostra home +cartella, permettendovi di fare subito una ricerca non appena il +processo di indicizzazione sarà terminato.

+ + +

Non fate così, però, se la vostra home +cartella +contiene un gran numero di documenti e non avete voglia di aspettare o +avete poco spazio sul disco. In questo caso potrebbe convenirvi di +editare per prima cosa il file di  configurazione per +estringere l'area da indicizzare.

+ + +

Fate inoltre attenzione che potreste dover installare le applicazioni di supporto esterne +per indicizzare quei documenti che le richiedono (ad esempio antiword per documenti +ms-word).

+ + +
+ + +
+
+

1.2. Ricerca a tutto testo

+ + +

Recoll +è un'applicazione per la +ricerca a tutto testo. Le applicazioni di ricerca a tutto testo vi +permettono di trovare ciò che cercate in base al contenuto +dei +files e non al loro nome o estensione. Più in dettaglio vi +lasciano specificare le parole (termini di ricerca) che dovrebbero (o +non dovrebbereo) essere nel testo che cercate e vi ritornano una lista +di documenti che soddisfano tale criterio, ordinati in maniera tale che +quelli più rilevanti appaiano +in cima alla lista.

+ + +

Non hai bisogno di ricordare in che file o e-mail hai scritto +una +certa informazione. Semplicemente chiedi di trovare i termini che ti +interessano e lo strumento ti ritornerà una lista di +documenti +che li conetngono, in modo simile a quello che fa un motore di ricerca +su internet.

+ + +

Recoll cerca di +determinare quali +documenti sono più rilevanti al fine della ricerca dei +termini +inseriti. Gli algritmi che determinano la rilevanza possono essere +molto complessi e in generale sono inferiori alla potenza e +rapidità della mente umana. La qualità nella +determinazione della rilevanza è probabilmente il fattore +più importante di uno strumento di ricerca.

+ + +

In molti casi cercate tutte le forme di una parola, non una +forma +specifica. Queste differenti forme possono includere plurali, diverse +coniugazioni di verbi, o parole derivate da una radice comune +o stem +(ad esempio: floopianor, piani, pianoforte, ripiano...). Recoll per default espande la +ricerca a tutte queste variazioni +parole che hanno in comune la stessa radice o stem). Questa espansione +può essere disabilitata in qualsiasi momento.

+ + +

Lo stemming, per se stesso, non risolve errori di ortografia, +nè può fare ricerche fonetiche. Recoll supporta queste +caratteristiche attraverso uno strumento specifico (il terminale di esplorazione) +che vi lascia esplorare i +termini contenuti nell'indice in differenti maniere.

+ + +
+ + +
+
+

1.3. Panoramica di Recoll

+ + +

Recoll usa la +libreria di ricerca informazioni Xapian + come suo motore di ricerca e indicizzazione. Xapian è un +programma molto maturo che usa un +modello di rilevanza probabilistica molto sofisticato. Recoll provvede l'interfaccia +per indicizzare del sistema ed estrarli in base alla ricerca.

+ + +

In pratica, Xapian +lavora ricordandosi i +termini (parole) contenuti nei vari documenti. Conoscenza acquisita +tramite il procedimento chiamato indicizzazione.

+ + +

L'indice risultante può essere molto grande (a +spanna la +grandezza dei files indicizzati), ma non è un archivio di +documenti. Recoll +può mostrare solo +i documenti che si trovano ancora là dove sono stati +indicizzati. (In effetti esiste un modo per ricostruire un documento +dalle informazioni racchiuse nell'indice, ma il risultato non +è +bello dal momento che il testo è tutto minuscolo e sono +perdute +le informazioni di formattazione).

+ + +

Recoll +immagazzina tutte le informazioni sando il formato Unicode UTF-8 +e può indicizzare files con  un differente set di +caratteri, diverse codifiche e lingue sullo stesso indice. Posside +filtri di ingresso per molteplici tipi di files.

+ + +

Lo stemming dipende dalla lingua del documento. Recoll +immagazzina i termini senza stem e usa database ausiliari per espandere +(stemming) le parole. Può farlo scegliendo tra lingue +diverse o +aggiungendo nuove lingue senza dover rifare l'indice. Immagazzinare +documenti in diverse lingue nello stesso indice è possibile, +e +nella pratica utile, ma può introdurre +possibilità di +confusione. Recoll +attualmente non fa alcun tentativo per riconoscere automaticamente la +lingua.

+ + +

Recoll ha molti +parametri per definire +esattamente ciò che deve indicizzare e come classificare e +decodificare il sorgente dei documenti. Questi parametri sono contenuti +in un file di +configurazione. La configurazione standard è messa +in una cartella standard (normalmente qualcosa come /usr/[local/]share/recoll/examples) +durante l'installazione. I parametri di default possono essere cambiati +con valori da voi scelti e messi nel vostro file di configurazione +personale che deve trovarsi nella cartella .recoll +nella vostra home cartella. Il file di configurazione fornito di +default dovrebbe essere sufficente per indicizzare la vostra home +cartella e permettervi così di provare Recoll, salvo naturalmente +personalizzarlo in seguito.

+ + +

L'indicizzazione +comincia +automaticamente la prima volta che lanciate l'interfaccia grafica di +ricerca di recoll oppure eseguendo il comando recollindex.

+ + +

La ricerca viene +fatta col programma recoll che ha numerose opzioni per farvi trovare +quello che effettivamente state cercando.

+ + +
+ + +
+ + +
+
+

Capitolo +2. Indicizzazione

+ + +
+

2.1. +Introduzione

+ + +

L'indicizzazione è il processo che analizza i +documenti e mette i dati nel database. Il processo di indicizzazione di +Recoll +è normalmente incrementale, vale a dire che i documenti +vengono +analizzati e indicizzati solo se hanno subito modifiche. Alla prima +esecuzione, naturalmente, tutti i documenti vengono analizzati e +indicizzati..Il processo (indicizzazione completa) può +essere +eseguito in seguito specificando un'opzione al comando di +indicizzazione (recollindex +-z).

+ + +

L'indicizzazione con Recoll può essere +fatta con due metodi diversi:

+ + +
    + + +
  • + +
    + +

    Indicizzazione periodica: +l'indicizzazione avviene in tempi prestabiliti, eseguendo il comando recollindex. L'uso tipico +è quello di fare una indicizzazione durante la notte programmando +l'evento con cron.

    + + +
    + + +
  • + + +
  • + +
    + +

    Indicizzazione in tempo reale: +l'indicizzazione avviene non appena un file viene creato o cambiato. In +questo caso recollindex +gira come un  demone e usa il monitoraggio del file-system +fornito da Fam, Gamin o inotify per scoprire gli +eventuali cambiamenti. Monitorare un grosso albero di cartelle +può consumare molte risorse.

    + + +
    + + +
  • + + +
+ + +

La scelta tra i due metodi è principalmente +questione di +preferenze e può essere combinata costruendo indici +diversi (ad esempio: indicizzazione periodica per una grossa +cartella di documenti e indicizzazione in tempo reale per una piccola +home cartella). Monitorare grandi sezioni del disco + può +richiedere risorse significative del sistema senza portare vantaggi +considerevoli.

+ + +

+

+ + +

Recoll riconosce +alcuni differenti tipi di documenti. +I parametri per il riconoscimento dei documenti sono nei files di configurazione. +La maggior parte dei tipi, come l'HTML o i files di un wordprocessor, +sono un unico documento. Altri tipi, come le mail cartelle, possono +contenere molti singoli documenti indicizzati.

+ + +

Recoll processa +files di testo, HTML, +openoffice ed +e-mail internamente. Altri tipi (ad esempio: files postscript, pdf, +ms-word, rtf) richiedono applicazioni esterne per poter essere +processati. La lista di queste applicazioni è nella sezione installazione.

+ + +

Senza ulteriori configurazioni, Recoll +indicizzerà tutti i files della vostra home cartella, usando +i parametri della configurazione di default.

+ + +

In qualche caso potreste essere interessati ad indicizzare +aree +differenti del vostro file system in database separati. Potete farlo +utilizzando la configurazione multipla di cartelle, indicizzando +ciascuna area del file system in uno specifico database. Vedi la sezione su come usare database +multipli per avere maggiori informazione sulla configurazione +e indicizzazione multipla.
+ + +

+ + +
+ + +
+
+

2.2. Salvare l'indice

+ + +

Normalmente la cartella dove viene salvato l'indice +è la sotto cartella xapiandb nella cartella di +configurazione di Recoll, +tipicamente +$HOME/.recoll/xapiandb/. +Questo però può essere cambiato in due modi +differenti (con due differenti scopi):

+ + +
    + + +
  • + +

    Puoi specificare una differente cartella di configurazione +tramite la variabile di ambiente RECOLL_CONFDIR, +oppure usando l'opzione -c +nei comandi di  Recoll. +Questo metodo è usato tipicamente per indicizzare differenti +aree del file system in differenti indici. Per esempio, coi seguenti +comandi:

    + + + +
    export RECOLL_CONFDIR=~/.indexes-email
    recoll

    + + + Recoll +userò il file di configurazione che trova in ~/.indexes-email/ e, (se non +specificato altrimenti in recoll.conf) +cercherà l'indice in in ~/.indexes-email/xapiandb/. +
    + + +
    + + + +

    Usare diverse cartella di configurazionee +diverse  opzioni +di configurazione permette di adattare le configurazioni e +gli indici ai dati presenti nelle varie aree dove volete effettuare le +ricerche.

    + + +
  • + + +
  • + +

    Potete specificare un indirizzo diverso per salvare +l'indice editando il parametro the dbdir +che si trova nel file di configurazione (vedi la  sezione di +configurazione). +Questometodo va usato se vuoi mantenere la cartella di configurazione +nel suo indirizzo di default, ma vuoi mettere l'indice da qualche altra +parte, generalmente per ragioni di spazio.

    + + +
  • + + +
+ + +

La grandezza dell'indice è determinata dal volume +dei +documenti da indicizzare, ma il rapporto può variare molto. +Per +un insieme di documenti normalmente misto il volume dell'indice +è molto vicino a quello dei documenti indicizzati In casi +specifici (ad esempio un insieme di mbox compresse), il volume +dell'indice può essere molto più grande di quello +dei +documenti stessi. Può anche essere molto più +piccolo se +l'insieme di documenti contiene molte immagini e altri dati non +indicizzati (un esempio estremo è dato dai files mp3 dove +solo i +tags vengono indicizzati).

+ + +

Naturalmente immagini, suoni e video non incrementano il +volume +dell'indice, il che ha come conseguenza che, oggi (2006), il volume +dell'indice sarà comunque trascurabile rispetto +all'ammontare +dei dati contenuti nel vostro computer.

+ + +

La cartella contenente l'indice (xapiandb) +contiene solo dati che possono essere ricostruiti in qualsiasi momento +re-indicizzando il tutto, e quindi può essere cancellata +senza +problemi.

+ + +
+
+

2.2.1. Sicurezza

+ + +

L'indice di Recoll +non contiene le copie +dei documenti indicizzati. Ma conyiene abbastanza dati da permettere +una ricostruzione piuttosto completa e comprensibile. +Nel caso vengano indicizzati documenti confidenziali +lìaccesso +alla cartella del database dovrebbe essere limitato.

+ + +

Dalla versione 1.4, Recoll +crea la cartella di configurazione con i permessi 0700 (accessibile +solo per +il proprietario). Visto che bormalmente la cartella del database +è una sub cartella di questa, la protezione dovrebbe essere +sufficenta.

+ + +

Se usi un'altra configurazione dovresti pensare al tipo di +protezione che l'indice dovrebbe avere e settare la cartella +corrispondente e i files con i permessi del caso.

+ + +
+ + +
+ + +
+
+

2.3. Configurazione +dell'indicizzazione

+ + +

Puoi controllare le aree del file system da indicizzare e come +processare i files tramite le variabili nei files +di configurazione di Recoll.

+ + +

Puoi anche usare indici +multipli +definiti da configurazioni separate, normalmente  per separare +indici personali e indici in comune, oppure per avvantaggiarsi +dell'organizzazione dei tuoi dati e aumentare la precisione.

+ + +

La prima volta che lanci recoll, +verrai richiesto se vuoi che recoll costruisca l'indice oppure no. Se +vuoi sistemare la configurazione prima che venga creato l'indice, +clicca ora su Cancel. +Facendo così avrai creato la cartella ~/.recoll contenente +files di configurazione vuoti.

+ + +

La configurazione è documentata all'interno +del  capitolo +installazione +di questo documento, o nella pagina man di recoll.conf(5) man +page. La variabile di maggiore  e immediato interesse +è +probabilmente topdirs, +che determina quali cartelle indicizzare.

+ + +

Le applicazioni esterne necessarie per indicizzare tipi di +files diversi da txt, HTML o email (ad esempio: pdf, +postscript, ms-word...) sono indicate nella sezione pacchetti esterni.

+ + +
+ + +
+
+

2.4. Indicizzazione periodica

+ + +
+

2.4.1.Iniziare +l'indicizzazione

+ + +

L'indicizzazione viene eseguita o tramite il programma recollindex, +o lanciando il thread di indicizzazione dal programma recoll (usa il menu File). Entrambi i modi fanno +uso della variabile RECOLL_CONFDIR +o accettano l'opzione -c confdir +per specificare la cartella di configurazione da usare.

+ + +

Se il programma recoll +non trova alcun indice quando è lanciato, inizia +automaticamente +l'indicizzazione (a meno che non clicchi sul tasto Cancel).

+ + +

E' meglio non interrompere il processo di indicizzazione +perchè facendo così, il più delle +volte, l'indice +viene corrotto. Questo non è un problema serio visto che +tutto +quello che devi fare è cancellare l'indice e riavviare +l'indicizzazione. I files dell'indice sono normalmente nella cartella $HOME/.recoll/xapiandb, che puoi +tranquillamente cancellare se necessario. In alternativa puoi avviare recollindex con +l'opzione -z, opzione che +cancella il database prima di fare l'indicewhich will reset the +database before indexing.

+ + +
+ + +
+
+

2.4.2. Usare cron per +l'indicizzazione automatica

+ + +

Il modo più semplice per avere un'indicizzazione +automatica è usare cron per fare l'indicizzazione ogni +notte. +Ad esempio la seguente linea aggiunta a crontab +esegue l'indicizzazione ogni giorno alle 3:30AM (supponendo +che recollindex sia nel +vostro PATH):

+ + +
30 3 * * * recollindex > /tmp/recolltrace 2>&1
+ + +

Il comando usuale per editare crontabcrontab -e +(che normalmente lancia l'editor vi +per editare crontab). Potreste ovviamente avere strumenti +più sofisticati  nel vostro sistema atti allo scopo.

+ + +
+ + +
+ + +
+
+

2.5. Indicizzazione in tempo +reale

+ + +

L'indicizzazione in tempo reale si ottiene con il comando recollindex -m. Con questa +opzione, recollindex viene +lanciato dal terminele e diventa un demone, +monitorando in continuazione i cambiamenti e tenendo così +aggiornato l'indice.

+ + +

L'indicizzazione in tempo reale viene impostata alla configurazione +del pacchetto (prima della compilazione) con l'opzione --with[out]-fam or --with[out]-inotify. Per default +viene scelto inotify per i sistemi che lo supportano.

+ + +

Lo script rclmon.sh +può essere usato per lanciare e fermare il demone. Si trova +nella cartella examples +di recoll +(normalmente /usr/local/[share/]recoll/examples).

+ + +

Il lancio del demone è normalmente eseguito come +parte della +sessione dell'utente. Ad esempio la mia sessione fuori +moda xdm ha +lo script .xsession +con le seguenti linne alla fine:

+ + +
recollconf=$HOME/.recoll-home
recolldata=/usr/local/share/recoll
RECOLL_CONFDIR=$recollconf $recolldata/examples/rclmon.sh start

fvwm

+ + +

Viene lanciato prima il demone e poil il window-manager, per +il quale la sessione aspetta.

+ + +

Per default il demone di indicizzazione monitorizza lo stato +della +sessione X11 ed esce quando questa finisce (non è necessario +chiuderlo esplicitamente). Il monitoraggio della sessione X11 +può essere disabilitato con l'opzione -x di recollindex.

+ + +

Con KDE, puoi mettere un piccolo script per +lanciare recollindex +-m nella $HOME/.kde/Autostart. +Verrà eseguito ogni volta che inizia la sessione KDE.

+ + +

Esiste un meccanismo simile anche per Gnome (trova lo +strumento per +il controllo della gestione nel menu e usa la linguetta "Startup +programs").

+ + +

Per default, il demone di indicizzazione scrive i suoi +messaggiin un +file dentro la cartella di configurazione (ciò è +controllato dai parametri daemlogfilename e daemloglevel +di configurazione). Puoi naturalmente cambiarli. Il file di log fviene +troncato all'avvio del demone. Se il demone è sempre in +funzione, il file di log può diventare molto grosso a +seconda +del livello di log scelto.

+ + +

Sebbene l'indicizzazione real time sia apprezzabile, +può +causare un alto carico del sistema, ad esempio se cambiano dati come le +e-mail. Probabilmente ti conviene non abilitarla se il tuo sistema +è a corto di risorse. L'indicizzazione periodica +è +sufficente nella maggior parte dei casi.

+ + +
+ + +
+ + +
+
+

Capitolo +3. Ricerca

+ + +

Il programma recoll provvede l'interfaccia +paer la ricerca. Utilizza le librerie QT.

+ + +
+
+

3.1. Ricerca semplice

+ + +
+
    + + +
  1. + +

    Lancia il programma recoll.

    + + +
  2. + + +
  3. + +

    Scegli il modo di reicerca: Qualsiasi +o Tutti o Nome File.

    + + +
  4. + + +
  5. + +

    Entra la/e parola/e da cercare nel campo testo nella parte +superiore della finestra.

    + + +
  6. + + +
  7. + +

    Clicca sul bottone Cerca +o clicca il tasto Enter per +iniziare la ricerca.

    + + +
  8. + + +
+ + +
+ + +

Il modo di default iniziale di ricerca è Qualsiasi. +Questo cercherà quei documenti che contengano qualsiasi +delle +parole cercate (ill documento che ne contiene di più +avrà +maggiore rilevanza). Tutte +mostrerà solo quei documenti che contengono tutte le parole +cercate. Nome File cerca +solo tra i nomi dei files e permette l'uso dei Caratteri Jolly (*, ? +, []).

+ + +

Puoi anche cercare frasi (parole adiacenti in un dato ordine) +racchiudendo tra virgolette le parole di ricerca. Ad esempio: "realtà virtuale".

+ + +

Maiuscole e minuscole non hanno alcuna influenza sulla +ricerca, con +l'unica eccezione che puoi disabilitare lo stemming (ricerca delle +parole che contengono quella data) scrivendo il primo carattere +maiuscolo. Ad esempio: la ricerca di  casa +cercherà anche  caso, case, casi, casato, +casale, ecc., ma la ricerca di Casa cercherà solo casa, con +caratteri maiuscoli o minuscoli (lo stemming può essere +disbilitato globalmente nelle preferenze).

+ + +

Recoll si +ricorda gli ultimi termini di +ricerca. +Per richiamarli puoi usare il combobox della casella di +ricerca. +Tieni però a mente che vengono ricordate solo le parole, ma +non +il modo (Qualsiasi, Tutte, Nome file).

+ + +

I tasti Esc +Space +mentre si sta scrivendo una parola nella ricerca semplice aprono una +finestra con i possibili completamenti della parole. Questi ultimi sono +tratti dalle parole esistenti nel database.

+ + +

Un doppio clic su una parola della lista dei risultati o nella +finestra di visualizzazione inserisce la parola stessa nel campo di +ricerca semplice.

+ + +

Puoi usare la voce di menu Strumenti/Ricerca avanzata +per aprire la finestra di dialogo per ricerche più complesse.

+ + +
+ + +
+
+

3.2. La lista dei risultati

+ + +

Lanciata la ricerca verrà immediatamente mostrata +nella finestra principale la lista dei risultati.

+ + +

Per default, i documenti sono presentati in ordine di +rilevanza (nel +limite in cui il sistema riesce a stimare la rilevanza). Puoi ordinarli +in maniera diversa usando la voce di menu Strumenti / Ordina: scegli +parametri.

+ + +

Se clicchi sul link Preview +di uno dei +risultati si pare una finestra di Visualizzaxione interna col testo del +documento. Un ulteriore clic sul link Preview di un altro risultato, +aprirà una seconda linguetta. Puoi usare  Shift+Click +per forzare l'apertura di una seconda finestra di visualizzazione che +può essere utile per vedere ad esempio due pagine dello +stesso +documento.

+ + +

Cliccando sul link Edit +verrà +aperto un visualizzatore esterno (generalmente il programma che ha +creato il file). Il programma che deve essere aperto viene configurato +attraverso il dialogo di preferenze, oppure editando il file di +configurazione mimeview.

+ + +

I link Preview +e Edit possono non essere +presenti per tutti i risultati. Ciò significa che Recoll +non ha la configurazione necessaria per la visualizzazione di un +determinato tipo di file (che quindi sarà stato indicizzato +solo +per nome), o non sa con quale programma esterno aprirlo. Spesso +ciò può essere sistemato con apposite aggiunte ai +files +di configurazione mimemap e mimeview +(l'ultimo può essere modificato con la finestra di dialogo +delle preferenza).

+ + +

Cliccando sul link Dettagli ricerca nella parte superiore +della +finestra di ricerca verrò mostrata la stringa di ricerca +utilizzata, dopo l'eventuale applicazione dello stemming e/o di altri +processi.

+ + +

Un doppio clic su qualsiasi parola della finestra di +visualizzazione +inserice  tale parola nel campo di ricerca semplice. Un doppio +clic su qualsiasi parola della lista dei risultati avrà lo +stesso risultato.

+ + +

La lsista dei risultati è divisa in pagine (il +numero di +risultati per pagina può essere impostato nelle preferenze). +Passi da una pagina all'altra con i tasti frecce della tastiera oppure +col link a fondo pagina  della lista dei risultati.

+ + +
+
+

3.2.1. Il clic col tasto +destro del mouse sulla lista dei risultati

+ + +

Oltre ai links preview ed edit, puoi ottenere un +menu pop-up menu cliccando col tasto destro su di una linea +della +lista dei risultati. Il menu ha le seguenti voci:

+ + +
    + + +
  • + +

    Preview

    + + +
  • + + +
  • + +

    Edita

    + + +
  • + + +
  • + +

    Copia il nome del file

    + + +
  • + + +
  • + +

    Copia l'Url

    + + +
  • + + +
  • + +

    Trova documenti simili

    + + +
  • + + +
  • + +

    Apri cartella del +documento

    + + +
  • + + +
+ + +

Le voci Preview +e Edita hanno la +stessa funzione dei links corrispondenti. 

+ + +

Le due voci seguenti copiano rispettivamente l'indirizzo e il +nome + o l'url del file nella clipboard per poterli incollare in +un'altra applicazione.

+ + +

La voce Trova documenti simili seleziona +un certo numero di parole rilevanti del documento e le scrive nella +casella di ricerca semplice ed effettua la ricerca per trovare +documenti correlati con quello di partenza.

+ + +La voce Apri cartella del documento apre la cartella ove si trova il +documento (il programma per l'apertura della cartella si imposta nei +files di configurazione. Di default è Rox). +
+ + +
+ + +
+
+

3.3. La finestra di visualizzazione

+ + +

La finestra di visualizzazione si apre cliccando sul +link Preview nella +lista dei risultati.

+ + +

Una successiva richiesta di visualizzazione apre una nuova +linguetta nella finestra di visualizzazione stessa.

+ + +

Eseguendo una nuova ricerca e attivando la finestra di +visualizzazione, se ne aprirà una seconda mentre la prima +resta +aperta fintanto che non venga chiusa.

+ + +

Puoi chiudere una linguetta della finestra di visualizzazione +coi tasti ^W (Ctrl + W) +sulla finestra. Chiudendo l'ultima linguetta chiudi anche la finestra.

+ + +

Naturalmente puoi chiudere la linguetta (e la finestra) col +bottone Chiudi Tab nella parte superiore della finestra stessa.

+ + +

Puoi vedere documenti successivi o precedenti della lista dei +risultati nella finestra di visualizzazione con i tasti Shift+Down +or Shift+Up +(dove Down e Up sono i tasti freccia).

+ + +

La finestra di visualizzazione ha una ricerca interna. Puoi +iniziare +la ricerca scrivendo una slash (/) all'interno del testo o tramite la +casella per la ricerca , immettendo il testo da cercare e premendo il +tasto cerca. Puoi +usare i tasti Seguente +e Precedente per trovare ricorrenze successive o precedenti. Puoi anche +usare il tasto F3, all'interno dell'area di testo, per trovare la +prossima ricorrenza.

+ + +

Se hai immesso dei termini di ricerca e usi i +tasti ^Up/^Down +per passare da un documento all'altro, la ricerca inizia con ogni nuovo +documento. Se il termine di ricerca è trovato, il cursore si +posiziona sulla prima ricorrenza.

+ + +
+ + +
+
Nessuna parola +
    + + +
  • + +

    Tutte le parole.

    + + +
  • + + +
  • + +

    Qualsiasi parola.

    + + +
  • + + +
  • + +

    None of the terms.

    + + +
  • + + +
  • + +

    Questa frase (le parole esatte nell'ordine preciso in +campi numerata).

    + + +
  • + + +
  • + +

    Parole simili (parole in qualsiasi ordine in campi +numerati).condizione

    + + +
  • + + +
  • + +

    Nome del file con Caratteri Jolly.

    + + +
  • + + +
+ + +
+ + +
+ + +

Altri campi possono essere creati cliccando sul bottone +Aggiungi condizione.

+ + +

Tutti i campi saranno tra loro combinati con le clausole AND o +OR. +Tutti i tipi di condizioni, ad eccezione di "Questa frase" e "Parole +simili" accettano un insieme di parole singole e frasi (racchiuse tra +virgolette). L'espansione (Stemming) viene fatta per tutte le parole +che non iniziano con una maiuscola, ma non per le frasi.

+ + +

La ricerca avanzata permette di cercare tra documenti di un +tipo specifico (ad esmpio: solo testo semplice, o testo rtf, o testo/HTML o application/pdf +ecc...). La selzione del tipo di file (mime) può essere +salvata +come default. (il filtro non sarà attivato al lancio di +recoll, +ma la lista sarà presente come era stata salvata).

+ + +

Si può anche restringere la ricerca ad un sotto +insieme delle +cartelle indicizzate. Se questa è un'opzione che usi spesso, +puoi anche pensare a fare diversi indici così da migliorare +la +performance.

+ + +

Per iniziare la ricerca clicca sul bottone Cerca o premi Enter in qualsiasi +campo di ricerca. Il +bottone nella finestra principale esegue sempre e solo una ricerca +semplice.

+ + +

Clicca sul link 'mostra stringa' in alto nella finestra +principale per vedere la stringa di ricerca applicata.

+ + +
+ + +
+
+

3.5. Il terminale di +esplorazione

+ + +

Recoll utilizza +automaticamente +l'espansione dei termini di ricerca ai loro derivati (ad esempio: +plurali/singolare, coniugazioni dei verbi). Ma ci sono altri casi in +cui l'estto termine di ricerca non è conosciuto. Ad esempio +potresti ricordarti la pronincia ma non come il termine viene scritto, +oppure conoscere solamente l'inizio della parola da cercare.

+ + +

Il terminale di esplorazione (lanciato tramite la sua piccola +icona nella finestra principale o dal menu 'Strumenti') +può essere usato per le ricerche nell'indice del + database. Ha tre modi operativi:

+ + +
+
+ + +
Caratteri Jolly
+ + +
+ +

In questo modo operativo si possono usare stringhe con +caratteri jolly (*, +?). ad esempio: xapi* +.

+ + +
+ + +
Espressioni regolari
+ + +
+ +

In questa modalità sono accettate le +espressioni regolari. Esempio: word[0-9]+ +.

+ + +
+ + +
Espansione grammaticale
+ + +
+ +

Questa modalità esegue la normale espansione +(stemming). +In questo senso è utile per mostrare il suo funzionamento.

+ + +
+ + +
Ortografia/Fonetica
+ + +
+ +

In questa modalità si inserisce il termine come +si pensa sia scritto e Recoll +farà del suo meglio per trovare termini inseriti nel suo +indice che suonino simili. Questa modalità usa Aspell, +che quindi deve essere installata sul vostro sistema +affinchè le +cose funzionino per il verso giusto. La lingua usata nella costruzione +del dizionario (cosa che avviene alla fine dell'indicizzazione) +è quella di sistema. Cose strane possono accadere se +più +lingue sono mischiate.

+ + +
+ + +
+ + +
+ + +

Nota che nel caso Recoll +non conosca l'inizio della parola da cercare(ad esempio un carattere +jolly come *asa), +l'espansione può richiedere un certo tempo perchè +la +ricercaviene fatta sull'indice completo. L'espansione al momento +è limitata ai primi 200 risultati nel caso di caratteri +jolly o +espressioni regolari.

+ + +

Un doppio clic su di un termine nella lista dei risultati lo +inserisce nella casella della ricerca semplice nella finestra +principale. Si può naturalmente nche copiare e incollare tra +la +lista dei risultati e la casella di ricerca.

+ + +
+ + +
+
+

3.6. Database multipli

+ + +

Database e indici multipli di Recoll +dpossono essere creati usando differenti cartelle di configurazione che +conterranno di norma differenti indici per differenti aree del file +system. Un indice specifico può essere selezionato per +aggiornarlo o per effettuare una ricerca usando la variabile di +sistema RECOLL_CONFDIR +oppure lìopzione -c +di recoll e recollindex.

+ + +

Una istanza di recollindex +può aggiornare o indicizzare solo un indice specifico.

+ + +

Una istanza di recoll +è anche associata ad un indice specifico, che è +quello +che viene aggiornato, ma si possono usare più indici +di Recoll per la +ricerca. Gli indici esterni possono essere selezionati tramite la +linguetta Indici esterni nel dialogo delle preferenze.

+ + +

La selezione dell'indice viene fatta in due fasi Un set di +indici +utilizzabili deve essere prima definito, e dopo si può +indicare +un sotto insieme di indici da usare per la ricerca. Naturalmente questi +parametri sono conservati da una esecuzione del programma ad un'altra +(sono registrati separatamente per ogni configurazione di Recoll). Il set di tutti gli +indici è generalmente fisso, mentre l'indice attivo viene +probabilmente cambiato frequentemente.

+ + +

L'indice principale (definito da RECOLL_CONFDIR) +è sempre attivo. +Se ciò non è desiderabile, puoi far sì +che la tua +configurazione punti all'indicizzazione di una cartella vuota.

+ + +

Poichè costruire tutti gli indici può +essere noioso se +fatto dall'interfaccia grafica si può usare la variabile di +sistema RECOLL_EXTRA_DBS +per costruire il set +iniziale. Questo lo fa normalmente l'amministratore del sistema +così che non debba farlo ogni utente. La variabile dovrebbe +definire una lista separata da due punti delle cartelle da indicizzare. +Ad esempio:

+ + +
export RECOLL_EXTRA_DBS=/qualche/cartella/xapiandb:/qualche/altra/db
+ + +

Un tipico scenario d'uso per gli indici multipli per un +amministratore potrebbe essere la creazione di un indice di dati comuni +su cui tu potresti fare una ricerca e un indice per i tuoi dati +personali. Naturalmente ci sono altre possibilità. +Ci sono molti casi in cui conosci il sotto insieme di cartelle che devi +esaminare per trovare il risultato e quindi , restringendo il campo di +ricerca, è possibile aumentare l'efficenza e la precisione +della +ricerca stessa. Ciò può essere fatto anche con +l'opzione +che limita le cartelle su cui si effettua la ricerca nella finestra +della ricerca avanzata, ma l'indicizzazione multipla può +aumentare la performance e valere la pena di essere provata.

+ + +
+ + +
+
+

3.7. Storia dei documenti

+ + +

I documenti che hai visto col visualizzatore o con un +programma +esterno sono annotati nello storico dei documenti e quindi ricordati. +Puoi vedere la lista dello storico con la voce di menu Strumenti/Storia documenti.

+ + +
+ + +
+
+

3.8. Ordinare il risultato della +ricerca

+ + +

I documenti nella lista dei risultati sono normalmente +ordinati in +base della loro rilevanza. E' possibile specificare un diverso criterio +usano la finestra di dialogo Ordina risultati +(localizzata nel menu Strumenti).

+ + +

Lo strumento ordina un numero di documenti ordinati per +rilevanza in base a determinati criteri. I criteri attualmente sono la data e il tipo mime.

+ + +

La scelta per l'ordinamento resta invariata sino a quando non +viene +cambiata o il programma non viene chiuso. Il tipo di ordinamento +è indicato all'inizio della lista dei risultati.

+ + +
+ + +
+
+

3.9. Consigli per la ricerca, +scorciatoie

+ + +
+

Completamento della parola. I +tasti Esc Spaceifinchè +si sta scrivendo una parola nella casella di ricerca semplice +completano la stessa se essa è unica nel database, +altrimenti +aprono una finestra da cui si pppuò scegliere fra le parole +suggerite.

+ + +
+ + +
+

Prendere nuove parole dalla lista dei risultati o +dalla finestra di visualizzazione. +Un doppio clic su una parola nella lista dei risultati o nel testo +della finestra di visualizzazionie copia la stessa nella casella di +ricerca semplice.

+ + +
+ + +
+

Disabilitare l'espansione (stemming). +Scrivendo una parola nella casella di ricerca con la prima lettera +maiuscola disabilita l'espansione (nessuna ricerca per casino +se hai inserito Casa). +Questo è l'unico caso in cui le maiuscole o minuscole hanno +importanza nella ricerca. E' anche possibile eliminare l'espansione +(stemming) o cambiare la lingua nelle preferenze.

+ + +
+ + +
+

Frasi. Per cercare una frase basta +racchiuderla tra virgolette. Esempio: +"user manual" +cercherà per tutte le ricorrenze di 'user' seguito +immediatamente da 'manual'. Puoi anche usare il campo 'Questa frase' +nel dialogo avanzato di ricerca con lo stesso effetto. +Frasi possono essere immesse insieme a parole sia nella casella di +ricerca semplice che nelle caselle della ricerca avanzata, con +escluione della casell 'Questa frase'.

+ + +
+ + +
+

Scorrere la lista dei risultati nella finestra di +visualizzazione (1.5). I tasti  Shift-Down +o Shift-Up (Shift ++una freccia) nella finestra di visualizzazione mostra il documento +successivo o precedente della lista dei risultati. Ogni ricerca +secondaria attualmente attiva verrà eseguita nel nuovo +documento.

+ + +
+ + +
+

Forzare l'apertura di una nuova finestra di +visualizzazione (1.6). Con Shift+Click +sul link Preview +di un risultato della lista dei risultati si apre una nuova finestra di +visualizzazione invece di una nuova linguetta su quella già +visualizzata.

+ + +
+ + +
+

Aggiungi automaticamente frase (1.5). +Questa opzione +può essere impostata nella finestra di configurazione. +Quando +è settata sarà costruita automaticamente una +frase con le +parole della ricerca e aggiunta alla ricerca se è impostata +a +'Qualsiasi parola'I. Ciò non cambia radicalmente il +risultato +della ricerca, ma aumenta la rilevanza per quei documenti dove le +parole cercate costituiscono una frase. ad esempio: cercando le +parole virtual reality +saranno comunque +trovati tutti i documenti contenenti le parole 'virtual', 'reality' o +entrambe, ma in cima alla lista appariranno i documenti, se ci sono, +che contengono la frase 'virtual reality.

+ + +
+ + +
+

Trovare documenti simili. Se nel menu che +appare cliccando +col taso destro nella lista dei risultati si sceglie la voce 'Documenti +simili', un numero di parole 'interessanti' contenute nel documento +selezionato viene messo nella casella di ricerca semplice e viene +avviata una nuova ricerca. In questo modo, eventualmente editando +ulteriormente la casella di ricerca semplice, puoi trovare documenti in +qualche maniera simili o correlati al primo.

+ + +
+ + +
+

Nome file. Durante l'indicizzazione sono +aggiunti anche i nomi dei files. Puoi quindi inserirli come un normale +termine di ricerca (Recoll +indicizzava tutte le cartelle come termini. Questo però +è +stato abbandonato non sembrando molto utilel). In alternativa puoi +usare l'opzione 'Nome file' e la ricerca avverrà +esclusivamente +tra i nomi dei files (in tal caso è possibile usare i +caratteri jolly).

+ + +
+ + +
+

Stringa di ricerca. Puoi vedere la stringa +con cui è +stata effettuata la ricerca, incluse le espansioni e gli operatori +Booleani, cliccando sul link 'mostra stringa' all'inizio della lista +dei risultati.

+ + +
+ + +
+

Chiudere la finestra di visualizzazione. Il +tasto ^W in una linguetta, la +chiude +(e, se questa è l'ultima linguetta, chiude anche la +finestra). Il tasto Esc +chiude tutte le linguette e la finestra di visualizzazione.

+ + +
+ + +
+

Chiudere il programma. Il tast ^Q quasi dappertutto chiude il +programma.

+ + +
+ + +
+ + +
+
+

3.10. Personalizzare l'interfaccia +di ricerca

+ + +

E' possibile personalizzare alcuni aspetti dell'interfaccia di +ricerca usando la voce 'configurazione ricerca' del menu 'Preferenze'.

+ + +

Ci sono due linguette nella finestra di dialogo che riguardano +l'interfaccia stessa e i criteri adottati per la ricerca e la +presentazione dei risultati.

+ + +
+

Interfaccia utente:

+ + +
    + + +
  • + +

    Numero di risultati +per pagina

    + + +
  • + + +
  • + +

    Fonts per la lista dei +risultati: +Ci sono molte informazioni visualizzate nella lista dei risultati e +potresti voler personalizzare i caratteri e la loro dimensioneT. I +caratteri usati da Recoll +sono quelli della tua configurazione di  QT(prova il +comando qtconfig).

    + + +
  • + + +
  • + +

    Stringa di +formattazione dei risultati: +ti permette di cambiare la presentazione di ciascun risultato nella +lista. Usa string del tipo qt-html dove le seguenti sostituzioni, in +modo simile al comando +printf %, vengono fatte:

    + + + +
      + + +
    • + +
      + +

      %A. Riassunto

      + + +
      + + +
    • + + +
    • + +
      + +

      %D. Data

      + + +
      + + +
    • + + +
    • + +
      + +

      %K. Parole chiave (se ci sono)

      + + +
      + + +
    • + + +
    • + +
      + +

      %L. links Preview e Edit

      + + +
      + + +
    • + + +
    • + +
      + +

      %M. Tipo Mime

      + + +
      + + +
    • + + +
    • + +
      + +

      %N. Numero del risultato

      + + +
      + + +
    • + + +
    • + +
      + +

      %R. Rilevanza in %

      + + +
      + + +
    • + + +
    • + +
      + +

      %S. Grandezza

      + + +
      + + +
    • + + +
    • + +
      + +

      %T. Titolo

      + + +
      + + +
    • + + +
    • + +
      + +

      %U. Url

      + + +
      + + +
    • + + + +
    + + +I valori di default value per la stringa sono: + +
    %R %S %L &nbsp;&nbsp;<b>%T</b><br>
    %M&nbsp;%D&nbsp;&nbsp;&nbsp;<i>%U</i><br>
    %A %K

    + + +Puoi provare, ad esempio, la seguente stringa per una lista +più simile all'esperienza del Web: + +
    <u><b><a href="P%N">%T</a></b></u>&nbsp;%R&nbsp;%D<br>
    %A<font color=#B22C1D>%U - %M - %S</font> - %L

    + + +Il formato dei links Preview e Edit è <a +href="Pdocnum"> +and <a href="Edocnum"> +where docnum +è quello che %N dovrebbe stampare. Questo rende il titolo +nel +formato dell'esempio un link per la finestra di visualizzazione.
    + + +
    + + +
  • + + +
  • + +

    Browser HTML: +qui puoi scegliere il browser preferito, che verrà avviato +col menu 'Aiuto' per leggere il manuale utente. Puoi inserire +semplicemente il nome, se il browser è nel tuo path, oppure +l'indirizzo completo.

    + + +
  • + + +
  • + +

    Mostra le icone nella +lista dei risultati: +le icone nella lista dei risultati possono essere disabilitate. Portano +via molta memoria e tutto sommato non contengono informazioni +essenziali.

    + + +
  • + + +
  • + +

    Inizia la ricerca +quando digiti uno spazio: +se lo contrassegni, la ricerca inizia non appena digiti uno spazio +nella casella di ricerca. Questo ti permette di vedere i risultati +prima di immettere una seconda parola. E' disabilitato per default, che +ti piaccia o no...

    + + +
  • + + +
+ + +
+ + +
+ + +
+ + +
+

Parametri di ricerca:

+ + +
    + + +
  • + +

    Lingua +per l'espansione +grammaticale: l'espansione (stemming) dipende evidentemente dalla +lingua. Qui puoi scegliere tra le lingue con cui sono stati costruiti i +database di espansione durante l'indicizzazione (questo viene stabilito +nel  file +principale di configurazione), o pià tardi +aggiunto col comando recollindex +-s +(Vedi il manuale per recollindex). Le lingue di espansione aggiunte +dinamicamente saranno cancellate alla successiva indicizzazione, a meno +che non siano aggiunte al file di configurazione principale.

    + + +
  • + + +
  • + +

    Costruisci +dinamicamente il riassunto: questo decide se Recoll +cerca di costruire un riassunto del documento quando lo mostra nella +lista dei risultati. I riassunti vengono costruiti prendendo +informazioni dal contesto del documento attorno alle parole trovate. +Questo può rallentare la visualizzazione della lista dei +risultati per grossi documenti e, se vuoi, puoi disabilitarlo.

    + + +
  • + + +
  • + +

    Rimpiazza i riassunti +esistenti nel documento: questo decide se costruire un +riassunto al posto un riassunto già esistente nel documento.

    + + +
  • + + +
  • + +

    Numero caratteri per +il riassunto: scegli quello che preferisci...

    + + +
  • + + +
  • + +

    numero di parole +del riassunto per +ogni termine nel documento: quante parole devono essere mostrate +intorno ad ogni ricorrenza trovata nel documento.

    + + +
  • + + +
+ + +
+ + +
+ + +
+ + +
+

Indici +esterni: +Questa linguetta ti permette di navigare eventuali altri indici su cui +vorresti effettuare la ricerca. Gli indici esterni sono assegnati dalla +cartella del loro database (ad esempio: /home/someothergui/.recoll/xapiandb, +/usr/local/recollglobal/xapiandb).

+ + +
+ + +

Una volta scelto, l'indice apparirà nella lista +'Tutti gli +indici', e puoi scegliere quale usare spstandolo alla/dalla lista +'Indici attivi'.

+ + +

Il tuo database (quello della configueazione attuale) +è +sempre implicitamente attivo. Se ciò non è +desiderabile, +puoi sempre fare una configurazione che indicizzi, ad esempio, una +cartella vuota.

+ + +
+ + +
+ + +
+
+

Capitolo +4. Installazione

+ + +
+

4.1. Installare un pacchetto +pre-compilato

+ + +

L'installazione binaria di Recoll è sempre lincata +staticamente alla libreria di xapian , e non ha altre +dipendenze. Devi solo eventualmente installare i  pacchetti esterni per +i tipi di files che vuoi indicizzare diversi da testo, HTML ed e-mail.

+ + +
+
+

4.1.1. Installazione con +un programma di installazione

+ + +

Se usi un sistem del tipo BSD o sistemi che usano pacchetti +pre-compilati (RPM o altri), segui semplicemente le procedure usuali, e +magari dai un'occhiata alla  sezione +di configurazione (anche se non è necessario per +provare il programma con i parametri di default).

+ + +
+ + +
+
+

4.1.2. Installare Recoll +pre-compilato

+ + +

I pacchetti binari sono semplicemente un insieme di cartelle +compresse dove solo le parti utili sono conservate (gli esguibili e la +configurazione di esempio).

+ + +

I binari eseguibili sono compilati con un link statico alla +libreria libxapian e libiconv, tper rendere l'installazione +più semplice(nessuna dipendenza). Questo comunque significa +che +non potete cambiare le versioni che sono state usate.

+ + +

Dopo l'estrazione del file tar, procedi con l'installazione +come se avessi compilato il tutto da sorgente (ciò significa +dare il comando make install). L'albero delle +cartelle va in /usr/local.

+ + +

Puoi inoltre desiderare di installare le applicazioni esterne +necessarie per processare determinati tipi di files (ad esempio: +acrobat, postscript ...). Vedi la prossima sessione.

+ + +

Alla fine, se vuoi, dòà un'occhiata +alla  sezione di +configurazione.

+ + +
+ + +
+ + +
+
+

4.2. Pacchetti esterni +utilizzabili

+ + +

Recollusa +applicazioni esterne per +indicizzare alcuni tipi di files. +Devi quindi installare quelle necessarie ai tipi di files che vuoi +indicizzare (queste sono dipendenze di run-time. Nessuna di queste +applicazioni è necessaria per compilare Recoll):

+ + +
    + + +
  • + +

    Openoffice: è supportato nativamente, ma +necessita del programma unzip, +che quindi deve essere installato.

    + + +
  • + + +
  • + +

    PDF: pdftotext è parte del pacchetto Xpdf.

    + + +
  • + + +
  • + +

    Postscript: pstotext.

    + + +
  • + + +
  • + +

    MS Word: antiword.

    + + +
  • + + +
  • + +

    MS Excel and PowerPoint: catdoc.

    + + +
  • + + +
  • + +

    RTF: unrtf

    + + +
  • + + +
  • + +

    dvi: dvips

    + + +
  • + + +
  • + +

    djvu: DjVuLibre

    + + +
  • + + +
  • + +

    MP3: Recoll +usa il comado id3info del +pacchetto id3lib per estrarre i tag. Senza +questo pacchetto, solo i nomi saranno indicizzati.

    + + +
  • + + +
+ + +

Text, HTML, cartelle e-mail e files Openoffice sono processati +internamente.

+ + +
+ + +
+
+

4.3. Compilare da sorgente

+ + +
+

4.3.1. Prerequisiti

+ + +

Come minimo è necessario scaricare e installare il +pacchetto xapian core (Recoll attualmente usa la +versione 0.attualmente usa le versionidevelopment currently +uses +version 3.3.5, ma qualsiasi versione 3.3 probabilmente è OK).

+ + +

Quasi certamente sarete in grado di trovare un pacchetto +binario per qt +per il vostro sistema, ma probabilmente dovrete compilare Xapian, ma questo non +è difficile (se stai usando FreeBSD, c'è un +port).

+ + +

Ti serve anche libiconv. +Recoll attualmente usa la +versione 1.9 +(questo non dovrebbe essere critico). Sui sistemi Linux, l'interfaccia iconv fa +parte di libc e quindi non dovrebbe essere necessario fare niente di +speciale.

+ + +
+ + +
+
+

4.3.2. Compilazione

+ + +

Recoll +è stato compilato su Linux (redhat7.3, mandriva 2005/6, +Fedora Core 3/4/5, Ubuntu Edgy 64bit), FreeBSD e Solaris 8. Se lo +compili su un altro sistema, Idesidererei +vivamente ricevere eventuali patches.

+ + +

A seconad della configurazione di qt +nel vostro sistema, potreste dover settare le variabili di +sistema QTDIR e QMAKESPECS:

+ + +
    + + +
  • + +

    QTDIR dovrebbe +puntare alla cartell superiore a quella che contiene i files 'include' +di qt (ad esempio: se qt.h +è in /usr/local/qt/include/qt.h, +QTDIR dovrebbe essere /usr/local/qt).

    + + +
  • + + +
  • + +

    QMAKESPECS +dovrebbe puntare ad una delle sotto-cartelle mkspecs di qt (ad esempio: linux-g++).

    + + +
  • + + +
+ + +

Su molti sistemi Linux, QTDIR +è settata dallo script di login, e +QMAKESPECS inon +è becessaria perchè c'è un link +simbolico in mkspecs/.

+ + +
+

Opzioni per configure: --without-aspell +disabilita il codice per la ricerca fonetica. --with-fam +o --with-inotify +abilita il codice per l'indicizzazione in tempo reale real time +indexing. Il supporto inotify è abilitato di default nei +sistemi +Linux recenti.

+ + +
+ + +

Procedura normale:

+ + +
 cd recoll-xxx
configure
make +
+ + +

Piccola auto-configurazione. Lo script di configurazione +essenzialmente linca uno dei files specifici del sistema nella cartella +mk alla cartella mk/sysconf. Se il vostro sistema non è +attualmente conosciuto ve lo dirà e, se volete, potete +copiare e +modificare manualmente uno dei files esistenti (il nome del file +dovrebbe essere il risultato del comando uname -s).

+ + +
+ + +
+
+

4.3.3. Installazione

+ + +

Dai il comado make +install oppure esegui recollinstall +prefix, +nella cartella root. Questo copierà gli eseguibili nella +cartella prefix/bin +e gli esempi di configurazione, +scripts e altri dati nella cartella prefix/share/recoll.

+ + +

Se il prefisso di installazione dato al comando recollinstall +è differente da quello usato eseguendo il comando configure, +dovete settare la variabile di sistema RECOLL_DATADIR +per indicare dove sono i dati comuni.

+ + +

Potete poi procedere alla  configurazione.

+ + +
+ + +
+ + +
+
+

4.4. Panoramica della +configurazione

+ + +

La maggior +parte dei parametri specifici della GUI di Recoll sono +determinati attraverso il menu 'Preferenze'e salvate nlla cartella +standard delle applicazion QT ($HOME/.qt/recollrc). +probabilmnete non hai alcuna necessità di editare tale file.

+ + +

Per altre opzioni, Recoll +usa files di +configurazione testuali. Al momento devi editarli a mano +(c'è +ancora qualche speranza per uno strimento di configurazione grafico in +futuro). La più accurata documentazione per i parametri di +configurazione si trova nei commenti negli stessi files di default e +qui quindi troverai una semplice panoramica.

+ + +

Ci sono due insiemi di files di configurazione. Quelli per la +configurazione generale del sistema si trovano nella cartella /usr/[local/]share/recoll/examples, +e definiscono i valori di default per tutto il sistema. Un insieme +parallelo di files di configurazione esiste nella cartella +.recoll nella tua cartella +home. Questa cartella può essere cambiata con la variabile +di sistema RECOLL_CONFDIR +o con l'opzione -c per recoll +e recollindex.

+ + +

Se la cartella .recoll +non esiste, essa viene creata lanciando la prima volta recoll o recollindex, +e viene riempita con un insieme vuoto di files di configurazione. recoll vi dà la scelta +se editare i files di configurazione prima di iniziare la creazione +dell'indice, recollindex +invece procederà immediatamente.

+ + +

Tutti ifiles di configurazione hanno lo stesso formato. Ad +esempio, +un piccolo estratto del file di configurazione principale +può +essere simile al seguente::

+ + +
 # Space-separated list of directories to index.
topdirs = ~/docs /usr/share/doc

[~/somedirectory-with-utf8-txt-files]
defaultcharset = utf-8

+ + +

Ci sono tre specie di linne:

+ + +
    + + +
  • + +

    Commenti (iniziano con #) o sono vuoti.

    + + +
  • + + +
  • + +

    Settaggio dei parametri (nome = +valore).

    + + +
  • + + +
  • + +

    Definizione delle sezioni ([nome di qualche cartella]).

    + + +
  • + + +
+ + +

La definizione delle sezioni permette di ridefinire alcuni +parametri  per le sotto-cartelle. Restano effettivi +sinchè +viene trovata un'altra definizione di sezione, o si arriva alla fine +del file. Alcuni dei parametri usati per l'indicizzazione sono +considerati partendo dalla cartella attuale e salendo. Non tutti i +parametri possono essere ridefiniti in maniera comprensibile, ma questo +sarà spiegato di seguito nella prossima sezione.

+ + +

La tilde (~) indica l'indirizzo completo della +cartella dell'utente.

+ + +

Spazi vuoti sono usati come separatori nelle liste. Elementi +che +contengono spazi devono pertanto essere racchiusi tra virgolette.

+ + +
+
+

4.4.1. File di +configurazione principale

+ + +

recoll.conf +è il file di configurazione principale Definisce cosa +indicizzareIt  (cartella radice e cose da ignorare), e il set +di caratteri di default da usare per i documenti che non lo definiscono +specificamente al loro interno.

+ + +

La configurazione di default indicizzerò la vostra +cartella home intera. Se questo non va bene lanciate  recoll +per creare un set di configurazione vuoto, cliccate su Cancel, ed editate i files di +configurazione prima di lanciare nuovamente recoll (o recollindex). +Verrà così iniziata l'indicizzazione, cosa che +può richiedere un certo tempo.

+ + +

Parametri:

+ + +
+
+ + +
topdirs
+ + +
+ +

Specifica la lista di cartelle e/o files da indicizzare +(recursivamente per le cartelle). L0indicizzazione non segue eventuali +liks simbolici all'interno dell'albero delle cartelle. Se la cartella +radice è un link simbolico, l'indicizzazione non inizia e +viene mostrato un avviso di errore.

+ + +
+ + +
dbdir
+ + +
+ +

E' il nome della cartella Xapian dei dati. La +cartella, se necessario, verrà creata all'inizio +dell'indicizzazione. Se non è un indirizzo assoluto, +verrà interpretato come relativo alla cartella di +configurazioneI.

+ + +
+ + +
skippedNames
+ + +
+ +

Una lista di cartelle e nomi di files, separati da uno +spazio vuoto, di ciò che deve essere completamente ignorato +dal processo di indicizzazione. The list defined in La lista di default +è:e default file is:

+ + + +
*~ #* bin CVS Cache caughtspam tmp
+ + + +

Alla lista possono essere aggiunte sotto-cartelle, che +però devono essere nell'albero delle cartelle definite in topdirs.

+ + + +

Le cartelle presenti in topdirs +non risentono di eventuali omonimi in skippedNames +(vale a dire che una cartella scritta in topdirs +viene indicizzata comunque, anche se il suo nome compare nella lista di + skippedNames).

+ + + +

La lista della configurazione di default non esclude le +cartelle nascoste (nomi preceduti da un punto), il che significa che +verranno indicizzte anche alcune cose che non vorreste. D'altra parte i +programmi di posta, come thunderbird, +normalmente salvano i messaggi in cartelle nascoste e probabilmente +volete indicizzarli. Una possibile soluzione è avere .* in skippedNames, +e aggiungere qualcosa come  ~/.thunderbird +o ~/.evolution in topdirs.

+ + +
+ + +
loglevel,daemloglevel
+ + +
+ +

Livello di verbosità per recoll e recollindex. +Un valore di 4 produce molti messaggi di +debug/informationi. 2 solo una lista di errori. Daemversion +è specifico al demone che monitorizza l'indicizzazione.

+ + +
+ + +
logfilename, +daemlogfilename
+ + +
+ +

Dove vanno i messaggi. 'stderr' può essere +usato come valore speciale, ed è quello di default.

+ + +
+ + +
filtersdir
+ + +
+ +

La cartella ove cercare gli sripts esterni necessari ad +indicizzare alcuni tipi di files. Non dovrebbe esserci motivo per +cambiarlo, a meno che non vogliate modificare gli script originali +mettendoli altrove. Il valore può essere ridefinito per ogni +sott-cartella.

+ + +
+ + +
indexstemminglanguages
+ + +
+ +

Una lista di lingue per le quali verrà +costruito il database per l'espansione grammaticale. Guardate +recollindex(1) per possibili valori (man recollindex). Puoi aggiungere +un database per qualsiasi lingua usando il comando recollindex +-s, ma tale database verrà cancellato alla +successiva re-indicizzazione Soltanto i database delle ingue listate +nella configurazione sono permanenti.

+ + +
+ + +
defaultcharset
+ + +
+ +

Nome del set di caratteri usati per files che non hanno +una definizione dei caratteri (ad esempio: files plain text). +Può essere definito per ogni sub-cartella, se non +è dato alcun set di caratteriviene utilizzato quello di +sistema (LC_ALL, +LC_CTYPE, LANG), or iso8859-1.

+ + +
+ + +
guesscharset
+ + +
+ +

Decide se cercare di indovinare il set di caratteri del +documanto qualora questo non sia specificato nel documento stesso +(ad esempio: files plain text). Ciò non funziona bene in +molti casi, e probabilmente non dovrebbe essere usato.

+ + +
+ + +
usesystemfilecommand
+ + +
+ +

Decide se usare il comando di sistema file -i per determinare il tipo +mime del file (la procedura normale usa l'associazione dei suffissi +come definiti nel file  mimemap). +Ciò può essere utile per files senza suffisso, ma +causa anche l'indicizzazione di molti strani files di "testo".

+ + +
+ + +
indexallfilenames
+ + +
+ +

Recoll +indicizza i nomi dei files in una speciale sezione del database per +permettere le ricerche dei nomi dei files anche con i caratteri jolly +Questo parametro decide se indicizzare solo i nomi di files che hanno +un suffisso che ne permette l'indicizzazione completa, o se +indicizzarli tutti indipendentemente dal suffisso.

+ + +
+ + +
idxabsmlen
+ + +
+ +

Recoll salva +un riassunto per ogni file indicizzato nel database. Questo +è quello che viene mostrato nella lista dei risultati senza +dover leggere il file originale. Questo parametro definisce la +dimensione del riassunto salvato (che può provenire +dall'attuale sezione o dall'inizio del testo). Il valore di default +è +250 caratteri.

+ + +
+ + +
iconsdir
+ + +
+ +

Il nome della cartella dove si trovano le icone che +vengono mostrate nella lista dei risultati. La puoi cambiare se vuoi +immagini differenti.

+ + +
+ + +
+ + +
+ + +
+ + +
+
+

4.4.2. Il file mimemap

+ + +

mimemap specifica +l'estensione mime del file per la sua mappatura nei tipi mime.

+ + +

Per i files senza un'estensione o con un'estensione non +riconosciuta viene eseguito il comando di sistema file +-i per determinarne  il tipo mime (ciò +può essere disbilitato nel file di configurazione).

+ + +

La mappatura può essere specificata su una base di +sotto-cartelle, cosa che può essere utile in certe +occasioni. Esempio: i logs di gaim hanno un'estensione .txt ma dovrebbero essere +trattai diversamente, cosa che è possibile perchè +essi generalmente sono posti in ina specifica cartella.

+ + +

mimemap ha anche +una variabile recoll_noindex +che è una lista di suffissi. I files con tali suffissi +vengono ignorati (il che evita decompressioni o esecuzioni non +necessarie ). Questo è una duplicazione parziale +della variabile skippedNames +inel file di configurazione principale, però con due +differenza: non riguarda le cartelle, e non può dipendere +dalla locazione nel file system (è un parametro di +configurazione generale). Potete quindi fare con skippedNames tutto quello che fa recoll_noindex. L'ultimo +parametro è usato normalmente per cose che si sa non sono +indicizzabili con una determinata versione di Recoll. Mettendole in questo +file si evita di toccare la variabile skippedNames +più orientata all'utente e alla localizzazione.

+ + +
+ + +
+
+

4.4.3. Il file mimeconf

+ + +

mimeconf +specifica come vengono trattati i vari tipi mime per l'indicizzazione, +e quali icone devono essere mostrate nella lista dei risultati di recoll.

+ + +

Cambiare i parametri nella sezione [index] non +è probabilmente una buona idea a meno che non siate +sviluppatori di Recoll.

+ + +

La sezione [icons] permette di cambiare le icone che +vengono mostrate nella lista dei risultati (i nomi sono quelli +delle immagini png, senza suffisso, che si trovano nella cartella iconsdir (specificata in recoll.conf).

+ + +
+ + +
+
+

4.4.4. Il file mimeview

+ + +

mimeview +specifica il programma che deve essere lanciato quando clicchi su Edit +nella lista dei risultati. ad esempio: HTML viene normalmente aperto +con firefox, ma potresti +preferire Konqueror, il +programma openoffice.org +potrebbe essere chiamato oofice +invece di openoffice etc.

+ + +

Cambiamenti a questo file possono essere fatti direttamente o +attraverso il dialogo 'Preferenze' del programma recoll.

+ + +

Come tutti gli altri files di configurazione, l'uso normale +è avere un mimeview +nella vostra cartella personale, con solo le voci non di default, che +si sovrapporrà a quello centrale per tutto il sistema.

+ + +

Per favore prendi nota che queste 'entrate' devono essere +fatte in una sezione nominata [view] +section.

+ + +
+ + +
+
+

4.4.5. Esempio

+ + +

Esempio:

+ + +

pensiamo di aggiungere la possibilità di +indicizzare i files +con estensione .lyx (file fatti col programma Lyx) in modo da poter +avere una visualizzazione corretta degli stessi e di poterli aprire con +il programma Lyx quando clicchiamo sul link edit. Dovremo, so +già non l'abbiamo, procurarci dal sito di recoll lo script +rcllyx necessario per l'indicizzazione dei files .lyx.
+ + +Tale script è un file di testo e va messo nella cartella +/usr/share/recoll/filters e reso eseguibile.

+ + +

Vogliamo inoltre poter aprire i file con estensione .kwd e +.kwt +(flies fatti con Kword) con il polor programma: Kword. (Questi files +non potranno essere indicizzate, se non con il loro nome (quindi niente +visualizzazione, ma possibilità di apertura degli stessi).

+ + +Per prima cosa dobbiamo trovare il tipo mime dato dal sistema +ai  +files di Lyx e di Kword. Troveremo che il tipo per ifiles di Lyx +è application/x-lyx +mentre per i files di Kword application/x-kword
+ + +(La procedura è molto semplice. Ad esempi con KDE si +apre konqueror, il menu impostazioni/associazione caratteri, +si +mette l'estensione del file nell'apposita casella e si prende nota +dell'associazione corrispondente.)
+ + +
+ + +A questo punto possiamo procedere. Di seguito i tre files modificati, +dove le linee in neretto + si riferiscono ai files Lyx, mentre quello rosse +ai files di Kword.
+ + +
+ + +MIMEMAP
+ + +# @(#$Id: usermanual-italian.html,v 1.1 2007-02-02 10:05:22 dockes Exp $  (C) +2004 J.F.Dockes
+ + +# Recoll: associations of file name extensions to mime types
+ + +
+ + +.txt = text/plain
+ + +.text = text/plain
+ + +.d    = text/plain
+ + +.lyx = application/x-lyx
+ + +.kwt += application/x-kword
+ + +.kwd += application/x-kword
+ + +
+ + +# Source files. Defining them as text/x-c will enable ext viewer. If
+ + +# text/plain they will be somewhat indexed
+ + +.cpp = text/x-c
+ + +.h   = text/x-c
+ + +.c   = text/x-c
+ + +.cc  = text/x-c
+ + +
+ + +.rtf  = text/rtf
+ + +
+ + +.html = text/html
+ + +.htm = text/html
+ + +.shtml = text/html
+ + +.php = text/html
+ + +
+ + +.pdf = application/pdf
+ + +
+ + +.ps = application/postscript
+ + +.eps = application/postscript
+ + +.ai = application/postscript
+ + +
+ + +.dvi = application/x-dvi
+ + +
+ + +.djvu = image/vnd.djvu
+ + +
+ + +.gz = application/x-gzip
+ + +.Z = application/x-gzip
+ + +.bz2 = application/x-bzip2
+ + +#.Z  = application/x-compress
+ + +
+ + +.doc = application/msword
+ + +.ppt = application/vnd.ms-powerpoint
+ + +.xls = application/vnd.ms-excel
+ + +
+ + +# OpenOffice / opendocument. We handle opendocument as old openoffice +files
+ + +# for now
+ + +.sxc = application/vnd.sun.xml.calc
+ + +.ods = application/vnd.sun.xml.calc
+ + +.stc = application/vnd.sun.xml.calc.template
+ + +.sxd = application/vnd.sun.xml.draw
+ + +.std = application/vnd.sun.xml.draw.template
+ + +.sxi = application/vnd.sun.xml.impress
+ + +.odp = application/vnd.sun.xml.impress
+ + +.sti = application/vnd.sun.xml.impress.template
+ + +.sxm = application/vnd.sun.xml.math
+ + +.sxw = application/vnd.sun.xml.writer
+ + +.odt = application/vnd.sun.xml.writer
+ + +.sxg = application/vnd.sun.xml.writer.global
+ + +.stw = application/vnd.sun.xml.writer.template
+ + +
+ + +
+ + +.wpd = application/vnd.wordperfect
+ + +.rtf = text/rtf
+ + +
+ + +.mp3 = audio/mpeg
+ + +.png = image/png
+ + +.jpg = image/jpeg
+ + +
+ + +# A list of stuff that we don't want to touch at all (for now). Having +the
+ + +# suffixes listed in there speeds up things quite a lot by avoiding
+ + +# unneeded decompression or 'file' calls. File names still get indexed +if
+ + +# indexallfilenames is set
+ + +recoll_noindex = .tar.gz .tgz .tar.bz2 .tbz .log.gz .md5 .map \
+ + +       .m4 .tcl +.js .sh .pl .awk \
+ + +       .o .lib +.dll .a \
+ + +       .dat .bak +.rdf .log .db .ini .msf .pid \
+ + +       .gnm +.gnumeric .tex \
+ + +       .gif .bmp +.xpm \
+ + +       ,v ~ #
+ + +
+ + +# Special handling of .txt files inside ~/.gaim directory
+ + +[~/.gaim]
+ + +.txt = text/x-gaim-log
+ + +
+ + +MIMECONF
+ + +# @(#$Id: usermanual-italian.html,v 1.1 2007-02-02 10:05:22 dockes Exp $  +(C) 2004 J.F.Dockes
+ + +
+ + +# Recoll : associations of mime types to processing filters.
+ + +# There are different sections for decompression, 'interning' for +indexing
+ + +# and preview, and external viewers
+ + +
+ + +## #######################################
+ + +# Decompression: these types need a first pass to create a temp file to
+ + +# work with. We use a script because uncompress utilities usually work +in
+ + +# place, which is not suitable.
+ + +#
+ + +# The %t parameter will be substituted to the name of a temporary +directory
+ + +# by recoll. This directory is guaranteed empty when calling the filter
+ + +#
+ + +# The %f parameter will be substituted with the input file.
+ + +#
+ + +# The script (ie: rcluncomp) must output the uncompressed file name on
+ + +# stdout.
+ + +application/x-gzip  =  uncompress rcluncomp gunzip %f +%t
+ + +application/x-compress = uncompress rcluncomp gunzip %f %t
+ + +application/x-bzip2 =  uncompress rcluncomp bunzip2 %f %t
+ + +
+ + +## ###################################
+ + +# Filters for indexing and internal preview.
+ + +# The external (exec) filters  output the document in simple +html format,
+ + +# have a look at the scripts.
+ + +[index]
+ + +application/msword = exec rcldoc
+ + +application/pdf = exec rclpdf
+ + +application/postscript = exec rclps
+ + +application/vnd.ms-powerpoint = exec rclppt
+ + +application/vnd.ms-excel = exec rclxls
+ + +application/vnd.sun.xml.calc = exec rclsoff
+ + +application/vnd.sun.xml.calc.template = exec rclsoff
+ + +application/vnd.sun.xml.draw = exec rclsoff
+ + +application/vnd.sun.xml.draw.template = exec rclsoff
+ + +application/vnd.sun.xml.impress = exec rclsoff
+ + +application/vnd.sun.xml.impress.template = exec rclsoff
+ + +application/vnd.sun.xml.math = exec rclsoff
+ + +application/vnd.sun.xml.writer = exec rclsoff
+ + +application/vnd.sun.xml.writer.global = exec rclsoff
+ + +application/vnd.sun.xml.writer.template = exec rclsoff
+ + +application/x-dvi = exec rcldvi
+ + +audio/mpeg = exec rclmedia
+ + +image/vnd.djvu = exec rcldjvu
+ + +message/rfc822 = internal
+ + +text/html  = internal
+ + +text/plain = internal
+ + +text/rtf = exec rclrtf
+ + +text/x-gaim-log = exec rclgaim
+ + +text/x-mail = internal
+ + +application/x-lyx = +exec rcllyx
+ + +
+ + +## #############################################
+ + +# Icons to be used in the result list if required by gui config
+ + +[icons]
+ + +application/msword = wordprocessing
+ + +application/pdf = pdf
+ + +application/postscript = postscript
+ + +application/vnd.ms-excel = spreadsheet
+ + +application/vnd.ms-powerpoint = presentation
+ + +application/vnd.sun.xml.calc = spreadsheet
+ + +application/vnd.sun.xml.calc.template = spreadsheet
+ + +application/vnd.sun.xml.draw = drawing
+ + +application/vnd.sun.xml.draw.template = drawing
+ + +application/vnd.sun.xml.impress = presentation
+ + +application/vnd.sun.xml.impress.template = presentation
+ + +application/vnd.sun.xml.writer = wordprocessing
+ + +application/vnd.sun.xml.writer.global = wordprocessing
+ + +application/vnd.sun.xml.writer.template = wordprocessing
+ + +application/x-fsdirectory = folder
+ + +application/x-dvi = document
+ + +audio/mpeg = sownd
+ + +image/jpeg = image
+ + +image/png = image
+ + +image/vnd.djvu = document
+ + +message/rfc822 = message
+ + +text/html = html
+ + +text/plain = txt
+ + +text/x-mail = message
+ + +text/x-c = source
+ + +application/x-lyx = +wordprocessing
+ + +application/x-kword = +wordprocessing
+ + +

+ + +[categories]
+ + +
+ + +texts = application/msword \
+ + +      application/pdf \
+ + +      +application/postscript \
+ + +      +application/vnd.sun.xml.writer \
+ + +      +application/vnd.sun.xml.writer.global \
+ + +      +application/vnd.sun.xml.writer.template \
+ + +      application/x-dvi \
+ + +      image/vnd.djvu \
+ + +      text/html \
+ + +      text/plain \
+ + +      application/x-lyx +\
+ + +     application/x-kword +\
+ + +
      text/rtf
+ + +
+ + +spreadsheets = application/vnd.ms-excel \
+ + +         +application/vnd.sun.xml.calc \
+ + +         +application/vnd.sun.xml.calc.template
+ + +
+ + +presentations = application/vnd.ms-powerpoint \
+ + +    +      +application/vnd.sun.xml.impress \
+ + +    +      +application/vnd.sun.xml.impress.template
+ + +
+ + +media = audio/mpeg \
+ + +      image/jpeg \
+ + +      image/png \
+ + +
+ + +messages = message/rfc822 \
+ + +     text/x-gaim-log \
+ + +     text/x-mail \
+ + +
+ + +other = application/vnd.sun.xml.draw \
+ + +      +application/vnd.sun.xml.draw.template \
+ + +      +application/vnd.sun.xml.math \
+ + +      +application/x-fsdirectory
+ + +
+ + +MIMEVIEW
+ + +
+ + +# @(#$Id: mimeview,v +1.2 2006/12/19 08:40:50 dockes Exp $  (C) 2004 J.F.Dockes
+ + +
+ + +## +##########################################
+ + +# External viewers, +launched by the recoll GUI when you click on a result
+ + +# 'edit' link
+ + +
+ + +[view]
+ + +application/msword = +openoffice %f
+ + +application/pdf  += kpdf %f
+ + +application/postscript += gv %f
+ + +application/vnd.ms-excel += openoffice %f
+ + +application/vnd.ms-powerpoint += openoffice %f
+ + +application/vnd.sun.xml.calc += openoffice %f
+ + +application/vnd.sun.xml.calc.template += openoffice %f
+ + +application/vnd.sun.xml.draw += openoffice %f
+ + +application/vnd.sun.xml.draw.template += openoffice %f
+ + +application/vnd.sun.xml.impress += openoffice %f
+ + +application/vnd.sun.xml.impress.template += openoffice %f
+ + +application/vnd.sun.xml.math += openoffice %f
+ + +application/vnd.sun.xml.writer += openoffice %f
+ + +application/vnd.sun.xml.writer.global += openoffice %f
+ + +application/vnd.sun.xml.writer.template += openoffice %f
+ + +application/x-fsdirectory += rox %f
+ + +application/x-dvi = +xdvi %f
+ + +audio/mpeg = xmms %f
+ + +image/jpeg = gimp %f
+ + +image/png = gimp %f
+ + +image/vnd.djvu = djview +%f
+ + +# Or firefox -remote +"openFile(%u)"
+ + +text/html = konqueror %u
+ + +application/x-lyx = +lyx %f
+ + +
application/x-kword += kword %f
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + diff --git a/src/doc/user/usermanual.xml b/src/doc/user/usermanual.xml new file mode 100644 index 00000000..035e3c46 --- /dev/null +++ b/src/doc/user/usermanual.xml @@ -0,0 +1,6562 @@ +Recoll"> +http://www.recoll.org/features.html"> + +Xapian"> + +]> + + + + + Recoll user manual + + + Jean-Francois + Dockes + +
jfd@recoll.org
+
+
+ + + 2005-2015 + Jean-Francois Dockes + + + + Permission is granted to copy, distribute and/or + modify this document under the terms of the GNU Free Documentation + License, Version 1.3 or any later version published by the Free + Software Foundation; with no Invariant Sections, no Front-Cover + Texts, and no Back-Cover Texts. A copy of the license can be + found at the following + location: GNU + web site. + + This document introduces full text search notions + and describes the installation and use of the &RCL; + application. This version describes &RCL; &RCLVERSION;. + + + +
+ + + Introduction + + + Giving it a try + + If you do not like reading manuals (who does?) but + wish to give &RCL; a try, just install the application + and start the recoll graphical user + interface (GUI), which will ask permission to index your home + directory by default, allowing you to search immediately after + indexing completes. + + Do not do this if your home directory contains a huge + number of documents and you do not want to wait or are very + short on disk space. In this case, you may first want to customize + the configuration + to restrict the indexed area (for the very impatient with a completed package install, from the recoll GUI: + Preferences + Indexing configuration + , then adjust the Top + directories section). + + Also be aware that you may need to install the + appropriate supporting + applications for document types that need them (for + example antiword for + Microsoft Word files). + + + + Full text search + + &RCL; is a full text search application. Full text search + finds your data by content rather than by external attributes + (like a file name). You specify words + (terms) which should or should not appear in the text you are + looking for, and receive in return a list of matching + documents, ordered so that the most + relevant documents will appear + first. + + You do not need to remember in what file or email message you + stored a given piece of information. You just ask for related + terms, and the tool will return a list of documents where + these terms are prominent, in a similar way to Internet search + engines. + + Full text search applications try to determine which + documents are most relevant to the search terms you + provide. Computer algorithms for determining relevance can be + very complex, and in general are inferior to the power of the + human mind to rapidly determine relevance. The quality of + relevance guessing is probably the most important aspect when + evaluating a search application. + + In many cases, you are looking for all the forms of a + word, including plurals, different tenses for a verb, or terms + derived from the same root or stem + (example: floor, floors, floored, + flooring...). Queries are usually automatically + expanded to all such related terms (words that reduce to the + same stem). This can be prevented for searching for a specific + form. + + Stemming, by itself, does not accommodate for misspellings + or phonetic searches. A full text search application may also + support this form of approximation. For example, a search for + aliterattion returning no result may + propose, depending on index contents, alliteration + alteration alterations altercation as possible + replacement terms. + + + + + Recoll overview + + &RCL; uses the + &XAP; information retrieval + library as its storage and retrieval engine. &XAP; is a very + mature package using a sophisticated + probabilistic ranking model. + + The &XAP; library manages an index database which + describes where terms appear in your document files. It + efficiently processes the complex queries which are produced by + the &RCL; query expansion mechanism, and is in charge of the + all-important relevance computation task. + + &RCL; provides the mechanisms and interface to get data + into and out of the index. This includes translating the many + possible document formats into pure text, handling term + variations (using &XAP; stemmers), and spelling approximations + (using the aspell speller), + interpreting user queries and presenting results. + + In a shorter way, &RCL; does the dirty footwork, &XAP; + deals with the intelligent parts of the process. + + The &XAP; index can be big (roughly the size of the + original document set), but it is not a document + archive. &RCL; can only display documents that still exist at + the place from which they were indexed. (Actually, there is a + way to reconstruct a document from the information in the + index, but the result is not nice, as all formatting, + punctuation and capitalization are lost). + + &RCL; stores all internal data in Unicode + UTF-8 format, and it can index files of many types + with different character sets, encodings, and languages into the + same index. It can process documents embedded inside other + documents (for example a pdf document stored inside a Zip + archive sent as an email attachment...), down to an arbitrary + depth. + + Stemming is the process by which &RCL; reduces words to + their radicals so that searching does not depend, for example, on a + word being singular or plural (floor, floors), or on a verb tense + (flooring, floored). Because the mechanisms used for stemming + depend on the specific grammatical rules for each language, there + is a separate &XAP; stemmer module for most common languages where + stemming makes sense. + + &RCL; stores the unstemmed versions of terms in the main index + and uses auxiliary databases for term expansion (one for each + stemming language), which means that you can switch stemming + languages between searches, or add a language without needing a + full reindex. + + Storing documents written in different languages in the same + index is possible, and commonly done. In this situation, you can + specify several stemming languages for the index. + + &RCL; currently makes no attempt at automatic language + recognition, which means that the stemmer will sometimes be applied + to terms from other languages with potentially strange results. In + practise, even if this introduces possibilities of confusion, this + approach has been proven quite useful, and it is much less + cumbersome than separating your documents according to what + language they are written in. + + Before version 1.18, &RCL; stripped most accents and + diacritics from terms, and converted them to lower case before + either storing them in the index or searching for them. As a + consequence, it was impossible to search for a particular + capitalization of a term (US / + us), or to discriminate two terms based on + diacritics (sake / saké, + mate / maté). + + As of version 1.18, &RCL; can optionally store the raw terms, + without accent stripping or case conversion. In this configuration, + it is still possible (and most common) for a query to be + insensitive to case and/or diacritics. Appropriate term expansions + are performed before actually accessing the main index. This is + described in more detail in the section about index case and + diacritics sensitivity. + + &RCL; has many parameters which define exactly what to + index, and how to classify and decode the source + documents. These are kept in configuration files. A + default configuration is copied into a standard location + (usually something like + /usr/[local/]share/recoll/examples) + during installation. The default values set by the + configuration files in this directory may be overridden by + values that you set inside your personal configuration, found + by default in the .recoll sub-directory + of your home directory. The default configuration will index + your home directory with default parameters and should be + sufficient for giving &RCL; a try, but you may want to adjust + it later, which can be done either by editing the text files + or by using configuration menus in the + recoll GUI. Some other parameters affecting only + the recoll GUI are stored in the standard + location defined by Qt. + + The indexing + process is started automatically the first time you + execute the recoll GUI. Indexing can also + be performed by executing the recollindex + command. &RCL; indexing is multithreaded by default when + appropriate hardware resources are available, and can perform + in parallel multiple tasks among text extraction, segmentation + and index updates. + + Searches are usually + performed inside the recoll GUI, which has many + options to help you find what you are looking for. However, there + are other ways to perform &RCL; searches: mostly a + command line interface, a + + Python + programming interface, a + KDE KIO slave module, and + Ubuntu Unity + Lens (for older versions) or + + Scope (for current versions) modules. + + + + + + + + Indexing + + + Introduction + + Indexing is the process by which the set of documents is + analyzed and the data entered into the database. &RCL; + indexing is normally incremental: documents will only be + processed if they have been modified since the last run. On + the first execution, all documents will need processing. A + full index build can be forced later by specifying an option + to the indexing command (recollindex + or ). + + recollindex skips files which caused an + error during a previous pass. This is a performance + optimization, and a new behaviour in version 1.21 (failed files + were always retried by previous versions). The command line + option can be set to retry failed files, for + example after updating a filter. + + The following sections give an overview of different + aspects of the indexing processes and configuration, with links + to detailed sections. + + Depending on your data, temporary files may be needed during + indexing, some of them possibly quite big. You can use the + RECOLL_TMPDIR or TMPDIR environment + variables to determine where they are created (the default is to + use /tmp). Using TMPDIR has + the nice property that it may also be taken into account by + auxiliary commands executed by recollindex. + + + Indexing modes + + &RCL; indexing can be performed along two different modes: + + + + <link linkend="RCL.INDEXING.PERIODIC"> + Periodic (or batch) indexing:</link> + indexing takes place at discrete + times, by executing the recollindex + command. The typical usage is to have a nightly indexing run + + programmed into + your cron file. + + + + <link linkend="RCL.INDEXING.MONITOR">Real + time indexing:</link> + indexing takes place as soon as a file is created or + changed. recollindex runs as a daemon + and uses a file system alteration monitor such as + inotify, + Fam or + Gamin + to detect file changes. + + + + + The choice between the two methods is mostly a matter of + preference, and they can be combined by setting up multiple + indexes (ie: use periodic indexing on a big documentation + directory, and real time indexing on a small home + directory). Monitoring a big file system tree can consume + significant system resources. + + The choice of method and the parameters used can be + configured from the recoll GUI: + + Preferences + Indexing schedule + + + + + + Configurations, multiple indexes + + The parameters describing what is to be indexed and + local preferences are defined in text files contained in a + configuration + directory. + + All parameters have defaults, defined in system-wide + files. + + Without further configuration, &RCL; will index all + appropriate files from your home directory, with a reasonable + set of defaults. + + A default personal configuration directory + ($HOME/.recoll/) is created + when a &RCL; program is first executed. It is possible to + create other configuration directories, and use them by + setting the RECOLL_CONFDIR environment + variable, or giving the option to any of + the &RCL; commands. + + In some cases, it may be interesting to index different + areas of the file system to separate databases. You can do this + by using multiple configuration directories, each indexing a + file system area to a specific database. Typically, this + would be done to separate personal and shared + indexes, or to take advantage of the organization of your data + to improve search precision. + + The generated indexes can + be queried concurrently in a transparent manner. + + For index generation, multiple configurations are + totally independant from each other. When multiple indexes need + to be used for a single search, + some parameters + should be consistent among the configurations. + + + + + Document types + &RCL; knows about quite a few different document + types. The parameters for document types recognition and + processing are set in + configuration files. + + Most file types, like HTML or word processing files, only hold + one document. Some file types, like email folders or zip + archives, can hold many individually indexed documents, which may + themselves be compound ones. Such hierarchies can go quite + deep, and &RCL; can process, for example, a + LibreOffice + document stored as an attachment to an email message inside an + email folder archived in a zip file... + + &RCL; indexing processes plain text, HTML, OpenDocument + (Open/LibreOffice), email formats, and a few others internally. + + Other file types (ie: postscript, pdf, ms-word, rtf ...) + need external applications for preprocessing. The list is in the + installation + section. After every indexing operation, &RCL; updates a list of + commands that would be needed for indexing existing files + types. This list can be displayed by selecting the menu option + + File + Show Missing Helpers + + in the recoll GUI. It is stored in the + missing text file inside the configuration + directory. + + By default, &RCL; will try to index any file type that + it has a way to read. This is sometimes not desirable, and + there are ways to either exclude some types, or on the + contrary to define a positive list of types to be + indexed. In the latter case, any type not in the list will + be ignored. + + Excluding types can be done by adding wildcard name + patterns to the skippedNames list, which + can be done from the GUI Index configuration menu. For + versions 1.20 and later, you can alternatively set the + excludedmimetypes list in the + configuration file. This can be redefined for + subdirectories. + + You can also define an exclusive list of MIME types to be indexed (no others will be indexed), by settting + the indexedmimetypes configuration + variable. Example: +indexedmimetypes = text/html application/pdf + + It is possible to redefine this parameter for + subdirectories. Example: +[/path/to/my/dir] +indexedmimetypes = application/pdf + + (When using sections like this, don't forget that they remain + in effect until the end of the file or another section + indicator). + + excludedmimetypes or + indexedmimetypes, can be set either by + editing the + main configuration file + (recoll.conf), or from the GUI + index configuration tool. + + + + + + Indexing failures + + Indexing may fail for some documents, for a number of + reasons: a helper program may be missing, the document may be + corrupt, we may fail to uncompress a file because no file + system space is available, etc. + + &RCL; versions prior to 1.21 always retried to index + files which had previously caused an error. This guaranteed + that anything that may have become indexable (for example + because a helper had been installed) would be indexed. However + this was bad for performance because some indexing failures + may be quite costly (for example failing to uncompress a big + file because of insufficient disk space). + + The indexer in &RCL; versions 1.21 and later do not + retry failed file by default. Retrying will only occur if an + explicit option () is set on the + recollindex command line, or if a script + executed when recollindex starts up says + so. The script is defined by a configuration variable + (checkneedretryindexscript), and makes a + rather lame attempt at deciding if a helper command may have + been installed, by checking if any of the common + bin directories have changed. + + + + + Recovery + In the rare case where the index becomes corrupted (which can + signal itself by weird search results or crashes), the index files + need to be erased before restarting a clean indexing pass. Just delete + the xapiandb directory (see + next section), or, + alternatively, start the next recollindex with the + option, which will reset the database before + indexing. + + + + + + Index storage + + The default location for the index data is the + xapiandb subdirectory of the &RCL; + configuration directory, typically + $HOME/.recoll/xapiandb/. This can be + changed via two different methods (with different purposes): + + You can specify a different configuration + directory by setting the RECOLL_CONFDIR + environment variable, or using the + option to the &RCL; commands. This method would typically be + used to index different areas of the file system to + different indexes. For example, if you were to issue the + following commands: + +export RECOLL_CONFDIR=~/.indexes-email +recoll + Then &RCL; would use configuration files + stored in ~/.indexes-email/ and, + (unless specified otherwise in + recoll.conf) would look for + the index in + ~/.indexes-email/xapiandb/. + + Using multiple configuration directories and configuration + options allows you to tailor multiple configurations and + indexes to handle whatever subset of the available data you wish + to make searchable. + + + + For a given configuration directory, you can + specify a non-default storage location for the index by setting + the dbdir parameter in the configuration file + (see the configuration + section). This method would mainly be of use if you wanted + to keep the configuration directory in its default location, but + desired another location for the index, typically out of disk + occupation concerns. + + + + + + The size of the index is determined by the size of the set + of documents, but the ratio can vary a lot. For a typical + mixed set of documents, the index size will often be close to + the data set size. In specific cases (a set of compressed mbox + files for example), the index can become much bigger than the + documents. It may also be much smaller if the documents + contain a lot of images or other non-indexed data (an extreme + example being a set of mp3 files where only the tags would be + indexed). + + Of course, images, sound and video do not increase the + index size, which means that nowadays (2012), typically, even a big + index will be negligible against the total amount of data on the + computer. + + The index data directory (xapiandb) + only contains data that can be completely rebuilt by an index run + (as long as the original documents exist), and it can always be + destroyed safely. + + + &XAP; index formats + + &XAP; versions usually support several formats for index + storage. A given major &XAP; version will have a current format, + used to create new indexes, and will also support the format from + the previous major version. + + &XAP; will not convert automatically an existing index + from the older format to the newer one. If you want to upgrade to + the new format, or if a very old index needs to be converted + because its format is not supported any more, you will have to + explicitly delete the old index, then run a normal indexing + process. + + Using the option to + recollindex is not sufficient to change the + format, you will have to delete all files inside the index + directory (typically ~/.recoll/xapiandb) + before starting the indexing. + + + + + Security aspects + + The &RCL; index does not hold copies of the indexed + documents. But it does hold enough data to allow for an almost + complete reconstruction. If confidential data is indexed, + access to the database directory should be restricted. + + &RCL; (since version 1.4) will create the configuration + directory with a mode of 0700 (access by owner only). As the + index data directory is by default a sub-directory of the + configuration directory, this should result in appropriate + protection. + + If you use another setup, you should think of the kind + of protection you need for your index, set the directory + and files access modes appropriately, and also maybe adjust + the umask used during index updates. + + + + + + + + Index configuration + + Variables set inside the + &RCL; configuration files + control which areas of the file system are indexed, and how + files are processed. These variables can be set either by + editing the text files or by using the + dialogs in the + recoll GUI. + + The first time you start recoll, you + will be asked whether or not you would like it to build the + index. If you want to adjust the configuration before + indexing, just click Cancel at this + point, which will get you into the configuration interface. If + you exit at this point, recoll will have + created a ~/.recoll directory containing + empty configuration files, which you can edit by hand. + + The configuration is documented inside the + installation chapter + of this document, or in the + + recoll.conf + 5 + + man page, but the most + current information will most likely be the comments inside the + sample file. The most immediately useful variable you may + interested in is probably + + topdirs, + which determines what subtrees get indexed. + + The applications needed to index file types other than + text, HTML or email (ie: pdf, postscript, ms-word...) are + described in the external + packages section. + + As of Recoll 1.18 there are two incompatible types of Recoll + indexes, depending on the treatment of character case and + diacritics. The next section describes the two types in more + detail. + + + Multiple indexes + + Multiple &RCL; indexes can be created by + using several configuration directories which are usually set to + index different areas of the file system. A specific index can + be selected for updating or searching, using the + RECOLL_CONFDIR environment variable or the + option to recoll and + recollindex. + + A typical usage scenario for the multiple index feature + would be for a system administrator to set up a central index + for shared data, that you choose to search or not in addition to + your personal data. Of course, there are other + possibilities. There are many cases where you know the subset of + files that should be searched, and where narrowing the search + can improve the results. You can achieve approximately the same + effect with the directory filter in advanced search, but + multiple indexes will have much better performance and may be + worth the trouble. + + A recollindex program instance can only + update one specific index. + + The main index (defined by + RECOLL_CONFDIR or ) is + always active. If this is undesirable, you can set up your + base configuration to index an empty directory. + + The different search interfaces (GUI, command line, ...) + have different methods to define the set of indexes to be + used, see the appropriate section. + + If a set of multiple indexes are to be used together for + searches, some configuration parameters must be consistent + among the set. These are parameters which need to be the same + when indexing and searching. As the parameters come from the + main configuration when searching, they need to be compatible + with what was set when creating the other indexes (which came + from their respective configuration directories). + + Most importantly, all indexes to be queried concurrently must + have the same option concerning character case and diacritics + stripping, but there are other constraints. Most of the + relevant parameters are described in the + linked + section. + + + + + + Index case and diacritics sensitivity + + As of &RCL; version 1.18 you have a choice of building an + index with terms stripped of character case and diacritics, or + one with raw terms. For a source term of + Résumé, the former will store + resume, the latter + Résumé. + + Each type of index allows performing searches insensitive to + case and diacritics: with a raw index, the user entry will be + expanded to match all case and diacritics variations present in + the index. With a stripped index, the search term will be stripped + before searching. + + A raw index allows for another possibility which a stripped + index cannot offer: using case and diacritics to discriminate + between terms, returning different results when searching for + US and us or + resume and résumé. + Read the section about search + case and diacritics sensitivity for more details. + + The type of index to be created is controlled by the + indexStripChars configuration + variable which can only be changed by editing the + configuration file. Any change implies an index reset (not + automated by &RCL;), and all indexes in a search must be set + in the same way (again, not checked by &RCL;). + + If the indexStripChars is not set, &RCL; + 1.18 creates a stripped index by default, for + compatibility with previous versions. + + As a cost for added capability, a raw index will be slightly + bigger than a stripped one (around 10%). Also, searches will be + more complex, so probably slightly slower, and the feature is + still young, so that a certain amount of weirdness cannot be + excluded. + + One of the most adverse consequence of using a raw index + is that some phrase and proximity searches may become + impossible: because each term needs to be expanded, and all + combinations searched for, the multiplicative expansion may + become unmanageable. + + + + + + The index configuration GUI + + Most parameters for a given index configuration can + be set from a recoll GUI running on this + configuration (either as default, or by setting + RECOLL_CONFDIR or the + option.) + + The interface is started from the + + Preferences + Index Configuration + + menu entry. It is divided in four tabs, + Global parameters, Local + parameters, Web history + (which is explained in the next section) and Search + parameters. + + The Global parameters tab allows setting + global variables, like the lists of top directories, skipped paths, + or stemming languages. + + The Local parameters tab allows setting + variables that can be redefined for subdirectories. This second tab + has an initially empty list of customisation directories, to which + you can add. The variables are then set for the currently selected + directory (or at the top level if the empty line is + selected). + + The Search parameters section defines + parameters which are used at query time, but are global to an + index and affect all search tools, not only the GUI. + + The meaning for most entries in the interface is + self-evident and documented by a ToolTip + popup on the text label. For more detail, you will need to + refer to the configuration + section of this guide. + + The configuration tool normally respects the comments + and most of the formatting inside the configuration file, so + that it is quite possible to use it on hand-edited files, + which you might nevertheless want to backup first... + + + + + + + Indexing WEB pages you wisit + + With the help of a Firefox + extension, &RCL; can index the Internet pages that you visit. The + extension was initially designed for the + Beagle indexer, but it has recently be + renamed and better adapted to &RCL;. + + The extension works by copying visited WEB pages to an indexing + queue directory, which &RCL; then processes, indexing the data, + storing it into a local cache, then removing the file from the + queue. + + This feature can be enabled in the GUI + Index configuration + panel, or by editing the configuration file (set + processwebqueue to 1). + + A current pointer to the extension can be found, along with + up-to-date instructions, on the + Recoll wiki. + + A copy of the indexed WEB pages is retained by Recoll in a + local cache (from which previews can be fetched). The cache size can + be adjusted from the Index configuration / + Web history panel. Once the maximum size + is reached, old pages are purged - both from the cache and the index + - to make room for new ones, so you need to explicitly archive in + some other place the pages that you want to keep + indefinitely. + + + + + Extended attributes data + + User extended attributes are named pieces of information + that most modern file systems can attach to any file. + + &RCL; versions 1.19 and later process extended attributes + as document fields by default. For older versions, this has to + be activated at build time. + + A + + freedesktop standard defines a few special + attributes, which are handled as such by &RCL;: + + + mime_type + If set, this overrides any other + determination of the file MIME type. + + + charset + If set, this defines the file character set + (mostly useful for plain text files). + + + + + By default, other attributes are handled as &RCL; fields. + On Linux, the user prefix is removed from + the name. This can be configured more precisely inside + the + fields configuration file. + + + + + + Importing external tags + + During indexing, it is possible to import metadata for + each file by executing commands. For example, this could + extract user tag data for the file and store it in a field for + indexing. + + See the + section + about the metadatacmds field in + the main configuration chapter for more detail. + + + + + Periodic indexing + + + Running indexing + + Indexing is always performed by the + recollindex program, which can be started + either from the command line or from the File + menu in the recoll GUI program. When started + from the GUI, the indexing will run on the same configuration + recoll was started on. When started from the + command line, recollindex will use the + RECOLL_CONFDIR variable or accept a + confdir option + to specify a non-default configuration directory. + + If the recoll program finds no index + when it starts, it will automatically start indexing (except + if canceled). + + The recollindex indexing process can be + interrupted by sending an interrupt (Ctrl-C, + SIGINT) or terminate + (SIGTERM) signal. Some time may elapse before the process exits, + because it needs to properly flush and close the index. This can + also be done from the recoll GUI + + File + Stop Indexing + + menu entry. + + After such an interruption, the index will be somewhat + inconsistent because some operations which are normally + performed at the end of the indexing pass will have been + skipped (for example, the stemming and spelling databases + will be inexistant or out of date). You just need to restart + indexing at a later time to restore consistency. The + indexing will restart at the interruption point (the full + file tree will be traversed, but files that were indexed up + to the interruption and for which the index is still up to + date will not need to be reindexed). + + recollindex has a number of other options + which are described in its man page. Only a few will be + described here. + Option will reset the index when + starting. This is almost the same as destroying the index + files (the nuance is that the &XAP; format version will not + be changed). + Option will force the update of all + documents without resetting the index first. This will not + have the "clean start" aspect of , but + the advantage is that the index will remain available for + querying while it is rebuilt, which can be a significant + advantage if it is very big (some installations need days + for a full index rebuild). + + Option will force retrying files + which previously failed to be indexed, for example because + of a missing helper program. + + Of special interest also, maybe, are + the and + options. allows indexing an explicit + list of files (given as command line parameters or read on + stdin). tells + recollindex to ignore file selection + parameters from the configuration. Together, these options + allow building a custom file selection process for some area + of the file system, by adding the top directory to the + skippedPaths list and using an + appropriate file selection method to build the file list to + be fed to recollindex + . Trivial example: + + + find . -name indexable.txt -print | recollindex -if + + + recollindex will + not descend into subdirectories specified as parameters, + but just add them as index entries. It is + up to the external file selection method to build the complete + file list. + + + + Using <command>cron</command> to automate + indexing + + The most common way to set up indexing is to have a cron + task execute it every night. For example the following + crontab entry would do it every day at + 3:30AM (supposing recollindex is in your + PATH): + + /some/tmp/dir/recolltrace 2>&1 +]]> + + Or, using anacron: + /tmp/rcltraceme 2>&1" +]]> + + + As of version 1.17 the &RCL; GUI has dialogs to manage + crontab entries for + recollindex. You can reach them from the + + Preferences + Indexing Schedule + + menu. They only + work with the good old cron, and do not give + access to all features of cron scheduling. + + The usual command to edit your + crontab is crontab + (which will usually start the + vi editor to edit the file). You may have + more sophisticated tools available on your system. + + Please be aware that there may be differences between your + usual interactive command line environment and the one seen by + crontab commands. Especially the PATH variable may be of + concern. Please check the crontab manual pages about possible + issues. + + + + + + + Real time indexing + + Real time monitoring/indexing is performed by starting the + recollindex command. + With this option, recollindex will detach + from the terminal and become a daemon, permanently monitoring + file changes and updating the index. + + Under KDE, + Gnome and some other desktop + environments, the daemon can automatically started when you log + in, by creating a desktop file inside the + ~/.config/autostart directory. This can be + done for you by the &RCL; GUI. Use the + Preferences->Indexing Schedule menu. + + With older X11 setups, starting + the daemon is normally performed as part of the user session + script. + + The rclmon.sh script can be used to + easily start and stop the daemon. It can be found in the + examples directory (typically + /usr/local/[share/]recoll/examples). + + For example, my out of fashion + xdm-based session has a + .xsession script with the following lines + at the end: + + recollconf=$HOME/.recoll-home +recolldata=/usr/local/share/recoll +RECOLL_CONFDIR=$recollconf $recolldata/examples/rclmon.sh start + +fvwm + + + + The indexing daemon gets started, then the window manager, + for which the session waits. By default the + indexing daemon will monitor the state of the X11 session, and + exit when it finishes, it is not necessary to kill it + explicitly. (The X11 server + monitoring can be disabled with option to + recollindex). + + If you use the daemon completely out of an + X11 session, you need to add option + to disable X11 + session monitoring (else the daemon will not start). + + By default, the messages from the indexing daemon will be + setn to the same file as those from the interactive commands + (logfilename). You may want to change this + by setting the daemlogfilename and + daemloglevel configuration parameters. Also + the log file will only be truncated when the daemon starts. If + the daemon runs permanently, the log file may grow quite big, + depending on the log level. + + When building &RCL;, the real time indexing support can be + customised during package configuration with + the or + options. The default is + currently to include inotify + monitoring on systems that support it, and, as of &RCL; 1.17, + gamin support on + FreeBSD. + + While it is convenient that data is indexed in real time, + repeated indexing can generate a significant load on the + system when files such as email folders change. Also, + monitoring large file trees by itself significantly taxes + system resources. You probably do not want to enable it if + your system is short on resources. Periodic indexing is + adequate in most cases. + + Increasing resources for inotify + On Linux systems, monitoring a big tree may need + increasing the resources available to inotify, which are + normally defined in /etc/sysctl.conf. + +### inotify +# +# cat /proc/sys/fs/inotify/max_queued_events - 16384 +# cat /proc/sys/fs/inotify/max_user_instances - 128 +# cat /proc/sys/fs/inotify/max_user_watches - 16384 +# +# -- Change to: +# +fs.inotify.max_queued_events=32768 +fs.notify.max_user_instances=256 +fs.inotify.max_user_watches=32768 + + + + Especially, you will need to trim your tree or adjust + the max_user_watches value if indexing exits with + a message about errno ENOSPC (28) from + inotify_add_watch. + + + + Slowing down the reindexing rate for fast changing + files + + When using the real time monitor, it may happen that some + files need to be indexed, but change so often that they impose an + excessive load for the system. + + &RCL; provides a configuration option to specify the minimum + time before which a file, specified by a wildcard pattern, cannot be + reindexed. See the mondelaypatterns parameter in + the + configuration section. + + + + + + + + Searching + + + Searching with the Qt graphical user interface + + The recoll program provides the main user + interface for searching. It is based on the + Qt library. + + recoll has two search modes: + + Simple search (the default, on the main screen) has + a single entry field where you can enter multiple words. + + Advanced search (a panel accessed through the + Tools menu or the toolbox bar icon) has + multiple entry fields, which you may use to build a logical + condition, with additional filtering on file type, location + in the file system, modification date, and size. + + + + In most cases, you can enter the terms as you + think them, even if they contain embedded punctuation or other + non-textual characters. For + example, &RCL; can handle things like email addresses, or + arbitrary cut and paste from another text window, punctation + and all. + + The main case where you should enter text differently from + how it is printed is for east-asian languages (Chinese, + Japanese, Korean). Words composed of single or multiple + characters should be entered separated by white space in this + case (they would typically be printed without white + space). + + Some searches can be quite complex, and you may want to + re-use them later, perhaps with some tweaking. &RCL; versions + 1.21 and later can save and restore searches, using XML files. See + Saving and restoring + queries. + + + Simple search + + + Start the recoll program. + + Possibly choose a search mode: Any + term, All terms, + File name or + Query language. + + Enter search term(s) in the text field at the top of the + window. + + Click the Search button or + hit the Enter key to start the search. + + + + The initial default search mode is Query + language. Without special directives, this will look for + documents containing all of the search terms (the ones with more + terms will get better scores), just like the All + terms mode which will ignore such + directives. Any term will search for documents + where at least one of the terms appear. + + The Query Language features are + described in a separate + section. + + All search modes allow wildcards inside terms + (*, ?, + []). You may want to have a look at the + section about wildcards + for more information about this. + + File name will specifically look for file + names. The point of having a separate file name + search is that wild card expansion can be performed more + efficiently on a small subset of the index (allowing + wild cards on the left of terms without excessive penality). + Things to know: + + White space in the entry should match white + space in the file name, and is not treated specially. + + The search is insensitive to character case and + accents, independantly of the type of index. + + An entry without any wild card + character and not capitalized will be prepended and appended + with '*' (ie: etc -> + *etc*, but + Etc -> + etc). + + If you have a big index (many files), + excessively generic fragments may result in inefficient + searches. + + + + + You can search for exact phrases (adjacent words in a + given order) by enclosing the input inside double quotes. Ex: + "virtual reality". + + When using a stripped index, character case has no influence on + search, except that you can disable stem expansion for any term by + capitalizing it. Ie: a search for floor will also + normally look for flooring, + floored, etc., but a search for + Floor will only look for floor, + in any character case. Stemming can also be disabled globally in the + preferences. When using a raw index, the rules are a bit more + complicated. + + &RCL; remembers the last few searches that you + performed. You can use the simple search text entry widget (a + combobox) to recall them (click on the thing at the right of the + text field). Please note, however, that only the search texts + are remembered, not the mode (all/any/file name). + + Typing Esc Space while + entering a word in the simple search entry will open a window + with possible completions for the word. The completions are + extracted from the database. + + Double-clicking on a word in the result list or a preview + window will insert it into the simple search entry field. + + You can cut and paste any text into an All + terms or Any term search field, + punctuation, newlines and all - except for wildcard characters + (single ? characters are ok). &RCL; will process + it and produce a meaningful search. This is what most differentiates + this mode from the Query Language mode, where + you have to care about the syntax. + + You can use the + + Tools + Advanced search + + dialog for more complex searches. + + + + + The default result list + + After starting a search, a list of results will instantly + be displayed in the main list window. + + By default, the document list is presented in order of + relevance (how well the system estimates that the document + matches the query). You can sort the result by ascending or + descending date by using the vertical arrows in the toolbar. + + Clicking on the + Preview link for an entry will open an + internal preview window for the document. Further + Preview clicks for the same search will open + tabs in the existing preview window. You can use + Shift+Click to force the creation of another + preview window, which may be useful to view the documents side + by side. (You can also browse successive results in a single + preview window by typing + Shift+ArrowUp/Down in the + window). + + Clicking the Open link will + start an external viewer for the document. By default, &RCL; lets + the desktop choose the appropriate application for most document + types (there is a short list of exceptions, see further). If you + prefer to completely customize the choice of applications, you can + uncheck the Use desktop preferences option in + the GUI preferences dialog, and click the Choose editor + applications button to adjust the predefined &RCL; + choices. The tool accepts multiple selections of MIME types (e.g. to + set up the editor for the dozens of office file types). + + Even when Use desktop preferences is + checked, there is a small list of exceptions, for MIME types where + the &RCL; choice should override the desktop one. These are + applications which are well integrated with &RCL;, especially + evince for viewing PDF and Postscript + files because of its support for opening the document at a specific + page and passing a search string as an argument. Of course, you can + edit the list (in the GUI preferences) if you would prefer to lose + the functionality and use the standard desktop tool. + + You may also change the choice of applications by editing the + + mimeview configuration file if you find + this more convenient. + + Each result entry also has a right-click menu with an + Open With entry. This lets you choose an + application from the list of those which registered with the desktop + for the document MIME type. + + The Preview and Open + edit links may not be present for all entries, meaning that + &RCL; has no configured way to preview a given file type (which + was indexed by name only), or no configured external editor for + the file type. This can sometimes be adjusted simply by tweaking + the + mimemap and + + mimeview configuration files (the latter + can be modified with the user preferences dialog). + + The format of the result list entries is entirely + configurable by using the preference dialog to + edit an HTML + fragment. + + You can click on the Query details link + at the top of the results page to see the query actually + performed, after stem expansion and other processing. + + Double-clicking on any word inside the result list or a + preview window will insert it into the simple search text. + + The result list is divided into pages (the size of which + you can change in the preferences). Use the arrow buttons in the + toolbar or the links at the bottom of the page to browse the + results. + + + No results: the spelling suggestions + + When a search yields no result, and if the + aspell dictionary is configured, &RCL; + will try to check for misspellings among the query terms, and + will propose lists of replacements. Clicking on one of the + suggestions will replace the word and restart the search. You can + hold any of the modifier keys (Ctrl, Shift, etc.) while clicking + if you would rather stay on the suggestion screen because several + terms need replacement. + + + + + + The result list right-click menu + + Apart from the preview and edit links, you can display a + pop-up menu by right-clicking over a paragraph in the result + list. This menu has the following entries: + + + Preview + Open + Open With + Run Script + Copy File Name + Copy Url + Save to File + Find similar + Preview Parent + document + Open Parent + document + Open Snippets + Window + + + The Preview and + Open entries do the same thing as the + corresponding links. + + Open With lets you open the document + with one of the applications claiming to be able to handle its MIME + type (the information comes from the .desktop + files in + /usr/share/applications). + + Run Script allows starting an arbitrary + command on the result file. It will only appear for results which + are top-level files. See further for a more + detailed description. + + The Copy File Name and + Copy Url copy the relevant data to the + clipboard, for later pasting. + + Save to File allows saving the + contents of a result document to a chosen file. This entry + will only appear if the document does not correspond to an + existing file, but is a subdocument inside such a file (ie: an + email attachment). It is especially useful to extract attachments + with no associated editor. + + The Open/Preview Parent document entries + allow working with the higher level document (e.g. the email + message an attachment comes from). &RCL; is sometimes not totally + accurate as to what it can or can't do in this area. For example + the Parent entry will also appear for an + email which is part of an mbox folder file, but you can't actually + visualize the mbox (there will be an error dialog if you + try). + + If the document is a top-level file, Open + Parent will start the default file manager on the + enclosing filesystem directory. + + The Find similar entry will select + a number of relevant term from the current document and enter + them into the simple search field. You can then start a simple + search, with a good chance of finding documents related to the + current result. I can't remember a single instance where this + function was actually useful to me... + + The Open Snippets Window entry will only + appear for documents which support page breaks (typically + PDF, Postscript, DVI). The snippets window lists extracts from + the document, taken around search terms occurrences, along with the + corresponding page number, as links which can be used to start + the native viewer on the appropriate page. If the viewer supports + it, its search function will also be primed with one of the + search terms. + + + + + + + The result table + + In &RCL; 1.15 and newer, the results can be displayed in + spreadsheet-like fashion. You can switch to this presentation by + clicking the table-like icon in the toolbar (this is a toggle, + click again to restore the list). + + Clicking on the column headers will allow sorting by the + values in the column. You can click again to invert the order, and + use the header right-click menu to reset sorting to the default + relevance order (you can also use the sort-by-date arrows to do + this). + + Both the list and the table display the same underlying + results. The sort order set from the table is still active if you + switch back to the list mode. You can click twice on a date sort + arrow to reset it from there. + + The header right-click menu allows adding or deleting + columns. The columns can be resized, and their order can be changed + (by dragging). All the changes are recorded when you quit + recoll + + Hovering over a table row will update the detail area at the + bottom of the window with the corresponding values. You can click + the row to freeze the display. The bottom area is equivalent to a + result list paragraph, with links for starting a preview or a + native application, and an equivalent right-click menu. Typing + Esc (the Escape key) will unfreeze the + display. + + + + + Running arbitrary commands on result files (1.20 and later) + + Apart from the Open and Open + With operations, which allow starting an application on a + result document (or a temporary copy), based on its MIME type, it is + also possible to run arbitrary commands on results which are + top-level files, using the Run Script entry in + the results pop-up menu. + + The commands which will appear in the Run + Script submenu must be defined by + .desktop files inside the + scripts subdirectory of the current + configuration directory. + + Here follows an example of a .desktop file, + which could be named for example, + ~/.recoll/scripts/myscript.desktop (the exact + file name inside the directory is irrelevant): + +[Desktop Entry] +Type=Application +Name=MyFirstScript +Exec=/home/me/bin/tryscript %F +MimeType=*/* + + The Name attribute defines the label which will + appear inside the Run Script menu. The + Exec attribute defines the program to be run, + which does not need to actually be a script, of course. The + MimeType attribute is not used, but needs to exist. + + + The commands defined this way can also be used from links + inside the + result paragraph. + + As an example, it might make sense to write a script which + would move the document to the trash and purge it from the &RCL; + index. + + + + + Displaying thumbnails + + The default format for the result list entries and the + detail area of the result table display an icon for each result + document. The icon is either a generic one determined from the + MIME type, or a thumbnail of the document appearance. Thumbnails + are only displayed if found in the standard + freedesktop location, where they would + typically have been created by a file manager. + + Recoll has no capability to create thumbnails. A relatively + simple trick is to use the Open parent + document/folder entry in the result list popup + menu. This should open a file manager window on the containing + directory, which should in turn create the thumbnails (depending on + your settings). Restarting the search should then display the + thumbnails. + + There are also some + pointers about thumbnail generation on the &RCL; wiki. + + + + + + The preview window + + The preview window opens when you first click a + Preview link inside the result list. + + Subsequent preview requests for a given search open new + tabs in the existing window (except if you hold the + Shift key while clicking which will open a new + window for side by side viewing). + + Starting another search and requesting a preview will + create a new preview window. The old one stays open until you + close it. + + You can close a preview tab by typing Ctrl-W + (Ctrl + W) in the + window. Closing the last tab for a window will also close the + window. + + Of course you can also close a preview window by using the + window manager button in the top of the frame. + + You can display successive or previous documents from the + result list inside a preview tab by typing + Shift+Down or + Shift+Up (Down + and Up are the arrow keys). + + A right-click menu in the text area allows switching + between displaying the main text or the contents of fields + associated to the document (ie: author, abtract, etc.). This is + especially useful in cases where the term match did not occur in + the main text but in one of the fields. In the case of + images, you can switch between three displays: the image + itself, the image metadata as extracted + by exiftool and the fields, which is the + metadata stored in the index. + + + You can print the current preview window contents by typing + Ctrl-P (Ctrl + + P) in the window text. + + + + Searching inside the preview + + The preview window has an internal search capability, + mostly controlled by the panel at the bottom of the window, + which works in two modes: as a classical editor incremental + search, where we look for the text entered in the entry + zone, or as a way to walk the matches between the document + and the &RCL; query that found it. + + + + Incremental text search + The preview tabs have an internal incremental search + function. You initiate the search either by typing a + / (slash) or CTL-F + inside the text area or by clicking into + the Search for: text field and + entering the search string. You can then use the + Next + and Previous buttons + to find the next/previous occurrence. You can also type + F3 inside the text area to get to the next + occurrence. + If you have a search string entered and you use + Ctrl-Up/Ctrl-Down to browse the results, the search is + initiated for each successive document. If the string is + found, the cursor will be positioned at the first + occurrence of the search string. + + + + + Walking the match lists + If the entry area is empty when you click + the Next + or Previous buttons, the editor will + be scrolled to show the next match to any search term + (the next highlighted zone). If you select a search group + from the dropdown list and click Next + or Previous, the match list for this + group will be walked. This is not the same as a text + search, because the occurences will include non-exact + matches (as caused by stemming or wildcards). The search + will revert to the text mode as soon as you edit the + entry area. + + + + + + + + + + The Query Fragments window + + Selecting the Tools + Query Fragments menu + entry will open a window with radio- and check-buttons which + can be used to activate query language fragments for + filtering the current query. This can be useful if you have + frequent reusable selectors, for example, filtering on + alternate directories, or searching just one category of + files, not covered by the standard category + selectors. + + The contents of the window are entirely customizable, and + defined by the contents of the fragbuts.xml + file inside the configuration directory. The sample file + distributed with &RCL; (which you should be able to find under + /usr/share/recoll/examples/fragbuts.xml), + contains an example which filters the results from the WEB + history. + + Here follows an example: + +<?xml version="1.0" encoding="UTF-8"?> + +<fragbuts version="1.0"> + + <radiobuttons> + + <fragbut> + <label>Include Web Results</label> + <frag></frag> + </fragbut> + + <fragbut> + <label>Exclude Web Results</label> + <frag>-rclbes:BGL</frag> + </fragbut> + + <fragbut> + <label>Only Web Results</label> + <frag>rclbes:BGL</frag> + </fragbut> + + </radiobuttons> + + <buttons> + + <fragbut> + <label>Year 2010</label> + <frag>date:2010-01-01/2010-12-31</frag> + </fragbut> + + <fragbut> + <label>My Great Directory Only</label> + <frag>dir:/my/great/directory</frag> + </fragbut> + + </buttons> +</fragbuts> + + + + Each radiobuttons or + buttons section defines a line of + checkbuttons or radiobuttons inside the window. Any number of + buttons can be selected, but the radiobuttons in a line are + exclusive. + + Each fragbut section defines the label + for a button, and the Query Language fragment which will be + added (as an AND filter) before performing the query if the + button is active. + + This feature is new in &RCL; 1.20, and will probably be + refined depending on user feedback. + + + + + + Complex/advanced search + + The advanced search dialog helps you build more complex queries + without memorizing the search language constructs. It can be opened + through the Tools menu or through the main + toolbar. + + &RCL; keeps a history of searches. See + + Advanced search history. + + The dialog has two tabs: + + + + The first tab lets you specify terms to search + for, and permits specifying multiple clauses which are combined + to build the search. + + + The second tab lets filter the results according + to file size, date of modification, MIME type, or + location. + + + + + Click on the Start Search button in + the advanced search dialog, or type Enter in + any text field to start the search. The button in + the main window always performs a simple search. + + Click on the Show query details link at + the top of the result page to see the query expansion. + + + Avanced search: the "find" tab + + This part of the dialog lets you constructc a query by + combining multiple clauses of different types. Each entry + field is configurable for the following modes: + + + All terms. + + Any term. + + None of the terms. + + Phrase (exact terms in order within an + adjustable window). + + Proximity (terms in any order within an + adjustable window). + + Filename search. + + + + Additional entry fields can be created by clicking the + Add clause button. + + When searching, the non-empty clauses will be + combined either with an AND or an OR conjunction, depending on + the choice made on the left (All clauses or + Any clause). + + Entries of all types except "Phrase" and "Near" accept + a mix of single words and phrases enclosed in double quotes. + Stemming and wildcard expansion will be performed as for simple + search. + + Phrases and Proximity searches + These two clauses work in similar ways, with the + difference that proximity searches do not impose an order on the + words. In both cases, an adjustable number (slack) of non-matched words + may be accepted between the searched ones (use the counter on + the left to adjust this count). For phrases, the default count + is zero (exact match). For proximity it is ten (meaning that two search + terms, would be matched if found within a window of twelve + words). Examples: a phrase search for quick + fox with a slack of 0 will match quick + fox but not quick brown fox. With + a slack of 1 it will match the latter, but not fox + quick. A proximity search for quick + fox with the default slack will match the + latter, and also a fox is a cunning and quick + animal. + + + + + + Avanced search: the "filter" tab + + This part of the dialog has several sections which allow + filtering the results of a search according to a number of + criteria + + + + + The first section allows filtering by dates of last + modification. You can specify both a minimum and a maximum date. The + initial values are set according to the oldest and newest documents + found in the index. + + + + The next section allows filtering the results by + file size. There are two entries for minimum and maximum + size. Enter decimal numbers. You can use suffix multipliers: + k/K, m/M, + g/G, t/T for 1E3, 1E6, + 1E9, 1E12 respectively. + + + + The next section allows filtering the results by their MIME + types, or MIME categories (ie: media/text/message/etc.). + You can transfer the types between two boxes, to define + which will be included or excluded by the search. + The state of the file type selection can be saved as + the default (the file type filter will not be activated at + program start-up, but the lists will be in the restored + state). + + + + The bottom section allows restricting the search results to a + sub-tree of the indexed area. You can use the + Invert checkbox to search for files not in + the sub-tree instead. If you use directory filtering often and on + big subsets of the file system, you may think of setting up + multiple indexes instead, as the performance may be + better. + You can use relative/partial paths for filtering. Ie, + entering dirA/dirB would match either + /dir1/dirA/dirB/myfile1 or + /dir2/dirA/dirB/someother/myfile2. + + + + + + + + Avanced search history + + The advanced search tool memorizes the last 100 searches + performed. You can walk the saved searches by using the up and + down arrow keys while the keyboard focus belongs to the advanced + search dialog. + + The complex search history can be erased, along with the + one for simple search, by selecting the + File + Erase Search History + menu entry. + + + + + + + The term explorer tool + + &RCL; automatically manages the expansion of search terms + to their derivatives (ie: plural/singular, verb + inflections). But there are other cases where the exact search + term is not known. For example, you may not remember the exact + spelling, or only know the beginning of the name. + + The search will only propose replacement terms with + spelling variations when no matching document were found. In some + cases, both proper spellings and mispellings are present in the + index, and it may be interesting to look for them explicitely. + + The term explorer tool (started from the toolbar icon or + from the Term explorer entry of the + Tools menu) can be used to search the full index + terms list. It has three modes of operations: + + + + Wildcard + In this mode of operation, you can enter a + search string with shell-like wildcards (*, ?, []). ie: + xapi* would display all index terms + beginning with xapi. (More + about wildcards here). + + + + Regular expression + This mode will accept a regular expression + as input. Example: + word[0-9]+. The expression is + implicitely anchored at the beginning. Ie: + press will match + pression but not + expression. You can use + .*press to match the latter, + but be aware that this will cause a full index term list + scan, which can be quite long. + + + + + Stem expansion + This mode will perform the usual stem expansion + normally done as part user input processing. As such it is + probably mostly useful to demonstrate the process. + + + + + Spelling/Phonetic In this + mode, you enter the term as you think it is spelled, and + &RCL; will do its best to find index terms that sound like + your entry. This mode uses the + Aspell spelling application, + which must be installed on your system for things to work + (if your documents contain non-ascii characters, &RCL; + needs an aspell version newer than 0.60 for UTF-8 + support). The language which is used to build the + dictionary out of the index terms (which is done at the + end of an indexing pass) is the one defined by your NLS + environment. Weird things will probably happen if + languages are mixed up. + + + + Note that in cases where &RCL; does not know the beginning + of the string to search for (ie a wildcard expression like + *coll), the expansion can take quite + a long time because the full index term list will have to be + processed. The expansion is currently limited at 10000 results for + wildcards and regular expressions. It is possible to change the + limit in the configuration file. + + Double-clicking on a term in the result list will insert + it into the simple search entry field. You can also cut/paste + between the result list and any entry field (the end of lines + will be taken care of). + + + + + Multiple indexes + + See the section + describing the use of multiple indexes for + generalities. Only the aspects concerning + the recoll GUI are described here. + + A recoll program instance is always + associated with a specific index, which is the one to be updated + when requested from the File menu, but it can + use any number of &RCL; indexes for searching. The external + indexes can be selected through the external + indexes tab in the preferences dialog. + + Index selection is performed in two phases. A set of all + usable indexes must first be defined, and then the subset of + indexes to be used for searching. These parameters + are retained across program executions (there are kept + separately for each &RCL; configuration). The set of all indexes + is usually quite stable, while the active ones might typically + be adjusted quite frequently. + + The main index (defined by + RECOLL_CONFDIR) is always active. If this is + undesirable, you can set up your base configuration to index + an empty directory. + + When adding a new index to the set, you can select either + a &RCL; configuration directory, or directly a &XAP; index + directory. In the first case, the &XAP; index directory will + be obtained from the selected configuration. + + As building the set of all indexes can be a little tedious + when done through the user interface, you can use the + RECOLL_EXTRA_DBS environment + variable to provide an initial set. This might typically be + set up by a system administrator so that every user does not + have to do it. The variable should define a colon-separated list + of index directories, ie: + + export RECOLL_EXTRA_DBS=/some/place/xapiandb:/some/other/db + + Another environment variable, + RECOLL_ACTIVE_EXTRA_DBS allows adding to the active + list of indexes. This variable was suggested and implemented by a + &RCL; user. It is mostly useful if you use scripts to mount + external volumes with &RCL; indexes. By using + RECOLL_EXTRA_DBS and + RECOLL_ACTIVE_EXTRA_DBS, you can add and activate + the index for the mounted volume when starting + recoll. + + + RECOLL_ACTIVE_EXTRA_DBS is available for + &RCL; versions 1.17.2 and later. A change was made in the same + update so that recoll will + automatically deactivate unreachable indexes when starting + up. + + + + + Document history + + Documents that you actually view (with the internal preview + or an external tool) are entered into the document history, + which is remembered. + You can display the history list by using + the Tools/Doc History menu + entry. + You can erase the document history by using the + Erase document history entry in the + File menu. + + + + + Sorting search results and collapsing duplicates + + The documents in a result list are normally sorted in + order of relevance. It is possible to specify a different sort + order, either by using the vertical arrows in the GUI toolbox to + sort by date, or switching to the result table display and clicking + on any header. The sort order chosen inside the result table + remains active if you switch back to the result list, until you + click one of the vertical arrows, until both are unchecked (you are + back to sort by relevance). + + Sort parameters are remembered between program + invocations, but result sorting is normally always inactive + when the program starts. It is possible to keep the sorting + activation state between program invocations by checking the + Remember sort activation state option in + the preferences. + + It is also possible to hide duplicate entries inside + the result list (documents with the exact same contents as the + displayed one). The test of identity is based on an MD5 hash + of the document container, not only of the text contents (so + that ie, a text document with an image added will not be a + duplicate of the text only). Duplicates hiding is controlled + by an entry in the GUI configuration + dialog, and is off by default. + + As of release 1.19, when a result document does have + undisplayed duplicates, a Dups + link will be shown with the result list entry. Clicking the + link will display the paths (URLs + ipaths) for the duplicate + entries. + + + + + Search tips, shortcuts + + + Terms and search expansion + + Term completion + Typing Esc Space in + the simple search entry field while entering a word will + either complete the current word if its beginning matches a + unique term in the index, or open a window to propose a list + of completions. + + + Picking up new terms from result or preview + text + Double-clicking on a word in the result list or in a + preview window will copy it to the simple search entry field. + + + Wildcards + Wildcards can be used inside search terms in all forms + of searches. + More about wildcards. + + + + Automatic suffixes + Words like odt or ods + can be automatically turned into query language + ext:xxx clauses. This can be enabled in the + Search preferences panel in the GUI. + + + + Disabling stem expansion + Entering a capitalized word in any search field will prevent + stem expansion (no search for + gardening if you enter + Garden instead of + garden). This is the only case where + character case should make a difference for a &RCL; + search. You can also disable stem expansion or change the + stemming language in the preferences. + + + Finding related documents + Selecting the Find similar documents entry + in the result list paragraph right-click menu will select a + set of "interesting" terms from the current result, and insert + them into the simple search entry field. You can then possibly + edit the list and start a search to find documents which may + be apparented to the current result. + + + File names + File names are added as terms during indexing, and you can + specify them as ordinary terms in normal search fields (&RCL; used + to index all directories in the file path as terms. This has been + abandoned as it did not seem really useful). Alternatively, you + can use the specific file name search which will + only look for file names, and may be + faster than the generic search especially when using wildcards. + + + + + + + Working with phrases and proximity + + Phrases and Proximity searches + A phrase can be looked for by enclosing it in double + quotes. Example: "user manual" will look + only for occurrences of user immediately + followed by manual. You can use the + This phrase field of the advanced + search dialog to the same effect. Phrases can be entered along + simple terms in all simple or advanced search entry fields + (except This exact phrase). + + + AutoPhrases + This option can be set in the preferences dialog. If it is + set, a phrase will be automatically built and added to simple + searches when looking for Any terms. This + will not change radically the results, but will give a relevance + boost to the results where the search terms appear as a + phrase. Ie: searching for virtual reality + will still find all documents where either + virtual or reality or + both appear, but those which contain virtual + reality should appear sooner in the list. + + + Phrase searches can strongly slow down a query if most of the + terms in the phrase are common. This is why the + autophrase option is off by default for &RCL; + versions before 1.17. As of version 1.17, + autophrase is on by default, but very common + terms will be removed from the constructed phrase. The removal + threshold can be adjusted from the search preferences. + + Phrases and abbreviations As of + &RCL; version 1.17, dotted abbreviations like + I.B.M. are also automatically indexed as a word + without the dots: IBM. Searching for the word + inside a phrase (ie: "the IBM company") will only + match the dotted abrreviation if you increase the phrase slack (using the + advanced search panel control, or the o query + language modifier). Literal occurences of the word will be matched + normally. + + + + + + Others + + Using fields + You can use the query + language and field specifications + to only search certain parts of documents. This can be + especially helpful with email, for example only searching + emails from a specific originator: + search tips from:helpfulgui + + + + Ajusting the result table columns + When displaying results in table mode, you can use a + right click on the table headers to activate a pop-up menu + which will let you adjust what columns are displayed. You can + drag the column headers to adjust their order. You can click + them to sort by the field displayed in the column. You can + also save the result list in CSV format. + + + + Changing the GUI geometry + It is possible to configure the GUI in wide form + factor by dragging the toolbars to one of the sides (their + location is remembered between sessions), and moving the + category filters to a menu (can be set in the + + Preferences + GUI configuration + User interface + panel). + + + Query explanation + You can get an exact description of what the query + looked for, including stem expansion, and Boolean operators + used, by clicking on the result list header. + + + Advanced search history + As of &RCL; 1.18, you can display any of the last 100 complex + searches performed by using the up and down arrow keys while the + advanced search panel is active. + + + Browsing the result list inside a preview + window + Entering Shift-Down or Shift-Up + (Shift + an arrow key) in a preview window will + display the next or the previous document from the result + list. Any secondary search currently active will be executed on + the new document. + + + Scrolling the result list from the keyboard + You can use PageUp and PageDown + to scroll the result list, Shift+Home to go back + to the first page. These work even while the focus is in the + search entry. + + + Result table: moving the focus to the table + You can use Ctrl-r to move the focus + from the search entry to the table, and then use the arrow keys + to change the current row. Ctrl-Shift-s returns to + the search. + + + Result table: open / preview + With the focus in the result table, you can use + Ctrl-o to open the document from the current + row, Ctrl-Shift-o to open the document and close + recoll, Ctrl-d to preview + the document. + + + Editing a new search while the focus is not + in the search entry + You can use the Ctrl-Shift-S shortcut to + return the cursor to the search entry (and select the current + search text), while the focus is anywhere in the main + window. + + + Forced opening of a preview window + You can use Shift+Click on a result list + Preview link to force the creation of a + preview window instead of a new tab in the existing one. + + + Closing previews + Entering Ctrl-W in a tab will + close it (and, for the last tab, close the preview + window). Entering Esc will close the preview + window and all its tabs. + + + Printing previews + Entering Ctrl-P in a preview window will print + the currently displayed text. + + + Quitting + Entering Ctrl-Q almost anywhere will + close the application. + + + + + + Saving and restoring queries (1.21 and later) + + Both simple and advanced query dialogs save recent + history, but the amount is limited: old queries will eventually + be forgotten. Also, important queries may be difficult to find + among others. This is why both types of queries can also be + explicitely saved to files, from the GUI menus: + + File + Save last query / Load last query + + + + The default location for saved queries is a subdirectory + of the current configuration directory, but saved queries are + ordinary files and can be written or moved anywhere. + + Some of the saved query parameters are part of the + preferences (e.g. autophrase or the active + external indexes), and may differ when the query is + loaded from the time it was saved. In this case, &RCL; will warn + of the differences, but will not change the user + preferences. + + + + + Customizing the search interface + + You can customize some aspects of the search interface by using + the GUI configuration entry in the + Preferences menu. + + There are several tabs in the dialog, dealing with the + interface itself, the parameters used for searching and + returning results, and what indexes are searched. + + + + User interface parameters: + + + + Highlight color for query + terms: Terms from the user query are highlighted in + the result list samples and the preview window. The color can + be chosen here. Any Qt color string should work (ie + red, #ff0000). The + default is blue. + + + Style sheet: + The name of a Qt style sheet + text file which is applied to the whole Recoll application + on startup. The default value is empty, but there is a + skeleton style sheet (recoll.qss) + inside the /usr/share/recoll/examples + directory. Using a style sheet, you can change most + recoll graphical parameters: + colors, fonts, etc. See the sample file for a few + simple examples. + You should be aware that parameters (e.g.: the + background color) set inside the &RCL; GUI style sheet + will override global system preferences, with possible + strange side effects: for example if you set the + foreground to a light color and the background to a + dark one in the desktop preferences, but only the + background is set inside the &RCL; style sheet, and it + is light too, then text will appear light-on-light + inside the &RCL; GUI. + + + Maximum text size highlighted for + preview Inserting highlights on search term inside + the text before inserting it in the preview window involves + quite a lot of processing, and can be disabled over the given + text size to speed up loading. + + + Prefer HTML to plain text for + preview if set, Recoll will display HTML as such + inside the preview window. If this causes problems with the Qt + HTML display, you can uncheck it to display the plain text + version instead. + + + Plain text to HTML line style: + when displaying plain text inside the preview window, &RCL; + tries to preserve some of the original text line breaks and + indentation. It can either use PRE HTML tags, which will + well preserve the indentation but will force horizontal + scrolling for long lines, or use BR tags to break at the + original line breaks, which will let the editor introduce + other line breaks according to the window width, but will + lose some of the original indentation. The third option has + been available in recent releases and is probably now the best + one: use PRE tags with line wrapping. + + + Choose editor + applicationsr: this opens a dialog which allows you + to select the application to be used to open each MIME + type. The default is nornally to use the + xdg-open utility, but you can override it. + + + Exceptions: even wen + xdg-open is used by default for opening + documents, you can set exceptions for MIME types that will + still be opened according to &RCL; preferences. This is useful + for passing parameters like page numbers or search strings to + applications that support them + (e.g. evince). This cannot be done + with xdg-open which only supports passing + one parameter. + + + Document filter choice + style: this will let you choose if the document + categories are displayed as a list or a set of buttons, or a + menu. + + + Start with simple search + mode: this lets you choose the value of the simple + search type on program startup. Either a fixed value + (e.g. Query Language, or the value in use + when the program last exited. + + Auto-start simple search on white + space entry: if this is checked, a search will be + executed each time you enter a space in the simple search input + field. This lets you look at the result list as you enter new + terms. This is off by default, you may like it or not... + + + Start with advanced search dialog open + : If you use this dialog frequently, checking + the entries will get it to open when recoll starts. + + + Remember sort activation + state if set, Recoll will remember the sort tool + stat between invocations. It normally starts with sorting + disabled. + + + + + + + + + Result list parameters: + + + + Number of results in a result + page + + + Result list font: There is + quite a lot of information shown in the result list, and you + may want to customize the font and/or font size. The rest of + the fonts used by &RCL; are determined by your generic Qt + config (try the qtconfig command). + + + + Edit result list paragraph format string: + allows you to change the presentation of each result list + entry. See the + result list customisation section. + + + + Edit result page HTML header insert: + allows you to define text inserted at the end of the result + page HTML header. + More detail in the + result list customisation section. + + + + Date format: allows specifying the + format used for displaying dates inside the result list. This + should be specified as an strftime() string (man strftime). + + + + Abstract snippet separator: + for synthetic abstracts built from index data, which are + usually made of several snippets from different parts of the + document, this defines the snippet separator, an ellipsis by + default. + + + + + + + Search parameters: + + + + Hide duplicate results: + decides if result list entries are shown for identical + documents found in different places. + + + Stemming language: + stemming obviously depends on the document's language. This + listbox will let you chose among the stemming databases which + were built during indexing (this is set in the main configuration + file), or later added with recollindex + -s (See the recollindex manual). Stemming languages + which are dynamically added will be deleted at the next + indexing pass unless they are also added in the configuration + file. + + + Automatically add phrase to simple + searches: a phrase will be automatically built and + added to simple searches when looking for Any + terms. This will give a relevance boost to the + results where the search terms appear as a phrase (consecutive + and in order). + + + Autophrase term frequency threshold + percentage: very frequent terms should not be included + in automatic phrase searches for performance reasons. The + parameter defines the cutoff percentage (percentage of the + documents where the term appears). + + + Replace abstracts from + documents: this decides if we should synthesize and + display an abstract in place of an explicit abstract found + within the document itself. + + + Dynamically build + abstracts: this decides if &RCL; tries to build + document abstracts (lists of snippets) + when displaying the result list. Abstracts are constructed by + taking context from the document information, around the search + terms. + + + Synthetic abstract size: + adjust to taste... + + + Synthetic abstract context + words: how many words should be displayed around + each term occurrence. + + + Query language magic file name + suffixes: a list of words which automatically get + turned into ext:xxx file name suffix clauses + when starting a query language query (ie: doc xls + xlsx...). This will save some typing for people who + use file types a lot when querying. + + + + + + + External indexes: + This panel will let you browse for additional indexes + that you may want to search. External indexes are designated by + their database directory (ie: + /home/someothergui/.recoll/xapiandb, + /usr/local/recollglobal/xapiandb). + + + Once entered, the indexes will appear in the + External indexes list, and you can + chose which ones you want to use at any moment by checking or + unchecking their entries. + + Your main database (the one the current configuration + indexes to), is always implicitly active. If this is not + desirable, you can set up your configuration so that it indexes, + for example, an empty directory. An alternative indexer may also + need to implement a way of purging the index from stale data, + + + + The result list format + + Newer versions of Recoll (from 1.17) normally use WebKit HTML + widgets for the result list and the + + snippets window (this may be disabled at build time). + Total customisation is possible with full support for CSS and + Javascript. Conversely, there are limits to what you can do with + the older Qt QTextBrowser, but still, it is possible to decide + what data each result will contain, and how it will be + displayed. + + The result list presentation can be exhaustively customized + by adjusting two elements: + + + The paragraph format + HTML code inside the header section. For + versions 1.21 and later, this is also used for the + + snippets window + + The paragraph format and the header fragment can be edited + from the Result list tab of the + GUI configuration. + + + The header fragment is used both for the result list and + the snippets window. The snippets list is a table and has a + snippets class attribute. Each paragraph in + the result list is a table, with class + respar, but this can be changed by editing + the paragraph format. + + There are a few examples on the + page about + customising the result list on the &RCL; web site. + + + The paragraph format + + This is an arbitrary HTML string where the following printf-like + % substitutions will be performed: + + + + %AAbstract + + %DDate + + %IIcon image + name. This is normally determined from the MIME type. The + associations are defined inside the + + mimeconf configuration file. + If a thumbnail for the file is found at + the standard Freedesktop location, this will be displayed + instead. + + %KKeywords (if + any) + + %LPrecooked Preview, + Edit, and possibly Snippets links + + %MMIME + type + + %Nresult Number inside + the result page + + %PParent folder + Url. In the case of an embedded document, this is the parent folder + for the top level container file. + + %RRelevance + percentage + + %SSize + information + + %TTitle or Filename if + not set. + + %tTitle or Filename if + not set. + + %UUrl + + + + The format of the Preview, Edit, and Snippets links is + <a href="P%N">, + <a href="E%N"> + and + <a href="A%N"> + where docnum (%N) expands to the document + number inside the result page). + + A link target defined as "F%N" will open + the document corresponding to the %P parent + folder expansion, usually creating a file manager window on the + folder where the container file resides. E.g.: + <a href="F%N">%P</a> + + + A link target defined as + R%N|scriptname will + run the corresponding script on the result file (if the document is + embedded, the script will be started on the top-level parent). + See the section about + defining scripts. + + In addition to the predefined values above, all strings + like %(fieldname) will be replaced by the + value of the field named fieldname for this + document. Only stored fields can be accessed in this way, the + value of indexed but not stored fields is not known at this + point in the search process + (see field + configuration). There are currently very few fields + stored by default, apart from the values above + (only author + and filename), so this feature will need + some custom local configuration to be useful. An example + candidate would be the recipient field + which is generated by the message input handlers. + + The default value for the paragraph format string is: + \n" + "\n" + "\n" + "%L  %S   %T
\n" + "%M %D    %U %i
\n" + "%A %K\n" + "\n" +]]>
+ + You may, for example, try the following for a more web-like + experience: + + %T
+%A%U - %S - %L +]]>
+ + Note that the P%N link in the above paragraph makes the title a + preview link. Or the clean looking: + + %L %R +  %T&
%S  +%U + + +
%A
%K +]]>
+
+ + These samples, and some others are + on the web + site, with pictures to show how they look. + + It is also possible to + + define the value of the snippet separator inside the abstract + section. +
+
+
+ +
+ + + Searching with the KDE KIO slave + + + What's this + + The &RCL; KIO slave allows performing a &RCL; search + by entering an appropriate URL in a KDE open dialog, or with an + HTML-based interface displayed in + Konqueror. + + The HTML-based interface is similar to the Qt-based + interface, but slightly less powerful for now. Its advantage is + that you can perform your search while staying fully within the + KDE framework: drag and drop from the result list works normally + and you have your normal choice of applications for opening + files. + + The alternative interface uses a directory view of search + results. Due to limitations in the current KIO slave interface, + it is currently not obviously useful (to me). + + The interface is described in more detail inside a help + file which you can access by entering + recoll:/ inside the + konqueror URL line (this works only if the + recoll KIO slave has been previously installed). + + + The instructions for building this module are located in the + source tree. See: + kde/kio/recoll/00README.txt. Some Linux + distributions do package the kio-recoll module, so check before + diving into the build process, maybe it's already out there ready for + one-click installation. + + + + + Searchable documents + + As a sample application, the &RCL; KIO slave could allow + preparing a set of HTML documents (for example a manual) so that + they become their own search interface inside + konqueror. + + This can be done by either explicitly inserting + ]]> links + around some document areas, or automatically by adding a + very small javascript program to the + documents, like the following example, which would initiate a search by + double-clicking any term: + + <script language="JavaScript"> + function recollsearch() { + var t = document.getSelection(); + window.location.href = 'recoll://search/query?qtp=a&p=0&q=' + + encodeURIComponent(t); + } +</script> + .... +<body ondblclick="recollsearch()"> + + + + + + + + Searching on the command line + + There are several ways to obtain search results as a text + stream, without a graphical interface: + + By passing option to the + recoll program. + + By using the recollq program. + + By writing a custom + Python program, using the + Recoll Python API. + + + + The first two methods work in the same way and accept/need the same + arguments (except for the additional to + recoll). The query to be executed is specified + as command line arguments. + + recollq is not built by default. You can + use the Makefile in the + query directory to build it. This is a very + simple program, and if you can program a little c++, you may find it + useful to taylor its output format to your needs. Not that recollq is + only really useful on systems where the Qt libraries (or even the X11 + ones) are not available. Otherwise, just use recoll + -t, which takes the exact same parameters and options which + are described for recollq + + recollq has a man page (not installed by + default, look in the doc/man directory). The + Usage string is as follows: + +recollq: usage: + -P: Show the date span for all the documents present in the index + [-o|-a|-f] [-q] <query string> + Runs a recoll query and displays result lines. + Default: will interpret the argument(s) as a xesam query string + query may be like: + implicit AND, Exclusion, field spec: t1 -t2 title:t3 + OR has priority: t1 OR t2 t3 OR t4 means (t1 OR t2) AND (t3 OR t4) + Phrase: "t1 t2" (needs additional quoting on cmd line) + -o Emulate the GUI simple search in ANY TERM mode + -a Emulate the GUI simple search in ALL TERMS mode + -f Emulate the GUI simple search in filename mode + -q is just ignored (compatibility with the recoll GUI command line) +Common options: + -c <configdir> : specify config directory, overriding $RECOLL_CONFDIR + -d also dump file contents + -n [first-]<cnt> define the result slice. The default value for [first] + is 0. Without the option, the default max count is 2000. + Use n=0 for no limit + -b : basic. Just output urls, no mime types or titles + -Q : no result lines, just the processed query and result count + -m : dump the whole document meta[] array for each result + -A : output the document abstracts + -S fld : sort by field <fld> + -s stemlang : set stemming language to use (must exist in index...) + Use -s "" to turn off stem expansion + -D : sort descending + -i <dbdir> : additional index, several can be given + -e use url encoding (%xx) for urls + -F <field name list> : output exactly these fields for each result. + The field values are encoded in base64, output in one line and + separated by one space character. This is the recommended format + for use by other programs. Use a normal query with option -m to + see the field names. + + + Sample execution: +recollq 'ilur -nautique mime:text/html' +Recoll query: ((((ilur:(wqf=11) OR ilurs) AND_NOT (nautique:(wqf=11) + OR nautiques OR nautiqu OR nautiquement)) FILTER Ttext/html)) +4 results +text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/comptes.html] [comptes.html] 18593 bytes +text/html [file:///Users/uncrypted-dockes/projets/nautique/webnautique/articles/ilur1/index.html] [Constructio... +text/html [file:///Users/uncrypted-dockes/projets/pagepers/index.html] [psxtcl/writemime/recoll]... +text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/recu-chasse-maree.... + + + + + Path translations + + In some cases, the document paths stored inside the index do + not match the actual ones, so that document + previews and accesses will fail. This can occur in a number of + circumstances: + + When using multiple indexes it is a relatively common + occurrence that some will actually reside on a remote volume, for + exemple mounted via NFS. In this case, the paths used to access + the documents on the local machine are not necessarily the same + than the ones used while indexing on the remote machine. For + example, /home/me may have been used as + a topdirs elements while indexing, but the + directory might be mounted + as /net/server/home/me on the local + machine. + + The case may also occur with removable + disks. It is perfectly possible to configure an index to + live with the documents on the removable disk, but it may + happen that the disk is not mounted at the same place so + that the documents paths from the index are + invalid. + + As a last exemple, one could imagine that a big + directory has been moved, but that it is currently + inconvenient to run the indexer. + + + More generally, the path translation facility may be useful + whenever the documents paths seen by the indexer are not the same + as the ones which should be used at query time. + + &RCL; has a facility for rewriting access paths when + extracting the data from the index. The translations can be + defined for the main index and for any additional query + index. + + In the above NFS example, &RCL; could be instructed to + rewrite any file:///home/me URL from the + index to file:///net/server/home/me, + allowing accesses from the client. + + The translations are defined in the + + ptrans configuration file, which + can be edited by hand or from the GUI external indexes + configuration dialog. + + + + + + The query language + + The query language processor is activated in the GUI + simple search entry when the search mode selector is set to + Query Language. It can also be used with the KIO + slave or the command line search. It broadly has the same + capabilities as the complex search interface in the + GUI. + + The language is based on the (seemingly defunct) + + Xesam user search language specification. + + If the results of a query language search puzzle you and you + doubt what has been actually searched for, you can use the GUI + Show Query link at the top of the result list to + check the exact query which was finally executed by Xapian. + + Here follows a sample request that we are going to + explain: + + + author:"john doe" Beatles OR Lennon Live OR Unplugged -potatoes + + + This would search for all documents with + John Doe + appearing as a phrase in the author field (exactly what this is + would depend on the document type, ie: the + From: header, for an email message), + and containing either beatles or + lennon and either + live or + unplugged but not + potatoes (in any part of the document). + + An element is composed of an optional field specification, + and a value, separated by a colon (the field separator is the last + colon in the element). Examples: + Eugenie, + author:balzac, + dc:title:grandet + dc:title:"eugenie grandet" + + + The colon, if present, means "contains". Xesam defines other + relations, which are mostly unsupported for now (except in special + cases, described further down). + + All elements in the search entry are normally combined + with an implicit AND. It is possible to specify that elements be + OR'ed instead, as in Beatles + OR Lennon. The + OR must be entered literally (capitals), and + it has priority over the AND associations: + word1 + word2 OR + word3 + means + word1 AND + (word2 OR + word3) + not + (word1 AND + word2) OR + word3. Explicit + parenthesis are not supported. + + As of &RCL; 1.21, you can use parentheses to group + elements, which will sometimes make things clearer, and may + allow expressing combinations which would have been difficult + otherwise. + + An element preceded by a - specifies a + term that should not appear. + + As usual, words inside quotes define a phrase + (the order of words is significant), so that + title:"prejudice pride" is not the same as + title:prejudice title:pride, and is + unlikely to find a result. + + Words inside phrases and capitalized words are not + stem-expanded. Wildcards may be used anywhere inside a term. + Specifying a wild-card on the left of a term can produce a very + slow search (or even an incorrect one if the expansion is + truncated because of excessive size). Also see + + More about wildcards. + + To save you some typing, recent &RCL; versions (1.20 and later) + interpret a comma-separated list of terms as an AND list inside the + field. Use slash characters ('/') for an OR list. No white space + is allowed. So + author:john,lennon will search for + documents with john and lennon + inside the author field (in any order), and + author:john/ringo would search for + john or ringo. + + Modifiers can be set on a double-quote value, for example to specify + a proximity search (unordered). See + the modifier + section. No space must separate the final + double-quote and the modifiers value, e.g. "two + one"po10 + + &RCL; currently manages the following default fields: + + + + title, + subject or caption are + synonyms which specify data to be searched for in the + document title or subject. + + + author or + from for searching the documents + originators. + + + recipient or + to for searching the documents + recipients. + + + keyword for searching the + document-specified keywords (few documents actually have + any). + + + filename for the document's + file name. This is not necessarily set for all documents: + internal documents contained inside a compound one (for example + an EPUB section) do not inherit the container file name any more, + this was replaced by an explicit field (see next). Sub-documents + can still have a specific filename, if it is + implied by the document format, for example the attachment file + name for an email attachment. + + containerfilename. This is + set for all documents, both top-level and contained + sub-documents, and is always the name of the filesystem directory + entry which contains the data. The terms from this field can + only be matched by an explicit field specification (as opposed + to terms from filename which are also indexed + as general document content). This avoids getting matches for + all the sub-documents when searching for the container file + name. + + ext specifies the file + name extension (Ex: ext:html) + + + + + &RCL; 1.20 and later have a way to specify aliases for the + field names, which will save typing, for example by aliasing + filename to fn or + containerfilename to + cfn. See the section about the + fields file + + The field syntax also supports a few field-like, but + special, criteria: + + + + dir for filtering the + results on file location + (Ex: dir:/home/me/somedir). + -dir + also works to find results not in the specified directory + (release >= 1.15.8). Tilde expansion will be performed as + usual (except for a bug in versions 1.19 to + 1.19.11p1). Wildcards will be expanded, but + please have a + look at an important limitation of wildcards in + path filters. + + Relative paths also make sense, for example, + dir:share/doc would match either + /usr/share/doc or + /usr/local/share/doc + + Several dir clauses can be specified, + both positive and negative. For example the following makes sense: + +dir:recoll dir:src -dir:utils -dir:common + This would select results which have both + recoll and src in the + path (in any order), and which have not either + utils or + common. + + You can also use OR conjunctions + with dir: clauses. + + A special aspect of dir clauses is + that the values in the index are not transcoded to UTF-8, and + never lower-cased or unaccented, but stored as binary. This means + that you need to enter the values in the exact lower or upper + case, and that searches for names with diacritics may sometimes + be impossible because of character set conversion + issues. Non-ASCII UNIX file paths are an unending source of + trouble and are best avoided. + + You need to use double-quotes around the path value if it + contains space characters. + + + + size for filtering the + results on file size. Example: + size<10000. You can use + <, > or + = as operators. You can specify a range like the + following: size>100 size<1000. The usual + k/K, m/M, g/G, t/T can be used as (decimal) + multipliers. Ex: size>1k to search for files + bigger than 1000 bytes. + + + date for searching or filtering + on dates. The syntax for the argument is based on the ISO8601 + standard for dates and time intervals. Only dates are supported, no + times. The general syntax is 2 elements separated by a + / character. Each element can be a date or a + period of time. Periods are specified as + PnYnMnD. + The n numbers are the respective numbers + of years, months or days, any of which may be missing. Dates are + specified as + YYYY-MM-DD. + The days and months parts may be missing. If the + / is present but an element is missing, the + missing element is interpreted as the lowest or highest date in the + index. Examples: + + + 2001-03-01/2002-05-01 the + basic syntax for an interval of dates. + + 2001-03-01/P1Y2M the + same specified with a period. + + 2001/ from the beginning of + 2001 to the latest date in the index. + + 2001 the whole year of + 2001 + P2D/ means 2 days ago up to + now if there are no documents with dates in the future. + + /2003 all documents from + 2003 or older. + + + Periods can also be specified with small letters (ie: + p2y). + + + mime or + format for specifying the + MIME type. This one is quite special because you can specify + several values which will be OR'ed (the normal default for the + language is AND). Ex: mime:text/plain + mime:text/html. Specifying an explicit boolean + operator before a + mime specification is not supported and + will produce strange results. You can filter out certain types + by using negation (-mime:some/type), and you can + use wildcards in the value (mime:text/*). + Note that mime is + the ONLY field with an OR default. You do need to use + OR with ext terms for + example. + + + type or + rclcat for specifying the category (as in + text/media/presentation/etc.). The classification of MIME + types in categories is defined in the &RCL; configuration + (mimeconf), and can be modified or + extended. The default category names are those which permit + filtering results in the main GUI screen. Categories are OR'ed + like MIME types above. This can't be negated with + - either. + + + + + The document input handlers used while indexing have the + possibility to create other fields with arbitrary names, and + aliases may be defined in the configuration, so that the exact + field search possibilities may be different for you if someone + took care of the customisation. + + + Modifiers + + Some characters are recognized as search modifiers when found + immediately after the closing double quote of a phrase, as in + "some term"modifierchars. The actual "phrase" + can be a single term of course. Supported modifiers: + + + l can be used to turn off + stemming (mostly makes sense with p because + stemming is off by default for phrases). + + + s can be used to turn off + synonym expansion, if a synonyms file is in place (only for + &RCL; 1.22 and later). + + + o can be used to specify a + "slack" for phrase and proximity searches: the number of + additional terms that may be found between the specified + ones. If o is followed by an integer number, + this is the slack, else the default is 10. + + + p can be used to turn the + default phrase search into a proximity one + (unordered). Example: "order any in"p + + + C will turn on case + sensitivity (if the index supports it). + + D will turn on diacritics + sensitivity (if the index supports it). + + A weight can be specified for a query element + by specifying a decimal value at the start of the + modifiers. Example: "Important"2.5. + + + + + + + + + + + + Search case and diacritics sensitivity + + For &RCL; versions 1.18 and later, and when working + with a raw index (not the default), searches can be + made sensitive + to character case and diacritics. How this happens is controlled by + configuration variables and what search data is entered. + + The general default is that searches are insensitive to case + and diacritics. An entry of resume will match any + of Resume, RESUME, + résumé, Résumé etc. + + Two configuration variables can automate switching on + sensitivity: + + + + + autodiacsensIf this is set, search + sensitivity to diacritics will be turned on as soon as an + accented character exists in a search term. When the variable + is set to true, resume will start a + diacritics-unsensitive search, but résumé + will be matched exactly. The default value is + false. + + + + autocasesensIf this is set, search + sensitivity to character case will be turned on as soon as an + upper-case character exists in a search term except + for the first one. When the variable is set to + true, us or Us will + start a diacritics-unsensitive search, but + US will be matched exactly. The default + value is true (contrary to + autodiacsens). + + + + + As in the past, capitalizing the first letter of a word will + turn off its stem expansion and have no effect on + case-sensitivity. + + You can also explicitely activate case and diacritics + sensitivity by using modifiers with the query + language. C will make the term case-sensitive, and + D will make it + diacritics-sensitive. Examples: + + "us"C + + + will search for the term us exactly + (Us will not be a match). + + + "resume"D + + will search for the term resume exactly + (résumé will not be a match). + + + When either case or diacritics sensitivity is activated, stem + expansion is turned off. Having both does not make much sense. + + + + + Anchored searches and wildcards + + Some special characters are interpreted by &RCL; in search + strings to expand or specialize the search. Wildcards expand a root + term in controlled ways. Anchor characters can restrict a search to + succeed only if the match is found at or near the beginning of the + document or one of its fields. + + + More about wildcards + + All words entered in &RCL; search fields will be processed + for wildcard expansion before the request is finally + executed. + + The wildcard characters are: + + + * which matches 0 or more + characters. + + ? which matches + a single character. + + [] which allow + defining sets of characters to be matched (ex: + [abc] + matches a single character which may be 'a' or 'b' or 'c', + [0-9] + matches any number. + + + + You should be aware of a few things when using + wildcards. + + + Using a wildcard character at the beginning of + a word can make for a slow search because &RCL; will have to + scan the whole index term list to find the + matches. However, this is much less a problem for field + searches, and queries + like author:*@domain.com can + sometimes be very useful. + + For &RCL; version 18 only, when working with a + raw index (preserving character case and diacritics), the + literal part of a wildcard expression will be matched + exactly for case and diacritics. This is not true any + more for versions 19 and later. + + Using a * at the end of a + word can produce more matches than you would think, and + strange search results. You can use the + term + explorer tool to check what completions exist for + a given term. You can also see exactly what search was + performed by clicking on the link at the top of the result + list. In general, for natural language terms, stem + expansion will produce better results than an + ending * (stem expansion is turned off + when any wildcard character appears in the + term). + + + + Wildcards and path filtering + + Due to the way that &RCL; processes wildcards + inside dir path filtering clauses, they + will have a multiplicative effect on the query size. A clause + containg wildcards in several paths elements, like, for + example, + dir:/home/me/*/*/docdir, + will almost certainly fail if your indexed tree is of any realistic + size. + + Depending on the case, you may be able to work around + the issue by specifying the paths elements more narrowly, with + a constant prefix, or by using 2 + separate dir: clauses instead of multiple + wildcards, as + in dir:/home/me dir:docdir. The + latter query is not equivalent to the initial one because it + does not specify a number of directory levels, but that's + the best we can do (and it may be actually more useful in + some cases). + + + + + + + Anchored searches + + Two characters are used to specify that a search hit should + occur at the beginning or at the end of the + text. ^ at the beginning of a term or phrase + constrains the search to happen at the start, $ + at the end force it to happen at the end. + + As this function is implemented as a phrase search it is + possible to specify a maximum distance at which the hit should + occur, either through the controls of the advanced search panel, or + using the query language, for example, as in: + "^someterm"o10 which would force + someterm to be found within 10 terms of the + start of the text. This can be combined with a field search as in + somefield:"^someterm"o10 or + somefield:someterm$. + + This feature can also be used with an actual phrase search, + but in this case, the distance applies to the whole phrase and + anchor, so that, for example, bla bla my unexpected + term at the beginning of the text would be a match for + "^my term"o5. + + Anchored searches can be very useful for searches inside + somewhat structured documents like scientific articles, in case + explicit metadata has not been supplied (a most frequent case), for + example for looking for matches inside the abstract or the list of + authors (which occur at the top of the document). + + + + + + + + Desktop integration + + Being independant of the desktop type has its drawbacks: &RCL; + desktop integration is minimal. However there are a few tools + available: + + + The KDE KIO Slave was + described in a previous + section. + + + If you use a recent version of Ubuntu Linux, you may + find the Ubuntu Unity + Lens module useful. + + + There is also an independantly developed + + Krunner plugin. + + + + + Here follow a few other things that may help. + + + Hotkeying recoll + + It is surprisingly convenient to be able to show or hide the + &RCL; GUI with a single keystroke. Recoll comes with a small + Python script, based on the libwnck window + manager interface library, which will allow you to do just + this. The detailed instructions are on + this wiki page. + + + + + The KDE Kicker Recoll applet + + This is probably obsolete now. Anyway: + The &RCL; source tree contains the source code to the + recoll_applet, a small application derived + from the find_applet. This can be used to + add a small &RCL; launcher to the KDE panel. + + The applet is not automatically built with the main &RCL; + programs, nor is it included with the main source distribution + (because the KDE build boilerplate makes it relatively big). You can + download its source from the recoll.org download page. Use the + omnipotent configure;make;make install + incantation to build and install. + + You can then add the applet to the panel by right-clicking the + panel and choosing the Add applet entry. + + The recoll_applet has a small text + window where you can type a &RCL; query (in query language form), + and an icon which can be used to restrict the search to certain + types of files. It is quite primitive, and launches a new recoll + GUI instance every time (even if it is already running). You may + find it useful anyway. + + + + + +
+ + + + Programming interface + + &RCL; has an Application Programming Interface, usable both + for indexing and searching, currently accessible from the + Python language. + + Another less radical way to extend the application is to + write input handlers for new types of documents. + + The processing of metadata attributes for documents + (fields) is highly configurable. + + + + + Writing a document input handler + + TerminologyThe small programs or pieces + of code which handle the processing of the different document + types for &RCL; used to be called filters, + which is still reflected in the name of the directory which + holds them and many configuration variables. They were named + this way because one of their primary functions is to filter + out the formatting directives and keep the text + content. However these modules may have other behaviours, and + the term input handler is now progressively + substituted in the documentation. filter is + still used in many places though. + + &RCL; input handlers cooperate to translate from the multitude + of input document formats, simple ones + as opendocument, + acrobat), or compound ones such + as Zip + or Email, into the final &RCL; + indexing input format, which is plain text. + Most input handlers are executable + programs or scripts. A few handlers are coded in C++ and live + inside recollindex. This latter kind will not + be described here. + + There are currently (1.18 and since 1.13) two kinds of + external executable input handlers: + + Simple exec handlers + run once and exit. They can be bare programs like + antiword, or scripts using other + programs. They are very simple to write, because they just + need to print the converted document to the standard + output. Their output can be plain text or HTML. HTML is + usually preferred because it can store metadata fields and + it allows preserving some of the formatting for the GUI + preview. + + Multiple execm handlers + can process multiple files (sparing the process startup + time which can be very significant), or multiple documents + per file (e.g.: for zip or + chm files). They communicate + with the indexer through a simple protocol, but are + nevertheless a bit more complicated than the older + kind. Most of new handlers are written in + Python, using a common module + to handle the protocol. There is an exception, + rclimg which is written in Perl. The + subdocuments output by these handlers can be directly + indexable (text or HTML), or they can be other simple or + compound documents that will need to be processed by + another handler. + + + + + In both cases, handlers deal with regular file system + files, and can process either a single document, or a + linear list of documents in each file. &RCL; is responsible + for performing up to date checks, deal with more complex + embedding and other upper level issues. + + A simple handler returning a + document in text/plain format, can transfer + no metadata to the indexer. Generic metadata, like document + size or modification date, will be gathered and stored by + the indexer. + + Handlers that produce text/html + format can return an arbitrary amount of metadata inside HTML + meta tags. These will be processed + according to the directives found in + the + fields configuration + file. + + The handlers that can handle multiple documents per file + return a single piece of data to identify each document inside + the file. This piece of data, called + an ipath element will be sent back by + &RCL; to extract the document at query time, for previewing, + or for creating a temporary file to be opened by a + viewer. + + The following section describes the simple + handlers, and the next one gives a few explanations about + the execm ones. You could conceivably + write a simple handler with only the elements in the + manual. This will not be the case for the other ones, for + which you will have to look at the code. + + + Simple input handlers + + &RCL; simple handlers are usually shell-scripts, but this is in + no way necessary. Extracting the text from the native format is the + difficult part. Outputting the format expected by &RCL; is + trivial. Happily enough, most document formats have translators or + text extractors which can be called from the handler. In some cases + the output of the translating program is completely appropriate, + and no intermediate shell-script is needed. + + Input handlers are called with a single argument which is the + source file name. They should output the result to stdout. + + When writing a handler, you should decide if it will output + plain text or HTML. Plain text is simpler, but you will not be able + to add metadata or vary the output character encoding (this will be + defined in a configuration file). Additionally, some formatting may + be easier to preserve when previewing HTML. Actually the deciding factor + is metadata: &RCL; has a way to + extract metadata from the HTML header and use it for field + searches.. + + The RECOLL_FILTER_FORPREVIEW environment + variable (values yes, no) + tells the handler if the operation is for indexing or + previewing. Some handlers use this to output a slightly different + format, for example stripping uninteresting repeated keywords (ie: + Subject: for email) when indexing. This is not + essential. + + You should look at one of the simple handlers, for example + rclps for a starting point. + + Don't forget to make your handler executable before + testing ! + + + + + "Multiple" handlers + + If you can program and want to write + an execm handler, it should not be too + difficult to make sense of one of the existing modules. For + example, look at rclzip which uses Zip + file paths as identifiers (ipath), + and rclics, which uses an integer + index. Also have a look at the comments inside + the internfile/mh_execm.h file and + possibly at the corresponding module. + + execm handlers sometimes need to make + a choice for the nature of the ipath + elements that they use in communication with the + indexer. Here are a few guidelines: + + Use ASCII or UTF-8 (if the identifier is an + integer print it, for example, like printf %d would + do). + If at all possible, the data should make some + kind of sense when printed to a log file to help with + debugging. + &RCL; uses a colon (:) as a + separator to store a complex path internally (for + deeper embedding). Colons inside + the ipath elements output by a + handler will be escaped, but would be a bad choice as a + handler-specific separator (mostly, again, for + debugging issues). + + In any case, the main goal is that it should + be easy for the handler to extract the target document, given + the file name and the ipath + element. + + execm handlers will also produce + a document with a null ipath + element. Depending on the type of document, this may have + some associated data (e.g. the body of an email message), or + none (typical for an archive file). If it is empty, this + document will be useful anyway for some operations, as the + parent of the actual data documents. + + + + Telling &RCL; about the handler + + There are two elements that link a file to the handler which + should process it: the association of file to MIME type and the + association of a MIME type with a handler. + + The association of files to MIME types is mostly based on + name suffixes. The types are defined inside the + + mimemap file. Example: + + +.doc = application/msword + + If no suffix association is found for the file name, &RCL; will try + to execute the file -i command to determine a + MIME type. + + The association of file types to handlers is performed in + the + mimeconf file. A sample will probably be + of better help than a long explanation: + + +[index] +application/msword = exec antiword -t -i 1 -m UTF-8;\ + mimetype = text/plain ; charset=utf-8 + +application/ogg = exec rclogg + +text/rtf = exec unrtf --nopict --html; charset=iso-8859-1; mimetype=text/html + +application/x-chm = execm rclchm + + + The fragment specifies that: + + + application/msword files + are processed by executing the antiword + program, which outputs + text/plain encoded in + utf-8. + + + application/ogg files are + processed by the rclogg script, with + default output type (text/html, with + encoding specified in the header, or utf-8 + by default). + + + text/rtf is processed by + unrtf, which outputs + text/html. The + iso-8859-1 encoding is specified because it + is not the utf-8 default, and not output by + unrtf in the HTML header section. + + application/x-chm is processed + by a persistant handler. This is determined by the + execm keyword. + + + + + + + + Input handler HTML output + + The output HTML could be very minimal like the following + example: + +<html> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + </head> + <body> + Some text content + </body> +</html> + + + + You should take care to escape some + characters inside the text by transforming them into + appropriate entities. At the very minimum, + "&" should be transformed into + "&amp;", "<" + should be transformed into + "&lt;". This is not always properly + done by translating programs which output HTML, and of + course never by those which output plain text. + + When encapsulating plain text in an HTML body, + the display of a preview may be improved by enclosing the + text inside <pre> tags. + + The character set needs to be specified in the + header. It does not need to be UTF-8 (&RCL; will take care + of translating it), but it must be accurate for good + results. + + &RCL; will process meta tags inside + the header as possible document fields candidates. Documents + fields can be processed by the indexer in different ways, + for searching or displaying inside query results. This is + described in a following + section. + + + By default, the indexer will process the standard header + fields if they are present: title, + meta/description, + and meta/keywords are both indexed and stored + for query-time display. + + A predefined non-standard meta tag + will also be processed by &RCL; without further + configuration: if a date tag is present + and has the right format, it will be used as the document + date (for display and sorting), in preference to the file + modification date. The date format should be as follows: + +<meta name="date" content="YYYY-mm-dd HH:MM:SS"> +or +<meta name="date" content="YYYY-mm-ddTHH:MM:SS"> + + Example: + +<meta name="date" content="2013-02-24 17:50:00"> + + + + Input handlers also have the possibility to "invent" field + names. This should also be output as meta tags: + + +<meta name="somefield" content="Some textual data" /> + + + You can embed HTML markup inside the content of custom + fields, for improving the display inside result lists. In this + case, add a (wildly non-standard) markup + attribute to tell &RCL; that the value is HTML and should not + be escaped for display. + + +<meta name="somefield" markup="html" content="Some <i>textual</i> data" /> + + + As written above, the processing of fields is described + in a further + section. + + + + + Page numbers + + The indexer will interpret ^L characters + in the handler output as indicating page breaks, and will record + them. At query time, this allows starting a viewer on the right + page for a hit or a snippet. Currently, only the PDF, Postscript + and DVI handlers generate page breaks. + + + + + + + Field data processing + + Fields are named pieces of information + in or about documents, like title, + author, abstract. + + The field values for documents can appear in several ways + during indexing: either output by input handlers + as meta fields in the HTML header section, or + extracted from file extended attributes, or added as attributes + of the Doc object when using the API, or + again synthetized internally by &RCL;. + + The &RCL; query language allows searching for text in a + specific field. + + &RCL; defines a number of default fields. Additional + ones can be output by handlers, and described in the + fields configuration file. + + Fields can be: + + + indexed, meaning that their + terms are separately stored in inverted lists (with a specific + prefix), and that a field-specific search is possible. + + + stored, meaning that their + value is recorded in the index data record for the document, + and can be returned and displayed with search results. + + + + + A field can be either or both indexed and stored. This and + other aspects of fields handling is defined inside the + fields configuration file. + + The sequence of events for field processing is as follows: + + During indexing, + recollindex scans all meta + fields in HTML documents (most document types are transformed + into HTML at some point). It compares the name for each element + to the configuration defining what should be done with fields + (the fields file) + + If the name for the meta + element matches one for a field that should be indexed, the + contents are processed and the terms are entered into the index + with the prefix defined in the fields + file. + + If the name for the meta element + matches one for a field that should be stored, the content of the + element is stored with the document data record, from which it + can be extracted and displayed at query time. + + At query time, if a field search is performed, the + index prefix is computed and the match is only performed against + appropriately prefixed terms in the index. + + At query time, the field can be displayed inside + the result list by using the appropriate directive in the + definition of the result list paragraph + format. All fields are displayed on the fields screen of + the preview window (which you can reach through the right-click + menu). This is independant of the fact that the search which + produced the results used the field or not. + + + + + You can find more information in the + section about the + fields file, or in comments inside the + file. + + You can also have a look at the + example on the Wiki, + detailing how one could add a page count field + to pdf documents for displaying inside result lists. + + + + + + API + + + Interface elements + + A few elements in the interface are specific and and need + an explanation. + + + + + udi An udi (unique document + identifier) identifies a document. Because of limitations + inside the index engine, it is restricted in length (to + 200 bytes), which is why a regular URI cannot be used. The + structure and contents of the udi is defined by the + application and opaque to the index engine. For example, + the internal file system indexer uses the complete + document path (file path + internal path), truncated to + length, the suppressed part being replaced by a hash + value. + + + + ipath + + This data value (set as a field in the Doc + object) is stored, along with the URL, but not indexed by + &RCL;. Its contents are not interpreted, and its use is up + to the application. For example, the &RCL; internal file + system indexer stores the part of the document access path + internal to the container file (ipath in + this case is a list of subdocument sequential numbers). url + and ipath are returned in every search result and permit + access to the original document. + + + + + Stored and indexed fields + + The fields file inside + the &RCL; configuration defines which document fields are + either "indexed" (searchable), "stored" (retrievable with + search results), or both. + + + + + + Data for an external indexer, should be stored in a + separate index, not the one for the &RCL; internal file system + indexer, except if the latter is not used at all). The reason + is that the main document indexer purge pass would remove all + the other indexer's documents, as they were not seen during + indexing. The main indexer documents would also probably be a + problem for the external indexer purge operation. + + + + + Python interface + + + Introduction + + &RCL; versions after 1.11 define a Python programming + interface, both for searching and indexing. The indexing + portion has seen little use, but the searching one is used + in the Recoll Ubuntu Unity Lens and Recoll Web UI. + + The API is inspired by the Python database API + specification. There were two major changes in recent &RCL; + versions: + + The basis for the &RCL; API changed from Python + database API version 1.0 (&RCL; versions up to 1.18.1), + to version 2.0 (&RCL; 1.18.2 and later). + The recoll module became a + package (with an internal recoll + module) as of &RCL; version 1.19, in order to add more + functions. For existing code, this only changes the way + the interface must be imported. + + + + We will mostly describe the new API and package + structure here. A paragraph at the end of this section will + explain a few differences and ways to write code + compatible with both versions. + + The Python interface can be found in the source package, + under python/recoll. + + The python/recoll/ directory + contains the usual setup.py. After + configuring the main &RCL; code, you can use the script to + build and install the Python module: + + cd recoll-xxx/python/recoll + python setup.py build + python setup.py install + + + + The normal &RCL; installer installs the Python + API along with the main code. + + When installing from a repository, and depending on the + distribution, the Python API can sometimes be found in a + separate package. + + + + + Recoll package + + The recoll package contains two + modules: + + The recoll module contains + functions and classes used to query (or update) the + index. + The rclextract module contains + functions and classes used to access document + data. + + + + + + The recoll module + + + Functions + + + + connect(confdir=None, extra_dbs=None, + writable = False) + + The connect() function connects to + one or several &RCL; index(es) and returns + a Db object. + + confdir may specify + a configuration directory. The usual defaults + apply. + extra_dbs is a list of + additional indexes (Xapian directories). + writable decides if + we can index new data through this + connection. + + This call initializes the recoll module, and it should + always be performed before any other call or object creation. + + + + + + + + + Classes + + + The Db class + + A Db object is created by + a connect() call and holds a + connection to a Recoll index. + + Methods + + Db.close() + Closes the connection. You can't do anything + with the Db object after + this. + + + Db.query(), Db.cursor() These + aliases return a blank Query object + for this index. + + + + Db.setAbstractParams(maxchars, + contextwords) Set the parameters used + to build snippets (sets of keywords in context text + fragments). maxchars defines the + maximum total size of the abstract. + contextwords defines how many + terms are shown around the keyword. + + + + Db.termMatch(match_type, expr, field='', + maxlen=-1, casesens=False, diacsens=False, lang='english') + + Expand an expression against the + index term list. Performs the basic function from the + GUI term explorer tool. match_type + can be either + of wildcard, regexp + or stem. Returns a list of terms + expanded from the input expression. + + + + + + + + + + The Query class + + A Query object (equivalent to a + cursor in the Python DB API) is created by + a Db.query() call. It is used to + execute index searches. + + + Methods + + + Query.sortby(fieldname, ascending=True) + Sort results + by fieldname, in ascending + or descending order. Must be called before executing + the search. + + + + Query.execute(query_string, stemming=1, + stemlang="english") + Starts a search + for query_string, a &RCL; + search language string. + + + + Query.executesd(SearchData) + Starts a search for the query defined by the + SearchData object. + + + + Query.fetchmany(size=query.arraysize) + + Fetches + the next Doc objects in the current + search results, and returns them as an array of the + required size, which is by default the value of + the arraysize data member. + + + + Query.fetchone() + Fetches the next Doc object + from the current search results. + + + + Query.close() + Closes the query. The object is unusable + after the call. + + + + Query.scroll(value, mode='relative') + Adjusts the position in the current result + set. mode can + be relative + or absolute. + + + + Query.getgroups() + Retrieves the expanded query terms as a list + of pairs. Meaningful only after executexx In each + pair, the first entry is a list of user terms (of size + one for simple terms, or more for group and phrase + clauses), the second a list of query terms as derived + from the user terms and used in the Xapian + Query. + + + + Query.getxquery() + Return the Xapian query description as a Unicode string. + Meaningful only after executexx. + + + + Query.highlight(text, ishtml = 0, methods = object) + Will insert <span "class=rclmatch">, + </span> tags around the match areas in the input text + and return the modified text. ishtml + can be set to indicate that the input text is HTML and + that HTML special characters should not be escaped. + methods if set should be an object + with methods startMatch(i) and endMatch() which will be + called for each match and should return a begin and end + tag + + + + Query.makedocabstract(doc, methods = object)) + Create a snippets abstract + for doc (a Doc + object) by selecting text around the match terms. + If methods is set, will also perform highlighting. See + the highlight method. + + + + + Query.__iter__() and Query.next() + So that things like for doc in + query: will work. + + + + + Data descriptors + + Query.arraysize Default + number of records processed by fetchmany (r/w). + + Query.rowcountNumber of + records returned by the last execute. + Query.rownumberNext index + to be fetched from results. Normally increments after + each fetchone() call, but can be set/reset before the + call to effect seeking (equivalent to + using scroll()). Starts at + 0. + + + + + + + + + The Doc class + + A Doc object contains index data + for a given document. The data is extracted from the + index when searching, or set by the indexer program when + updating. The Doc object has many attributes to be read or + set by its user. It matches exactly the Rcl::Doc C++ + object. Some of the attributes are predefined, but, + especially when indexing, others can be set, the name of + which will be processed as field names by the indexing + configuration. Inputs can be specified as Unicode or + strings. Outputs are Unicode objects. All dates are + specified as Unix timestamps, printed as strings. Please + refer to the rcldb/rcldoc.h C++ file + for a description of the predefined attributes. + + At query time, only the fields that are defined + as stored either by default or in + the fields configuration file will be + meaningful in the Doc + object. Especially this will not be the case for the + document text. See the rclextract + module for accessing document contents. + + + Methods + + + get(key), [] operator + Retrieve the named doc attribute + + getbinurl()Retrieve + the URL in byte array format (no transcoding), for use as + parameter to a system call. + + + items() + Return a dictionary of doc object + keys/values + + + keys() + list of doc object keys (attribute + names). + + + + + + + The SearchData class + + A SearchData object allows building + a query by combining clauses, for execution + by Query.executesd(). It can be used + in replacement of the query language approach. The + interface is going to change a little, so no detailed doc + for now... + + + Methods + + + addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub', + qstring=string, slack=0, field='', stemming=1, + subSearch=SearchData) + + + + + + + + + + + The rclextract module + + Index queries do not provide document content (only a + partial and unprecise reconstruction is performed to show the + snippets text). In order to access the actual document data, + the data extraction part of the indexing process + must be performed (subdocument access and format + translation). This is not trivial in + general. The rclextract module currently + provides a single class which can be used to access the data + content for result documents. + + + Classes + + + The Extractor class + + + Methods + + + Extractor(doc) + An Extractor object is + built from a Doc object, output + from a query. + + + Extractor.textextract(ipath) + Extract document defined + by ipath and return + a Doc object. The doc.text field + has the document text converted to either text/plain or + text/html according to doc.mimetype. The typical use + would be as follows: + +qdoc = query.fetchone() +extractor = recoll.Extractor(qdoc) +doc = extractor.textextract(qdoc.ipath) +# use doc.text, e.g. for previewing + + + + + Extractor.idoctofile(ipath, targetmtype, outfile='') + Extracts document into an output file, + which can be given explicitly or will be created as a + temporary file to be deleted by the caller. Typical use: + +qdoc = query.fetchone() +extractor = recoll.Extractor(qdoc) +filename = extractor.idoctofile(qdoc.ipath, qdoc.mimetype) + + + + + + + + + + + + + + Example code + + The following sample would query the index with a user + language string. See the python/samples + directory inside the &RCL; source for other + examples. The recollgui subdirectory + has a very embryonic GUI which demonstrates the + highlighting and data extraction functions. + + +#!/usr/bin/env python + 5: + nres = 5 +for i in range(nres): + doc = query.fetchone() + print "Result #%d" % (query.rownumber,) + for k in ("title", "size"): + print k, ":", getattr(doc, k).encode('utf-8') + abs = db.makeDocAbstract(doc, query).encode('utf-8') + print abs + print + +]]> + + + + + + Compatibility with the previous version + + The following code fragments can be used to ensure that + code can run with both the old and the new API (as long as it + does not use the new abilities of the new API of + course). + + Adapting to the new package structure: + + + + + Adapting to the change of nature of + the next Query + member. The same test can be used to choose to use + the scroll() method (new) or set + the next value (old). + + + + + + + + + + + + + Installation and configuration + + + Installing a binary copy + + + &RCL; binary copies are always distributed as regular + packages for your system. They can be obtained either through + the system's normal software distribution framework (e.g. + Debian/Ubuntu apt, + FreeBSD ports, etc.), or from some type + of "backports" repository providing versions newer than the standard + ones, or found on the &RCL; WEB site in some + cases. + + There used to exist another form of binary install, as + pre-compiled source trees, but these are just less convenient than + the packages and don't exist any more. + + The package management tools will usually automatically + deal with hard dependancies for packages obtained from a proper + package repository. You will have to deal with them by hand for + downloaded packages (for example, when dpkg + complains about missing dependancies). + + In all cases, you will have to check or install supporting applications + for the file types that you want to index beyond those that are + natively processed by &RCL; (text, HTML, email files, and a few + others). + + You should also maybe have a look at the + configuration section + (but this may not be necessary for a quick test with default + parameters). Most parameters can be more conveniently set from the + GUI interface. + + + + + Supporting packages + + &RCL; uses external applications to index some file + types. You need to install them for the file types that you wish to + have indexed (these are run-time optional dependencies. None is + needed for building or running &RCL; except for indexing their + specific file type). + + After an indexing pass, the commands that were found + missing can be displayed from the recoll + File menu. The list is stored in the + missing text file inside the configuration + directory. + + A list of common file types which need external + commands follows. Many of the handlers need the + iconv command, which is not always listed as a + dependancy. + + Please note that, due to the relatively dynamic nature of this + information, the most up to date version is now kept on &RCLAPPS; + along with links to the home pages or best source/patches pages, + and misc tips. The list below is not updated often and may be quite + stale. + + For many Linux distributions, most of the commands listed can + be installed from the package repositories. However, the packages + are sometimes outdated, or not the best version for &RCL;, so you + should take a look at &RCLAPPS; if a file + type is important to you. + + As of &RCL; release 1.14, a number of XML-based formats that + were handled by ad hoc handler code now use the + xsltproc command, which usually comes with + libxslt. These are: abiword, fb2 + (ebooks), kword, openoffice, svg. + + Now for the list: + + + Openoffice files need unzip and + xsltproc. + + PDF files need pdftotext + which is part of Poppler (usually + comes with the poppler-utils + package). Avoid the original one from + Xpdf. + + Postscript files need pstotext. + The original version has an issue with shell + character in file names, which is corrected in recent + packages. See &RCLAPPS; for more detail. + + + MS Word needs + antiword. It is also useful to have + wvWare installed as it may be + be used as a fallback for some files which + antiword does not handle. + + MS Excel and PowerPoint are processed by + internal Python handlers. + + MS Open XML (docx) needs + xsltproc. + + Wordperfect files need wpd2html + from the libwpd (or + libwpd-tools on Ubuntu) + package. + + RTF files need unrtf, + which, in its older versions, has much trouble with + non-western character sets. Many Linux distributions carry + outdated unrtf versions. Check + &RCLAPPS; for details. + + TeX files need untex or + detex. Check &RCLAPPS; for sources if it's not + packaged for your distribution. + + dvi files need dvips. + + + djvu files need djvutxt and + djvused from the + DjVuLibre package. + + Audio files: &RCL; releases 1.14 and later use + a single Python handler based + on mutagen for all audio file + types. + + + Pictures: &RCL; uses the + Exiftool + Perl package to extract tag + information. Most image file formats are supported. Note that + there may not be much interest in indexing the technical tags + (image size, aperture, etc.). This is only of interest if you + store personal tags or textual descriptions inside the image + files. + + chm: files in Microsoft help format need Python and + the pychm module (which needs + chmlib). + + ICS: up to &RCL; 1.13, iCalendar files need + Python + and the icalendar + module. icalendar is not needed for newer + versions, which use internal code. + + Zip archives need Python + (and the standard zipfile module). + + Rar archives need + Python, the + rarfile Python module and the + unrar utility. + + Midi karaoke files need + Python and the + + Midi module + + + Konqueror webarchive format with Python (uses the + Tarfile module). + + Mimehtml web archive format (support based on + the email handler, which introduces some mild weirdness, but + still usable). + + + + Text, HTML, email folders, and Scribus files are + processed internally. Lyx is used to + index Lyx files. Many handlers need iconv and the + standard sed and awk. + + + + + + + Building from source + + + Prerequisites + + If you can install any or all of the following through + the package manager for your system, all the + better. Especially Qt is a very + big piece of software, but you will most probably be able to + find a binary package. + + You may have to compile &XAP; but this is easy. + + The shopping list: + + + The autoconf, + automake and libtool + triad. Only autoconf is needed up to &RCL; + 1.21. + + C++ compiler. Up to &RCL; version 1.13.04, + its absence can manifest itself by strange messages + about a missing iconv_open. + + + bison command (for &RCL; 1.21 + and later). + + + xsltproc command. For building + the documentation (for &RCL; 1.21 + and later). This sometimes comes with the + libxslt package. And also the Docbook XML and + style sheet files. + + + + Development files + for Xapian + core. + + If you are + building Xapian for an older CPU (before Pentium 4 or Athlon + 64), you need to add the flag + to the configure command. Else all Xapian application will + crash with an illegal instruction + error. + + + + + Development files for + + Qt 4 . &RCL; has not been + tested with Qt 5 yet. &RCL; 1.15.9 + was the last version to support Qt 3. + If you do not want to install or build + the Qt Webkit module, &RCL; + has a configuration option to disable its use (see further). + + + + + Development files for X11 and + zlib. + + + + Development files for Python (or use + --disable-python-module). + + + + You may also need + + libiconv. On Linux + systems, the iconv interface is part of libc and you should not + need to do anything special. + + + + + Check the + &RCL; download page for up to date version + information. + + + + + Building + + &RCL; has been built on Linux, FreeBSD, Mac OS X, and Solaris, + most versions after 2005 should be ok, maybe some older ones too + (Solaris 8 is ok). If you build on another system, and + need to modify things, + I would + very much welcome patches. + + + Configure options: + + + + + will disable the code for phonetic matching of search + terms. + + or + will enable the code for + real time indexing. Inotify support is enabled by default on + recent Linux systems. + + will + enable sending Zeitgeist + events about the visited search results, and needs + the qzeitgeist + package. + + is available + from version 1.17 to implement the result list with a + Qt QTextBrowser instead of a + WebKit widget if you do not or can't depend on the + latter. + + is available + from version 1.19 to suppress multithreading inside the + indexing process. You can also use the run-time + configuration to restrict recollindex + to using a single thread, but the compile-time option + may disable a few more unused locks. This only applies + to the use of multithreading for the core index + processing (data input). The &RCL; monitor mode always + uses at least two threads of execution. + + will + avoid building the Python + module. + + will prevent + fetching data from file extended attributes. Beyond a + few standard attributes, fetching extended attributes + data can only be useful is some application stores data + in there, and also needs some simple configuration (see + comments in the fields configuration + file). + + will enable + splitting camelCase words. This + is not enabled by default as it has the unfortunate + side-effect of making some phrase searches quite + confusing: ie, "MySQL manual" would be + matched by "MySQL manual" and + "my sql manual" but not "mysql + manual" (only inside phrase searches). + + + Specify + the version of the 'file' command to use (ie: + --with-file-command=/usr/local/bin/file). Can be useful to + enable the gnu version on systems where the native one is + bad. + + Disable the Qt + interface. Will allow building the indexer and the command line + search program in absence of a Qt environment. + + + Disable + X11 connection monitoring + inside recollindex. Together with --disable-qtgui, this + allows building recoll without + Qt and + X11. + + + will avoid building the user manual. This avoids having to + install the Docbook XML/XSL files and the TeX toolchain used for + translating the manual to PDF. + + (&RCL; versions up + to 1.21 only) will compile + &RCL; with position-dependant code. This is incompatible with + building the KIO or the Python + or PHP extensions, but might + yield very marginally faster code. + + Of course the usual + autoconf configure + options, like apply. + + + + + + Normal procedure (for source extracted from a tar + distribution): + + cd recoll-xxx + ./configure + make + (practices usual hardship-repelling invocations) + + + When building from source cloned from the BitBucket repository, + you also need to install autoconf, + automake, and + libtool and you must execute sh + autogen.sh in the top source directory before running + configure. + + + Building on Solaris + + We did not test building the GUI on Solaris for recent + versions. You will need at least Qt 4.4. There are some hints + on an old + web site page, they may still be valid. + + Someone did test the 1.19 indexer and Python module build, + they do work, with a few minor glitches. Be sure to use + GNU make and install. + + + + + + Installation + + Either type make install or execute + recollinstall + prefix, in the root + of the source tree. This will copy the commands to + prefix/bin + and the sample configuration files, scripts and other shared + data to + prefix/share/recoll. + If the installation prefix given to + recollinstall is different from either the + system default or the value which was + specified when executing configure (as in + configure --prefix /some/path), you + will have to set the RECOLL_DATADIR + environment variable to indicate where the shared data is to + be found (ie for (ba)sh: + export RECOLL_DATADIR=/some/path/share/recoll). + + + You can then proceed to configuration. + + + + + + Configuration overview + + Most of the parameters specific to the + recoll GUI are set through the + Preferences menu and stored in the standard Qt + place ($HOME/.config/Recoll.org/recoll.conf). + You probably do not want to edit this by hand. + + &RCL; indexing options are set inside text configuration + files located in a configuration directory. There can be + several such directories, each of which defines the parameters + for one index. + + The configuration files can be edited by hand or through + the Index configuration dialog + (Preferences menu). The GUI tool will try + to respect your formatting and comments as much as possible, + so it is quite possible to use both ways. + + The most accurate documentation for the + configuration parameters is given by comments inside the default + files, and we will just give a general overview here. + + By default, for each index, there are two sets of + configuration files. System-wide configuration files are kept + in a directory named + like /usr/[local/]share/recoll/examples, + and define default values, shared by all indexes. For each + index, a parallel set of files defines the customized + parameters. + + In addition (as of &RCL; version 1.19.7), it is possible + to specify two additional configuration directories which will + be stacked before and after the user configuration + directory. These are defined by + the RECOLL_CONFTOP + and RECOLL_CONFMID environment + variables. Values from configuration files inside the top + directory will override user ones, values from configuration + files inside the middle directory will override system ones + and be overriden by user ones. These two variables may be of + use to applications which augment &RCL; functionality, and + need to add configuration data without disturbing the user's + files. Please note that the two, currently single, values will + probably be interpreted as colon-separated lists in the + future: do not use colon characters inside the directory + paths. + + The default location of the configuration is the + .recoll + directory in your home. Most people will only use this + directory. + + This location can be changed, or others can be added with the + RECOLL_CONFDIR environment variable or the + option parameter to recoll and + recollindex. + + If the .recoll directory does not + exist when recoll or + recollindex are started, it will be created + with a set of empty configuration files. + recoll will give you a chance to edit the + configuration file before starting + indexing. recollindex will proceed + immediately. To avoid mistakes, the automatic directory + creation will only occur for the + default location, not if or + RECOLL_CONFDIR were used (in the latter + cases, you will have to create the directory). + + + All configuration files share the same format. For + example, a short extract of the main configuration file might + look as follows: + + # Space-separated list of directories to index. + topdirs = ~/docs /usr/share/doc + + [~/somedirectory-with-utf8-txt-files] + defaultcharset = utf-8 + + + There are three kinds of lines: + + Comment (starts with + #) or empty. + + Parameter affectation (name = + value). + + Section definition + ([somedirname]). + + + + Depending on the type of configuration file, section + definitions either separate groups of parameters or allow + redefining some parameters for a directory sub-tree. They stay + in effect until another section definition, or the end of + file, is encountered. Some of the parameters used for indexing + are looked up hierarchically from the current directory + location upwards. Not all parameters can be meaningfully + redefined, this is specified for each in the next + section. + + When found at the beginning of a file path, the tilde + character (~) is expanded to the name of the user's home + directory, as a shell would do. + + White space is used for separation inside lists. + List elements with embedded spaces can be quoted using + double-quotes. + + + Encoding issues + Most of the configuration parameters are plain ASCII. Two + particular sets of values may cause encoding issues: + + + + File path parameters may contain non-ascii + characters and should use the exact same byte values as found in + the file system directory. Usually, this means that the + configuration file should use the system default locale + encoding. + + The unac_except_trans parameter + should be encoded in UTF-8. If your system locale is not UTF-8, and + you need to also specify non-ascii file paths, this poses a + difficulty because common text editors cannot handle multiple + encodings in a single file. In this relatively unlikely case, you + can edit the configuration file as two separate text files with + appropriate encodings, and concatenate them to create the complete + configuration. + + + + + + Environment variables + + + + RECOLL_CONFDIR + Defines the main configuration + directory. + + + + RECOLL_TMPDIR, TMPDIR + Locations for temporary files, in this order + of priority. The default if none of these is set is to use + /tmp. Big temporary files may be created + during indexing, mostly for decompressing, and also for + processing, e.g. email attachments. + + + + RECOLL_CONFTOP, RECOLL_CONFMID + Allow adding configuration directories with + priorities below and above the user directory (see above the + Configuration overview section for details). + + + + RECOLL_EXTRA_DBS, + RECOLL_ACTIVE_EXTRA_DBS + + Help for setting up external indexes. See this paragraph for + explanations. + + + + + RECOLL_DATADIR + Defines replacement for the default location + of Recoll data files, normally found in, e.g., + /usr/share/recoll). + + + + RECOLL_FILTERSDIR + Defines replacement for the default location + of Recoll filters, normally found in, e.g., + /usr/share/recoll/filters). + + + + ASPELL_PROG + aspell program to use for + creating the spelling dictionary. The result has to be + compatible with the libaspell which &RCL; + is using. + + + + VARNAME + Blabla + + + + + + + + The main configuration file, recoll.conf + + recoll.conf is the main + configuration file. It defines things like + what to index (top directories and things to ignore), and the + default character set to use for document types which do not + specify it internally. + + The default configuration will index your home + directory. If this is not appropriate, start + recoll to create a blank + configuration, click Cancel, and edit + the configuration file before restarting the command. This + will start the initial indexing, which may take some time. + + Most of the following parameters can be changed from the + Index Configuration menu in the + recoll interface. Some can only be set by + editing the configuration file. + + + Parameters affecting what documents we index: + + + + + topdirs + Specifies the list of directories or files to + index (recursively for directories). You can use symbolic links + as elements of this list. See the + followLinks option about following symbolic links + found under the top elements (not followed by default). + + + + skippedNames + + A space-separated list of wilcard patterns for + names of files or directories that should be completely + ignored. The list defined in the default file is: + +skippedNames = #* bin CVS Cache cache* caughtspam tmp .thumbnails .svn \ + *~ .beagle .git .hg .bzr loop.ps .xsession-errors \ + .recoll* xapiandb recollrc recoll.conf + + The list can be redefined at any sub-directory in the + indexed area. + The top-level directories are not affected by this + list (that is, a directory in topdirs + might match and would still be indexed). + The list in the default configuration does not + exclude hidden directories (names beginning with a + dot), which means that it may index quite a few things + that you do not want. On the other hand, email user + agents like thunderbird + usually store messages in hidden directories, and you + probably want this indexed. One possible solution is to + have .* in + skippedNames, and add things like + ~/.thunderbird or + ~/.evolution in + topdirs. + + Not even the file names are indexed for patterns + in this list. See the + noContentSuffixes variable for an alternative + approach which indexes the file names. + + + + noContentSuffixes + This is a list of file name endings (not + wildcard expressions, nor dot-delimited suffixes). Only the + names of matching files will be indexed (no attempt at MIME + type identification, no decompression, no content + indexing). This can be redefined for + subdirectories, and edited from the GUI. The default value is: + +noContentSuffixes = .md5 .map \ + .o .lib .dll .a .sys .exe .com \ + .mpp .mpt .vsd \ + .img .img.gz .img.bz2 .img.xz .image .image.gz .image.bz2 .image.xz \ + .dat .bak .rdf .log.gz .log .db .msf .pid \ + ,v ~ # + + + + + skippedPaths and + daemSkippedPaths + + A space-separated list of patterns for + paths of files or directories that should be skipped. + There is no default in the sample configuration file, + but the code always adds the configuration and database + directories in there. + skippedPaths is used both by + batch and real time + indexing. daemSkippedPaths can be + used to specify things that should be indexed at + startup, but not monitored. + Example of use for skipping text files only in a + specific directory: + +skippedPaths = ~/somedir/*.txt + + + + + + skippedPathsFnmPathname + The values in the + *skippedPaths variables are matched by + default with fnmatch(3), with the + FNM_PATHNAME flag. This means that '/' + characters must be matched explicitely. You can set + skippedPathsFnmPathname to 0 to disable + the use of FNM_PATHNAME (meaning that /*/dir3 will match + /dir1/dir2/dir3). + + + + + + zipSkippedNames + A space-separated list of patterns for + names of files or directories that should be ignored + inside zip archives. This is used directly by the zip + handler, and has a function similar to skippedNames, but + works independantly. Can be redefined for filesystem + subdirectories. For versions up to 1.19, you will need + to update the Zip handler and install a supplementary + Python module. The details are + described on + the &RCL; wiki. + + + + + followLinks + Specifies if the indexer should follow + symbolic links while walking the file tree. The default is + to ignore symbolic links to avoid multiple indexing of + linked files. No effort is made to avoid duplication when + this option is set to true. This option can be set + individually for each of the topdirs + members by using sections. It can not be changed below the + topdirs level. + + + + indexedmimetypes + &RCL; normally indexes any file which it + knows how to read. This list lets you restrict the indexed + MIME types to what you specify. If the variable is + unspecified or the list empty (the default), all supported + types are processed. Can be redefined for subdirectories. + + + + excludedmimetypes + This list lets you exclude some MIME types from + indexing. Can be redefined for subdirectories. + + + + compressedfilemaxkbs + Size limit for compressed (.gz or .bz2) + files. These need to be decompressed in a temporary + directory for identification, which can be very wasteful + if 'uninteresting' big compressed files are present. + Negative means no limit, 0 means no processing of any + compressed file. Defaults to -1. + + + + textfilemaxmbs + Maximum size for text files. Very big text + files are often uninteresting logs. Set to -1 to disable + (default 20MB). + + + + textfilepagekbs + If set to other than -1, text files will be + indexed as multiple documents of the given page size. This may + be useful if you do want to index very big text files as it + will both reduce memory usage at index time and help with + loading data to the preview window. A size of a few megabytes + would seem reasonable (default: 1MB). + + + + membermaxkbs + This defines the maximum size in kilobytes for + an archive member (zip, tar or rar at the moment). Bigger + entries will be skipped. + + + + indexallfilenames + &RCL; indexes file names in a special + section of the database to allow specific file names + searches using wild cards. This parameter decides if + file name indexing is performed only for files with MIME + types that would qualify them for full text indexing, or + for all files inside the selected subtrees, independently of + MIME type. + + + + usesystemfilecommand + Decide if we execute a system command + (file by default) + as a final step for determining the MIME type for a file + (the main procedure uses suffix associations as defined in + the mimemap file). This can be useful + for files with suffix-less names, but it will also cause + the indexing of many bogus "text" files. + + + + systemfilecommand + Command to use for mime for mime type + determination if usesystefilecommand is + set. Recent versions of xdg-mime sometimes + work better than file. + + + + processwebqueue + If this is set, process the directory where + Web browser plugins copy visited pages for indexing. + + + + webqueuedir + The path to the web indexing queue. This is + hard-coded in the Firefox plugin as + ~/.recollweb/ToIndex so there should be no + need to change it. + + + + + + + + Parameters affecting how we generate terms: + + Changing some of these parameters will imply a full + reindex. Also, when using multiple indexes, it may not make sense + to search indexes that don't share the values for these parameters, + because they usually affect both search and index operations. + + + + indexStripChars + Decide if we strip characters of diacritics and + convert them to lower-case before terms are indexed. If we + don't, searches sensitive to case and diacritics can be + performed, but the index will be bigger, and some marginal + weirdness may sometimes occur. The default is a stripped + index (indexStripChars = 1) for + now. When using multiple indexes for a search, + this parameter must be defined identically for + all. Changing the value implies an index reset. + + + + maxTermExpand + Maximum expansion count for a single term (e.g.: + when using wildcards). The default of 10000 is reasonable and + will avoid queries that appear frozen while the engine is + walking the term list. + + + + maxXapianClauses + Maximum number of elementary clauses we can add + to a single Xapian query. In some cases, the result of term + expansion can be multiplicative, and we want to avoid using + excessive memory. The default of 100 000 should be both + high enough in most cases and compatible with current + typical hardware configurations. + + + + nonumbers + If this set to true, no terms will be generated + for numbers. For example "123", "1.5e6", 192.168.1.4, would not + be indexed ("value123" would still be). Numbers are often quite + interesting to search for, and this should probably not be set + except for special situations, ie, scientific documents with huge + amounts of numbers in them. This can only be set for a whole + index, not for a subtree. + + + + dehyphenate + Determines if, given an input of + co-worker, we add a term for + coworker. This possibility is new in version + 1.22, and on by default. Setting the variable to off allows + restoring the previous behaviour. + + + + nocjk + If this set to true, specific east asian + (Chinese Korean Japanese) characters/word splitting is + turned off. This will save a small amount of cpu if you + have no CJK documents. If your document base does include + such text but you are not interested in searching it, + setting nocjk may be a significant time + and space saver. + + + + cjkngramlen + This lets you adjust the size of n-grams + used for indexing CJK text. The default value of 2 is + probably appropriate in most cases. A value of 3 would + allow more precision and efficiency on longer words, but + the index will be approximately twice as large. + + + + indexstemminglanguages + A list of languages for which the stem + expansion databases will be built. See + recollindex + 1 or use the + recollindex command + for possible values. You can add a stem expansion database + for a different language by using + recollindex , but it + will be deleted during the next indexing. Only languages + listed in the configuration file are permanent. + + + + defaultcharset + The name of the character set used for + files that do not contain a character set definition (ie: + plain text files). This can be redefined for any + sub-directory. If it is not set at all, the character set + used is the one defined by the nls environment ( + LC_ALL, LC_CTYPE, + LANG), or iso8859-1 + if nothing is set. + + + + unac_except_trans + This is a list of characters, encoded in UTF-8, + which should be handled specially when converting text to + unaccented lowercase. For example, in Swedish, the letter + a with diaeresis has full alphabet + citizenship and should not be turned into an + a. Each element in the space-separated list + has the special character as first element and the translation + following. The handling of both the lowercase and upper-case + versions of a character should be specified, as appartenance to + the list will turn-off both standard accent and case + processing. Example for Swedish: + +unac_except_trans = åå Åå ää Ää öö Öö + + + Note that the translation is not limited to a single + character, you could very well have something like + üue in the list. + + The default value set for + unac_except_trans can't be listed here + because I have trouble with SGML and UTF-8, but it only + contains ligature decompositions: german ss, oe, ae, fi, + fl. + + This parameter can't be defined for subdirectories, it + is global, because there is no way to do otherwise when + querying. If you have document sets which would need different + values, you will have to index and query them separately. + + + + maildefcharset + This can be used to define the default + character set specifically for email messages which don't + specify it. This is mainly useful for readpst (libpst) dumps, + which are utf-8 but do not say so. + + + + localfields + This allows setting fields for all documents + under a given directory. Typical usage would be to set an + "rclaptg" field, to be used in mimeview to + select a specific viewer. If several fields are to be set, they + should be separated with a semi-colon (';') character, which there + is currently no way to escape. Also note the initial semi-colon. + Example: + localfields= ;rclaptg=gnus;other = val, then + select specifier viewer with + mimetype|tag=... in + mimeview. + + + + testmodifusemtime + If true, use mtime instead of default ctime to + determine if a file has been modified (in addition to + size, which is always used). Setting this can reduce + re-indexing on systems where extended attributes are + modified (by some other application), but not indexed + (changing extended attributes only affects + ctime). Notes: + + This may prevent detection of change + in some marginal file rename cases (the target would + need to have the same size and + mtime). + You should probably also set + noxattrfields to 1 in this case, except if you still + prefer to perform xattr indexing, for example if the + local file update pattern makes it of value (as in + general, there is a risk for pure extended attributes + updates without file modification to go + undetected). + + Perform a full index reset after changing the value of + this parameter. + + + + noxattrfields + Recoll versions 1.19 and later + automatically translate file extended attributes into + document fields (to be processed according to the + parameters from the fields + file). Setting this variable to 1 will disable the + behaviour. + + + + metadatacmds + This allows executing external commands + for each file and storing the output in &RCL; document + fields. This could be used for example to index + external tag data. The value is a list of field names + and commands, don't forget an initial + semi-colon. Example: + +[/some/area/of/the/fs] +metadatacmds = ; tags = tmsu tags %f; otherfield = somecmd -xx %f + + As a specially disgusting hack brought by + &RCL; 1.19.7, if a "field name" begins + with rclmulti, the data returned by + the command is expected to contain multiple field + values, in configuration file format. This allows + setting several fields by executing a single + command. Example: + +metadatacmds = ; rclmulti1 = somecmd %f + + If somecmd returns data in the form + of: + +field1 = value1 +field2 = value for field2 + + field1 + and field2 will be set inside the + document metadata. + + + + + + + + + + Parameters affecting where and how we store things: + + + dbdir + The name of the Xapian data directory. It + will be created if needed when the index is + initialized. If this is not an absolute path, it will be + interpreted relative to the configuration directory. The + value can have embedded spaces but starting or trailing + spaces will be trimmed. You cannot use quotes here. + + + + idxstatusfile + The name of the scratch file where the indexer + process updates its status. Default: + idxstatus.txt inside the configuration + directory. + + + + maxfsoccuppc + Maximum file system occupation before we + stop indexing. The value is a percentage, corresponding to + what the "Capacity" df output column shows. The default + value is 0, meaning no checking. + + + + mboxcachedir + The directory where mbox message offsets cache + files are held. This is normally $RECOLL_CONFDIR/mboxcache, but + it may be useful to share a directory between different + configurations. + + + + mboxcacheminmbs + The minimum mbox file size over which we + cache the offsets. There is really no sense in caching + offsets for small files. The default is 5 MB. + + + + webcachedir + This is only used by the web browser + plugin indexing code, and defines where the cache for visited + pages will live. Default: + $RECOLL_CONFDIR/webcache + + + + webcachemaxmbs + This is only used by the web browser + plugin indexing code, and defines the maximum size for the web + page cache. Default: 40 MB. Quite unfortunately, this is only + taken into account when creating the cache file. You need to + delete the file for a change to be taken into account. + + + + + idxflushmb + Threshold (megabytes of new text data) where we + flush from memory to disk index. Setting this can help control + memory usage. A value of 0 means no explicit flushing, letting + Xapian use its own default, which is flushing every 10000 (or + XAPIAN_FLUSH_THRESHOLD) documents, which gives little memory + usage control, as memory usage also depends on average document + size. The default value is 10, and it is probably a bit low. If + your system usually has free memory, you can try higher values + between 20 and 80. In my experience, values beyond 100 are + always counterproductive. + + + + + + + + Parameters affecting multithread processing + + The &RCL; indexing process + recollindex can use multiple threads to + speed up indexing on multiprocessor systems. The work done + to index files is divided in several stages and some of the + stages can be executed by multiple threads. The stages are: + + File system walking: this is always performed by + the main thread. + File conversion and data extraction. + Text processing (splitting, stemming, + etc.) + &XAP; index update. + + + You can also read a + + longer document about the transformation of + &RCL; indexing to multithreading. + + The threads configuration is controlled by two + configuration file parameters. + + + + thrQSizes + This variable defines the job input queues + configuration. There are three possible queues for + stages 2, 3 and 4, and this parameter should give the + queue depth for each stage (three integer values). If + a value of -1 is used for a given stage, no queue is + used, and the thread will go on performing the next + stage. In practise, deep queues have not been shown to + increase performance. A value of 0 for the first queue + tells &RCL; to perform autoconfiguration (no need for + the two other values in this case) - this is the + default configuration. + + + + thrTCounts + This defines the number of threads used + for each stage. If a value of -1 is used for one of + the queue depths, the corresponding thread count is + ignored. It makes no sense to use a value other than 1 + for the last stage because updating the &XAP; index is + necessarily single-threaded (and protected by a + mutex). + + + + + + The following example would use three queues (of depth 2), + and 4 threads for converting source documents, 2 for + processing their text, and one to update the index. This was + tested to be the best configuration on the test system + (quadri-processor with multiple disks). + +thrQSizes = 2 2 2 +thrTCounts = 4 2 1 + + + + The following example would use a single queue, and the + complete processing for each document would be performed by + a single thread (several documents will still be processed + in parallel in most cases). The threads will use mutual + exclusion when entering the index update stage. In practise + the performance would be close to the precedent case in + general, but worse in certain cases (e.g. a Zip archive + would be performed purely sequentially), so the previous + approach is preferred. YMMV... The 2 last values for + thrTCounts are ignored. + +thrQSizes = 2 -1 -1 +thrTCounts = 6 1 1 + + + + The following example would disable + multithreading. Indexing will be performed by a single + thread. + +thrQSizes = -1 -1 -1 + + + + + + + Miscellaneous parameters: + + + + autodiacsens + IF the index is not stripped, decide if we + automatically trigger diacritics sensitivity if the search + term has accented characters (not in + unac_except_trans). Else you need to use + the query language and the D modifier to + specify diacritics sensitivity. Default is no. + + + + autocasesens + IF the index is not stripped, decide if we + automatically trigger character case sensitivity if the + search term has upper-case characters in any but the first + position. Else you need to use the query language and the + C modifier to specify character-case + sensitivity. Default is yes. + + + + loglevel,daemloglevel + Verbosity level for recoll and + recollindex. A value of 4 lists quite a lot of + debug/information messages. 2 only lists errors. The + daemversion is specific to the indexing monitor + daemon. + + + + logfilename, + daemlogfilename + Where the messages should go. 'stderr' can + be used as a special value, and is the default. The + daemversion is specific to the indexing monitor + daemon. + + + + checkneedretryindexscript + This defines the name for a command + executed by recollindex when starting + indexing. If the exit status of the command is 0, + recollindex retries to index all files + which previously could not be indexed because of data + extraction errors. The default value is a script which + checks if any of the common bin + directories have changed (indicating that a helper program + may have been installed). + + + + mondelaypatterns + This allows specify wildcard path patterns + (processed with fnmatch(3) with 0 flag), to match files which + change too often and for which a delay should be observed before + re-indexing. This is a space-separated list, each entry being a + pattern and a time in seconds, separated by a colon. You can + use double quotes if a path entry contains white + space. Example: + +mondelaypatterns = *.log:20 "this one has spaces*:10" + + + + + monixinterval + Minimum interval (seconds) for processing the + indexing queue. The real time monitor does not process each + event when it comes in, but will wait this time for the queue + to accumulate to diminish overhead and in order to aggregate + multiple events to the same file. Default 30 S. + + + + monauxinterval + Period (in seconds) at which the real time + monitor will regenerate the auxiliary databases (spelling, + stemming) if needed. The default is one hour. + + + + monioniceclass, monioniceclassdata + These allow defining the + ionice class and data used by the + indexer (default class 3, no data). + + + + filtermaxseconds + Maximum handler execution time, after which it + is aborted. Some postscript programs just loop... + + + + filtermaxmbytes + &RCL; 1.20.7 and later. Maximum handler memory + utilisation. This uses setrlimit(RLIMIT_AS) on most systems + (total virtual memory space size limit). Some programs may start + with 500 MBytes of mapped shared libraries, so take this into + account when choosing a value. The default is a liberal + 2000MB. + + + + filtersdir + A directory to search for the external + input handler scripts used to index some types of files. The + value should not be changed, except if you want to modify + one of the default scripts. The value can be redefined for + any sub-directory. + + + + iconsdir + The name of the directory where + recoll result list icons are + stored. You can change this if you want different + images. + + + + idxabsmlen + &RCL; stores an abstract for each indexed + file inside the database. The text can come from an actual + 'abstract' section in the document or will just be the + beginning of the document. It is stored in the index so + that it can be displayed inside the result lists without + decoding the original + file. The idxabsmlen parameter defines + the size of the stored abstract. The default value is 250 bytes. + The search interface gives you the choice to display this + stored text or a synthetic abstract built by extracting + text around the search terms. If you always + prefer the synthetic abstract, you can reduce this value + and save a little space. + + + + + idxmetastoredlen + Maximum stored length for metadata + fields. This does not affect indexing (the whole field is + processed anyway), just the amount of data stored in the + index for the purpose of displaying fields inside result + lists or previews. The default value is 150 bytes which + may be too low if you have custom fields. + + + + aspellLanguage + Language definitions to use when creating + the aspell dictionary. The value must match a set of + aspell language definition files. You can type "aspell + config" to see where these are installed (look for + data-dir). The default if the variable is not set is to + use your desktop national language environment to guess + the value. + + + + noaspell + If this is set, the aspell dictionary + generation is turned off. Useful for cases where you don't + need the functionality or when it is unusable because + aspell crashes during dictionary generation. + + + + mhmboxquirks + This allows definining location-related quirks + for the mailbox handler. Currently only the + tbird flag is defined, and it should be set + for directories which hold + Thunderbird data, as their folder + format is weird. + + + + + + + + + + The fields file + + This file contains information about dynamic fields handling + in &RCL;. Some very basic fields have hard-wired behaviour, + and, mostly, you should not change the original data inside the + fields file. But you can create custom fields + fitting your data and handle them just like they were native + ones. + + The fields file has several sections, + which each define an aspect of fields processing. Quite often, + you'll have to modify several sections to obtain the desired + behaviour. + + We will only give a short description here, you should refer + to the comments inside the default file for more detailed + information. + + Field names should be lowercase alphabetic ASCII. + + + + + [prefixes] + A field becomes indexed (searchable) by having + a prefix defined in this section. + + + + [stored] + A field becomes stored (displayable inside + results) by having its name listed in this section (typically + with an empty value). + + + + [aliases] + This section defines lists of synonyms for the + canonical names used inside the [prefixes] + and [stored] sections + + + + [queryaliases] + This section also defines aliases for the + canonic field names, with the difference that the substitution + will only be used at query time, avoiding any possibility that + the value would pick-up random metadata from documents. + + + + handler-specific sections + Some input handlers may need specific + configuration for handling fields. Only the email message handler + currently has such a section (named + [mail]). It allows indexing arbitrary email + headers in addition to the ones indexed by default. Other such + sections may appear in the future. + + + + + + Here follows a small example of a personal + fields + file. This would extract a specific email header and + use it as a searchable field, with data displayable inside result + lists. (Side note: as the email handler does no decoding on the values, + only plain ascii headers can be indexed, and only the + first occurrence will be used for headers that occur several times). + +[prefixes] +# Index mailmytag contents (with the given prefix) +mailmytag = XMTAG + +[stored] +# Store mailmytag inside the document data record (so that it can be +# displayed - as %(mailmytag) - in result lists). +mailmytag = + +[queryaliases] +filename = fn +containerfilename = cfn + +[mail] +# Extract the X-My-Tag mail header, and use it internally with the +# mailmytag field name +x-my-tag = mailmytag + + + + + + Extended attributes in the fields file + + &RCL; versions 1.19 and later process user extended + file attributes as documents fields by default. + + Attributes are processed as fields of the same name, + after removing the user prefix on + Linux. + + The [xattrtofields] + section of the fields file allows + specifying translations from extended attributes names to + &RCL; field names. An empty translation disables use of the + corresponding attribute data. + + + + + + + The mimemap file + + mimemap specifies the + file name extension to MIME type mappings. + + For file names without an extension, or with an unknown + one, the system's file + command will be + executed to determine the MIME type (this can be switched off + inside the main configuration file). + + The mappings can be specified on a per-subtree basis, + which may be useful in some cases. Example: + gaim logs have a + .txt extension but + should be handled specially, which is possible because they + are usually all located in one place. + + The recoll_noindex + mimemap variable has been moved to + recoll.conf and renamed to + noContentSuffixes, while keeping the same + function, as of &RCL; version 1.21. For older &RCL; versions, + see the documentation for noContentSuffixes + but use recoll_noindex in + mimemap. + + + + + The mimeconf file + + mimeconf specifies how the + different MIME types are handled for indexing, and which icons + are displayed in the recoll result lists. + + Changing the parameters in the [index] section is + probably not a good idea except if you are a &RCL; + developer. + + The [icons] section allows you to change the icons which + are displayed by recoll in the result + lists (the values are the basenames of the png images inside + the iconsdir directory (specified in + recoll.conf). + + + + + The mimeview file + + mimeview specifies which programs + are started when you click on an Open link + in a result list. Ie: HTML is normally displayed using + firefox, but you may prefer + Konqueror, your + openoffice.org + program might be named oofice instead of + openoffice etc. + + Changes to this file can be done by direct editing, or + through the recoll GUI preferences dialog. + + If Use desktop preferences to choose document + editor is checked in the &RCL; GUI preferences, all + mimeview entries will be ignored except the + one labelled application/x-all (which is set to + use xdg-open by default). + + In this case, the xallexcepts top level + variable defines a list of MIME type exceptions which + will be processed according to the local entries instead of being + passed to the desktop. This is so that specific &RCL; options + such as a page number or a search string can be passed to + applications that support them, such as the + evince viewer. + + As for the other configuration files, the normal usage + is to have a mimeview inside your own + configuration directory, with just the non-default entries, + which will override those from the central configuration + file. + + All viewer definition entries must be placed under a + [view] section. + + The keys in the file are normally MIME types. You can add an + application tag to specialize the choice for an area of the + filesystem (using a localfields specification + in mimeconf). The syntax for the key is +mimetype|tag + + The nouncompforviewmts entry, (placed at + the top level, outside of the [view] section), + holds a list of MIME types that should not be uncompressed before + starting the viewer (if they are found compressed, ie: + mydoc.doc.gz). + + The right side of each assignment holds a command to be + executed for opening the file. The following substitutions are + performed: + + + + %D + Document date + + + %f + File name. This may be the name of a temporary file if + it was necessary to create one (ie: to extract a subdocument + from a container). + + + %i + Internal path, for subdocuments of containers. The + format depends on the container type. If this appears in the + command line, &RCL; will not create a temporary file to + extract the subdocument, expecting the called application + (possibly a script) to be able to handle it. + + + %M + MIME type + + + %p + Page index. Only significant for a subset of document + types, currently only PDF, Postscript and DVI files. Can be + used to start the editor at the right page for a match or + snippet. + + + %s + Search term. The value will only be set for documents + with indexed page numbers (ie: PDF). The value will be one of + the matched search terms. It would allow pre-setting the + value in the "Find" entry inside Evince for example, for easy + highlighting of the term. + + + %u + Url. + + + + In addition to the predefined values above, all strings like + %(fieldname) will be replaced by the value of + the field named fieldname for the + document. This could be used in combination with field + customisation to help with opening the document. + + + + + The <filename>ptrans</filename> file + + ptrans specifies query-time path + translations. These can be useful + in multiple + cases. + The file has a section for any index which needs + translations, either the main one or additional query + indexes. The sections are named with the &XAP; index + directory names. No slash character should exist at the end + of the paths (all comparisons are textual). An exemple + should make things sufficiently clear + + + [/home/me/.recoll/xapiandb] + /this/directory/moved = /to/this/place + + [/path/to/additional/xapiandb] + /server/volume1/docdir = /net/server/volume1/docdir + /server/volume2/docdir = /net/server/volume2/docdir + + + + + + + Examples of configuration adjustments + + + Adding an external viewer for an non-indexed type + + Imagine that you have some kind of file which does not + have indexable content, but for which you would like to have a + functional Open link in the result list + (when found by file name). The file names end in + .blob and can be displayed by + application blobviewer. + + You need two entries in the configuration files for this + to work: + + + In $RECOLL_CONFDIR/mimemap + (typically ~/.recoll/mimemap), add the + following line: +.blob = application/x-blobapp + + Note that the MIME type is made up here, and you could + call it diesel/oil just the + same. + + In $RECOLL_CONFDIR/mimeview + under the [view] section, add: + +application/x-blobapp = blobviewer %f + + We are supposing + that blobviewer wants a file + name parameter here, you would use %u if + it liked URLs better. + + + + If you just wanted to change the application used by + &RCL; to display a MIME type which it already knows, you + would just need to edit mimeview. The + entries you add in your personal file override those in the + central configuration, which you do not need to + alter. mimeview can also be modified + from the Gui. + + + + + Adding indexing support for a new file type + + Let us now imagine that the above + .blob files actually contain + indexable text and that you know how to extract it with a + command line program. Getting &RCL; to index the files is + easy. You need to perform the above alteration, and also to + add data to the mimeconf file + (typically in ~/.recoll/mimeconf): + + Under the [index] + section, add the following line (more about the + rclblob indexing script + later): +application/x-blobapp = exec rclblob + + + Under the [icons] + section, you should choose an icon to be displayed for the + files inside the result lists. Icons are normally 64x64 + pixels PNG files which live in + /usr/[local/]share/recoll/images. + + Under the [categories] + section, you should add the MIME type where it makes sense + (you can also create a category). Categories may be used + for filtering in advanced search. + + + + The rclblob handler should + be an executable program or script which exists inside + /usr/[local/]share/recoll/filters. It + will be given a file name as argument and should output the + text or html contents on the standard output. + + The filter + programming section describes in more detail how + to write an input handler. + + + + + + + + + +
+ diff --git a/src/filters/injectcommon.sh b/src/filters/injectcommon.sh new file mode 100755 index 00000000..50bc3d45 --- /dev/null +++ b/src/filters/injectcommon.sh @@ -0,0 +1,15 @@ +#!/bin/sh +fatal() +{ + echo $* + exit 1 +} + +commoncode=recfiltcommon +test -f recfiltcommon || fatal must be executed inside the filters directory + +for filter in rcl* ; do +sed -e '/^#RECFILTCOMMONCODE/r recfiltcommon +/^#RECFILTCOMMONCODE/,/^#ENDRECFILTCOMMONCODE/d +' < $filter > filtertmp && mv -f filtertmp $filter && chmod a+x $filter +done diff --git a/src/filters/msodump.zip b/src/filters/msodump.zip new file mode 100644 index 0000000000000000000000000000000000000000..a1b6d9e61de90398da24afdb46f46058bb2100af GIT binary patch literal 115355 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

?yk#q~gA4hde99$K68uwj?fL~lthwX>p{PpAlz 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

ZBIB%R@j=3xzXgodTDVwo4 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 literal 0 HcmV?d00001 diff --git a/src/filters/ppt-dump.py b/src/filters/ppt-dump.py new file mode 100755 index 00000000..f05a5789 --- /dev/null +++ b/src/filters/ppt-dump.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +import sys, os.path, getopt +sys.path.append(sys.path[0]+"/msodump.zip") +from msodumper import ole, pptstream, globals, olestream +from msodumper.globals import error + +def usage (exname): + exname = os.path.basename(exname) + msg = """Usage: %s [options] [ppt file] + +Options: + --help displays this help message. + --no-struct-output suppress normal structure analysis output + --dump-text extract and print the textual content + --no-raw-dumps suppress raw hex dumps of uninterpreted areas + --id-select=id1[,id2 ...] limit output to selected record Ids +""" % exname + print msg + + +class PPTDumper(object): + + def __init__ (self, filepath, params): + self.filepath = filepath + self.params = params + + def __printDirHeader (self, dirname, byteLen): + dirname = globals.encodeName(dirname) + globals.outputln("") + globals.outputln("="*68) + globals.outputln("%s (size: %d bytes)"%(dirname, byteLen)) + globals.outputln("-"*68) + + def dump (self): + file = open(self.filepath, 'rb') + strm = pptstream.PPTFile(file.read(), self.params) + file.close() + strm.printStreamInfo() + strm.printHeader() + strm.printDirectory() + dirnames = strm.getDirectoryNames() + result = True + for dirname in dirnames: + if len(dirname) == 0 or dirname == 'Root Entry': + continue + + try: + dirstrm = strm.getDirectoryStreamByName(dirname) + except Exception, err: + error("getDirectoryStreamByName(%s): %s - %s\n" % (dirname,str(err),self.filepath)) + # The previous version was killed by the exception + # here, so the equivalent is to break, but maybe there + # is no reason to do so. + break + self.__printDirHeader(dirname, len(dirstrm.bytes)) + if dirname == "PowerPoint Document": + if not self.__readSubStream(dirstrm): + result = False + elif dirname == "Current User": + if not self.__readSubStream(dirstrm): + result = False + elif dirname == "\x05DocumentSummaryInformation": + strm = olestream.PropertySetStream(dirstrm.bytes) + strm.read() + else: + globals.dumpBytes(dirstrm.bytes, 512) + return result + + def __readSubStream (self, strm): + # read all records in substream + return strm.readRecords() + + +def main (args): + exname, args = args[0], args[1:] + if len(args) < 1: + print("takes at least one argument") + usage(exname) + return + + try: + opts, args = getopt.getopt(args, "h", + ["help", "debug", "show-sector-chain", + "no-struct-output", "dump-text", + "id-select=", "no-raw-dumps"]) + for opt, arg in opts: + if opt in ['-h', '--help']: + usage(exname) + return + elif opt in ['--debug']: + globals.params.debug = True + elif opt in ['--show-sector-chain']: + globals.params.showSectorChain = True + elif opt in ['--no-struct-output']: + globals.params.noStructOutput = True + elif opt in ['--dump-text']: + globals.params.dumpText = True + elif opt in ['--no-raw-dumps']: + globals.params.noRawDumps = True + elif opt in ['--id-select']: + globals.params.dumpedIds = arg.split(",") + globals.params.dumpedIds = \ + set([int(val) for val in globals.params.dumpedIds if val]) + else: + error("unknown option %s\n"%opt) + usage() + + except getopt.GetoptError: + error("error parsing input options\n") + usage(exname) + return false + + status = True + try: + dumper = PPTDumper(args[0], globals.params) + if not dumper.dump(): + error("ppt-dump: dump error " + args[0] + "\n") + status = False + except: + error("ppt-dump: FAILURE (bad format?) " + args[0] + "\n") + status = False + + if globals.params.dumpText: + print(globals.textdump.replace("\r", "\n")) + return(status) + +if __name__ == '__main__': + if main(sys.argv): + sys.exit(0) + else: + sys.exit(1) + +# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: diff --git a/src/filters/rcl7z b/src/filters/rcl7z new file mode 100755 index 00000000..c7ea935d --- /dev/null +++ b/src/filters/rcl7z @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +# 7-Zip file filter for Recoll + +# Thanks to Recoll user Martin Ziegler +# This is a modified version of rclzip, with some help from rcltar +# Python pylzma library required. See http://www.joachim-bauch.de/projects/pylzma/ + +import sys +import os +import fnmatch +import rclexecm + +try: + import pylzma + from py7zlib import Archive7z +except: + print "RECFILTERROR HELPERNOTFOUND python:pylzma" + sys.exit(1); + +try: + from recoll import rclconfig + hasrclconfig = True +except: + hasrclconfig = False +# As a temporary measure, we also look for rclconfig as a bare +# module. This is so that the intermediate releases of the filter can +# ship and use rclconfig.py with the filter code +if not hasrclconfig: + try: + import rclconfig + hasrclconfig = True + except: + pass + +class SevenZipExtractor: + def __init__(self, em): + self.currentindex = 0 + self.em = em + + def extractone(self, ipath): + #self.em.rclog("extractone: [%s]" % ipath) + docdata = "" + try: + docdata = self.sevenzip.getmember(ipath).read() + ok = True + except Exception, err: + self.em.rclog("extractone: failed: [%s]" % err) + ok = False + iseof = rclexecm.RclExecM.noteof + if self.currentindex >= len(self.sevenzip.getnames()) -1: + iseof = rclexecm.RclExecM.eofnext + if isinstance(ipath, unicode): + ipath = ipath.encode("utf-8") + return (ok, docdata, ipath, iseof) + + ###### File type handler api, used by rclexecm ----------> + def openfile(self, params): + filename = params["filename:"] + self.currentindex = -1 + self.skiplist = [] + + if hasrclconfig: + config = rclconfig.RclConfig() + config.setKeyDir(os.path.dirname(filename)) + skipped = config.getConfParam("zipSkippedNames") + if skipped is not None: + self.skiplist = skipped.split(" ") + + try: + fp = open(filename, 'rb') + self.sevenzip = Archive7z(fp) + return True + except Exception, err: + self.em.rclog("openfile: failed: [%s]" % err) + return False + + def getipath(self, params): + ipath = params["ipath:"] + ok, data, ipath, eof = self.extractone(ipath) + if ok: + return (ok, data, ipath, eof) + # Not found. Maybe we need to decode the path? + try: + ipath = ipath.decode("utf-8") + return self.extractone(ipath) + except Exception, err: + return (ok, data, ipath, eof) + + def getnext(self, params): + if self.currentindex == -1: + # Return "self" doc + self.currentindex = 0 + self.em.setmimetype('text/plain') + if len(self.sevenzip.getnames()) == 0: + eof = rclexecm.RclExecM.eofnext + else: + eof = rclexecm.RclExecM.noteof + return (True, "", "", eof) + + if self.currentindex >= len(self.sevenzip.getnames()): + #self.em.rclog("getnext: EOF hit") + return (False, "", "", rclexecm.RclExecM.eofnow) + else: + entryname = self.sevenzip.getnames()[self.currentindex] + + if hasrclconfig and len(self.skiplist) != 0: + while self.currentindex < len(self.sevenzip.getnames()): + entryname = self.sevenzip.getnames()[self.currentindex] + for pat in self.skiplist: + if fnmatch.fnmatch(entryname, pat): + entryname = None + break + if entryname is not None: + break + self.currentindex += 1 + if entryname is None: + return (False, "", "", rclexecm.RclExecM.eofnow) + + ret= self.extractone(entryname) + self.currentindex += 1 + return ret + +# Main program: create protocol handler and extractor and run them +proto = rclexecm.RclExecM() +extract = SevenZipExtractor(proto) +rclexecm.main(proto, extract) diff --git a/src/filters/rclabw b/src/filters/rclabw new file mode 100755 index 00000000..f07f0dce --- /dev/null +++ b/src/filters/rclabw @@ -0,0 +1,179 @@ +#!/bin/sh +# @(#$Id: rclabw,v 1.3 2008-10-08 08:27:34 dockes Exp $ (C) 2004 J.F.Dockes +# Parts taken from Estraier: +#================================================================ +# Estraier: a personal full-text search system +# Copyright (C) 2003-2004 Mikio Hirabayashi +#================================================================ +#================================================================ +# Extract text from an abiword file +#================================================================ + +# set variables +LANG=C ; export LANG +LC_ALL=C ; export LC_ALL +progname="rclabw" +filetype=abiword + + +#RECFILTCOMMONCODE +############################################################################## +# !! Leave the previous line unmodified!! Code imported from the +# recfiltcommon file + +# Utility code common to all shell filters. This could be sourced at run +# time, but it's slightly more efficient to include the code in the +# filters at build time (with a sed script). + +# Describe error in a way that can be interpreted by our caller +senderror() +{ + echo RECFILTERROR $* + # Also alert on stderr just in case + echo ":2:$progname::: $*" 1>&2 + exit 1 +} + +iscmd() +{ + cmd=$1 + case $cmd in + */*) + if test -x $cmd -a ! -d $cmd ; then return 0; else return 1; fi ;; + *) + oldifs=$IFS; IFS=":"; set -- $PATH; IFS=$oldifs + for d in $*;do test -x $d/$cmd -a ! -d $d/$cmd && return 0;done + return 1 ;; + esac +} + +checkcmds() +{ + for cmd in $*;do + if iscmd $cmd + then + a=1 + else + senderror HELPERNOTFOUND $cmd + fi + done +} + +# show help message +if test $# -ne 1 -o "$1" = "--help" +then + echo "Convert a $filetype file to HTML text for Recoll indexing." + echo "Usage: $progname [infile]" + exit 1 +fi + +infile="$1" + +# check the input file existence (may be '-' for stdin) +if test "X$infile" != X- -a ! -f "$infile" +then + senderror INPUTNOSUCHFILE "$infile" +fi + +# protect access to our temp files and directories +umask 77 + +############################################################################## +# !! Leave the following line unmodified ! +#ENDRECFILTCOMMONCODE + +checkcmds xsltproc + +xsltproc --nonet --novalid - "$infile" < + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + +

+ +
+ + + + + + + author + + + + + + + + + keywords + + + + + + + + + keywords + + + + + + + + + abstract + + + + + + + + <xsl:value-of select="."/> + + + + + + + + + +EOF + +# exit normally +exit 0 diff --git a/src/filters/rclaptosidman b/src/filters/rclaptosidman new file mode 100755 index 00000000..661329b7 --- /dev/null +++ b/src/filters/rclaptosidman @@ -0,0 +1,93 @@ +#!/bin/sh +# @(#$Id: rclaptosidman,v 1.1 2010-12-11 12:40:05 dockes Exp $ (C) 2004 J.F.Dockes +# Parts taken from Estraier: +#================================================================ +# Estraier: a personal full-text search system +# Copyright (C) 2003-2004 Mikio Hirabayashi +#================================================================ +#================================================================ +# rclaptosidman +# Strip the menu part from aptosid manual pages to improve search precision +#================================================================ + +# set variables +LANG=C ; export LANG +LC_ALL=C ; export LC_ALL +progname="rclaptosidman" +filetype="aptosid manual htm" + + +#RECFILTCOMMONCODE +############################################################################## +# !! Leave the previous line unmodified!! Code imported from the +# recfiltcommon file + +# Utility code common to all shell filters. This could be sourced at run +# time, but it's slightly more efficient to include the code in the +# filters at build time (with a sed script). + +# Describe error in a way that can be interpreted by our caller +senderror() +{ + echo RECFILTERROR $* + # Also alert on stderr just in case + echo ":2:$progname::: $*" 1>&2 + exit 1 +} + +iscmd() +{ + cmd=$1 + case $cmd in + */*) + if test -x $cmd -a ! -d $cmd ; then return 0; else return 1; fi ;; + *) + oldifs=$IFS; IFS=":"; set -- $PATH; IFS=$oldifs + for d in $*;do test -x $d/$cmd -a ! -d $d/$cmd && return 0;done + return 1 ;; + esac +} + +checkcmds() +{ + for cmd in $*;do + if iscmd $cmd + then + a=1 + else + senderror HELPERNOTFOUND $cmd + fi + done +} + +# show help message +if test $# -ne 1 -o "$1" = "--help" +then + echo "Convert a $filetype file to HTML text for Recoll indexing." + echo "Usage: $progname [infile]" + exit 1 +fi + +infile="$1" + +# check the input file existence (may be '-' for stdin) +if test "X$infile" != X- -a ! -f "$infile" +then + senderror INPUTNOSUCHFILE "$infile" +fi + +# protect access to our temp files and directories +umask 77 + +############################################################################## +# !! Leave the following line unmodified ! +#ENDRECFILTCOMMONCODE + +checkcmds sed +# Delete everything from